该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模块?
这就是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)
然后人们使用cpan或cpanm安装模块将自动安装 File::ShareDir::Install。