MakeMaker在`make`时更新其文件列表

Sch*_*ern 5 perl makemaker

我正在研究名为Mite的Perl模块.它是一种"编译器",各种各样.您使用类似Moose的声明性OO语法编写Perl类.Mite不是在每次执行时都将所有工作放在一起,而是在构建时完成这项工作.它会生成一个额外的文件,其中包含用于访问器和继承的Perl代码以及诸如此类的东西.

这个额外的文件将lib与您的其余代码一起使用,并随您的项目一起发布.因此,安装用户无需安装Mite,代码加载速度更快.

在开发过程中,当螨运行编译器makeBuild运行.所以像make test./Build test公正的工作.这是通过为MakeMakerModule :: 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年,但未能解决这个问题.)

Sch*_*ern 1

我最终添加了一个新目标并pm_to_blib依赖它。新目标只是将所有.pm文件从移动lib/blib/lib/。冗余应该不重要。

我对这个解决方案并不满意,但它似乎有效。

https://github.com/evalEmpire/Mite/commit/feff24e4d68e062a06a721591ff0d785c5dad80b