我正在开发一个名为Mite的 Perl 模块。它是一种“编译器”。您使用类似 Moose 的声明式 OO 语法编写 Perl 类。Mite 不是在每次执行时都将类放在一起,而是在构建时完成这项工作。它会生成一个额外的文件,其中包含用于访问器和继承等的 Perl 代码。
这个额外的文件与您的其余代码一起放入lib
并与您的项目一起发布。因此,安装用户无需安装 Mite,代码加载速度更快。
在开发过程中,mite 编译器在运行时运行make
或Build
运行。所以事情就像make test
和./Build test
只是工作。这是通过使用MakeMaker或Module::Build的特殊垫片来完成的。
这适用于 Module::Build,但 ExtUtils::MakeMaker 看不到 mite 文件。lib
MakeMaker 对运行时的内容列表进行硬编码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 年,没能解决这个问题。)