Perl:Makefile.PL、File::ShareDir::Install、鸡和鸡蛋

Dac*_*cav 3 perl packaging

File::ShareDir::Install模块代表了一种使用 Perl 发行版/模块携带辅助文件的实用方法。然而,我对如何将它包含在我的项目的依赖项中感到有些困惑。

我试图在一台新机器上安装我的包(实际上是一个带有基本 OS + Perl + CPAN 的 docker 容器),但出现错误:

Can't locate File/ShareDir/Install.pm in @INC ... at Makefile.PL line 7.
Run Code Online (Sandbox Code Playgroud)

根据文档 ( perldoc File::ShareDir::Install),模式应该是,在我的Makefile.PL

use ExtUtils::MakeMaker;
use File::ShareDir::Install;

install_share 'share';
install_share dist => 'dist-share';
install_share module => 'My::Module' => 'other-share';

WriteMakefile( ... );       # As you normaly would

package MY;
use File::ShareDir::Install qw(postamble);
Run Code Online (Sandbox Code Playgroud)

但是,通过这样做,我需要File::ShareDir::Install在我的系统上预安装作为运行Makefile.PL脚本的要求。出于显而易见的原因,将其声明为依赖项是行不通的!

我应该指示我的用户File::ShareDir::Install在我的模块之前显式安装吗?是否有可能进行安装程序Makefile.PL,通过直接调用的CPAN模块?

cjm*_*cjm 5

这就是CONFIGURE_REQUIRES的用途:

在 6.52 及更高版本中可用。

运行 Makefile.PL 本身所需的模块散列,但不运行您的发行版。

这将进入您的 META.yml 的 configure_requires 字段和您的 META.json 的 prereqs 字段的配置。

{ "ExtUtils::MakeMaker" => 0 }如果未指定此属性,则默认为。

格式与 PREREQ_PM 相同。

所以你会添加到你的WriteMakefile参数中:

CONFIGURE_REQUIRES => {
  "ExtUtils::MakeMaker" => '6.52',
  "File::ShareDir::Install" => 0,
},
Run Code Online (Sandbox Code Playgroud)

然后人们使用cpancpanm安装模块将自动安装 File::ShareDir::Install。