我正在研究名为Mite的Perl模块.它是一种"编译器",各种各样.您使用类似Moose的声明性OO语法编写Perl类.Mite不是在每次执行时都将所有工作放在一起,而是在构建时完成这项工作.它会生成一个额外的文件,其中包含用于访问器和继承的Perl代码以及诸如此类的东西.
这个额外的文件将lib与您的其余代码一起使用,并随您的项目一起发布.因此,安装用户无需安装Mite,代码加载速度更快.
在开发过程中,当螨运行编译器make或Build运行.所以像make test和./Build test公正的工作.这是通过为MakeMaker或Module :: Build使用特殊填充程序来实现的.
这适用于Module :: Build,但是ExtUtils :: MakeMaker没有看到mite文件.MakeMaker硬编码运行lib时的列表Makefile.PL.该pm_to_lib步则无法复制生成的文件到blib哪里make test都会看到他们.
我怎样才能最好地解决这个问题?我希望该过程对开发人员保持透明(一旦他们加载了适当的垫片),并且不需要安装用户的特殊依赖关系.
更新:这是一个更清晰的例子.假设您有一个这样的项目.
Makefile.PL
lib/
Foo.pm
Bar.pm
Foo/
Thing.pm
t/
foo.t
bar.t
Run Code Online (Sandbox Code Playgroud)
你跑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
Run Code Online (Sandbox Code Playgroud)
引入的所有新文件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
Run Code Online (Sandbox Code Playgroud)
那是因为它Makefile是由Makefile.PL一个硬编码列表生成的lib.
(这是特别愚蠢的,我维护MakeMaker 10年,但未能解决这个问题.)
我最终添加了一个新目标并pm_to_blib依赖它。新目标只是将所有.pm文件从移动lib/到blib/lib/。冗余应该不重要。
我对这个解决方案并不满意,但它似乎有效。
https://github.com/evalEmpire/Mite/commit/feff24e4d68e062a06a721591ff0d785c5dad80b
| 归档时间: |
|
| 查看次数: |
80 次 |
| 最近记录: |