【问题标题】:Perl: Makefile.PL, File::ShareDir::Install, chicken and eggsPerl: Makefile.PL, File::ShareDir::Install, 鸡和蛋
【发布时间】:2016-04-15 14:48:42
【问题描述】:

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

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

Can't locate File/ShareDir/Install.pm in @INC ... at Makefile.PL line 7.

根据文档(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);

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

我应该指示我的用户在我的模块之前明确安装File::ShareDir::Install 吗?是否可以通过直接调用CPAN 模块以编程方式Makefile.PL 中安装它?

【问题讨论】:

  • 我最近用过它,它已经在那里了。但我不知道它放在那里的是什么。我知道它不在核心。

标签: perl packaging


【解决方案1】:

这就是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,
},

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

【讨论】:

    【解决方案2】:

    构建发行版

    1. 使File::ShareDir::Install 成为构建时依赖项。

      CONFIGURE_REQUIRES => {
         'ExtUtils::MakeMaker'     => '6.52',
         'File::ShareDir::Install' => 0,
      },    
      
    2. 在您将构建分发的机器上安装 File::ShareDir::Install。

    3. 构建发行版。

      这将创建一个 META.yml,其中包含 File::ShareDir::Install 作为构建时依赖项。

    安装分发版

    照常使用cpancpanmcpancpanm 将从 META.yml 提取构建时依赖项并在运行 Makefile.PL 之前安装它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 2017-03-08
      • 2017-06-25
      • 2014-08-20
      • 2013-10-20
      • 2017-05-29
      • 2013-05-22
      • 1970-01-01
      相关资源
      最近更新 更多