我正在开发一个名为Mite的 Perl 模块。它是一种“编译器”。您使用类似 Moose 的声明式 OO 语法编写 Perl 类。Mite 不是在每次执行时都将类放在一起,而是在构建时完成这项工作。它会生成一个额外的文件,其中包含用于访问器和继承等的 Perl 代码。
这个额外的文件与您的其余代码一起放入lib并与您的项目一起发布。因此,安装用户无需安装 Mite,代码加载速度更快。
在开发过程中,mite 编译器在运行时运行make或Build运行。所以事情就像make test和./Build test只是工作。这是通过使用MakeMaker或Module::Build的特殊垫片来完成的。
这适用于 Module::Build,但 ExtUtils::MakeMaker 看不到 mite 文件。libMakeMaker 对运行时的内容列表进行硬编码Makefile.PL。然后,该pm_to_lib步骤无法将生成的文件复制到blib可以make test看到它们的位置。
我怎样才能最好地解决这个问题?我希望该过程对开发人员保持透明(一旦他们加载了适当的 shim),并且不需要安装用户的特殊依赖项。
更新:这是一个更清晰的例子。假设你有一个这样的项目。
Makefile.PL
lib/
Foo.pm
Bar.pm
Foo/
Thing.pm
t/
foo.t
bar.t
你跑perl Makefile.PL,然后make。该make步骤已修改为.mite.pm为每个文件生成一个额外的.pm文件。在这make一步之后,我想要的是这个。
Makefile.PL
Makefile
lib/
Foo.pm
Foo.pm.mite.pm
Bar.pm
Bar.pm.mite.pm
Foo/
Thing.pm
Thing.pm.mite.pm
blib/
lib/
Foo.pm
Foo.pm.mite.pm
Bar.pm
Bar.pm.mite.pm
Foo/
Thing.pm
Thing.pm.mite.pm
t/
foo.t
bar.t
引入的所有新文件lib都已复制到blib/lib它们可以被视为make test. 我得到的是这个。
Makefile.PL
Makefile
lib/
Foo.pm
Foo.pm.mite.pm
Bar.pm
Bar.pm.mite.pm
Foo/
Thing.pm
Thing.pm.mite.pm
blib/
lib/
Foo.pm
Bar.pm
Foo/
Thing.pm
t/
foo.t
bar.t
那是因为Makefile是通过Makefile.PL硬编码列表生成的lib。
(这特别傻,我维护了 MakeMaker 10 年,没能解决这个问题。)