5

我正在开发一个名为Mite的 Perl 模块。它是一种“编译器”。您使用类似 Moose 的声明式 OO 语法编写 Perl 类。Mite 不是在每次执行时都将类放在一起,而是在构建时完成这项工作。它会生成一个额外的文件,其中包含用于访问器和继承等的 Perl 代码。

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

在开发过程中,mite 编译器在运行时运行makeBuild运行。所以事情就像make test./Build test只是工作。这是通过使用MakeMakerModule::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 年,没能解决这个问题。)

4

1 回答 1

1

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

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

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

于 2014-06-20T01:15:00.903 回答