【问题标题】:Force locally installed module to use locally installed dependencies强制本地安装的模块使用本地安装的依赖项
【发布时间】:2013-03-11 11:23:53
【问题描述】:

我正在开展一个项目,该项目需要将所有第三方(阅读:CPAN)perl 模块安装在 perforce 存储库中,以便任何依赖于它们的代码都可以成功运行,而无需其他任何人手动安装他们。我使用 cpanminus 安装我的 CPAN 模块,所以我在所需目录中运行 cpanm -L . Moose,一切都安装成功。但是,当我尝试编译使用 Moose 制作的模块时,有时会出现以下错误:

Undefined subroutine &Carp::longmess_heavy called at /usr/lib/perl5/5.8.8/Carp.pm line 235.

看起来,即使 Carp 已使用 Moose 安装到我的本地目录中,它仍在使用 /user/lib/perl5/5.8.8 中的(过时)版本。我可以在我的机器上升级 Carp,但是一旦我将我的代码检查到存储库中,其他所有拥有过时 Carp 的人都会遇到同样的问题。那么如何强制 Moose 使用本地安装的 Carp,而不是 /usr/lib/perl5/5.8.8 中的那个?

【问题讨论】:

    标签: perl dependencies perl-module cpan dependency-management


    【解决方案1】:

    你不强迫 Moose,你强迫perl。您已将模块安装在perl 不知道的位置,因此您需要告诉perl

    由于您想影响所有脚本,因此您希望将其放入您的登录脚本中。

    export PERL5LIB=/home/.../lib
    

    如果您只想影响那个程序,您可以使用以下命令启动该程序:

    PERL5LIB=/home/.../lib script
    

    或者您将以下内容添加到您的脚本中:

    use lib '/home/.../lib';
    

    【讨论】:

    • 这是正确的,但不是很便携。我建议使用 local::lib。 search.cpan.org/dist/local-lib/lib/local/…
    • @misplacedme, 1) local::lib 只是一个不可移植的。 (事实上​​,在登录脚本中使用是极其复杂的。) 2) local::lib 使用 INSTALL_BASE,我认为这是设计上的缺陷。
    • 我的立场是正确的。下次我需要这样做时,我会记住这一点。
    • 不幸的是,第一个选项不起作用,因为这需要项目中的每个人(我们中的很多人)手动更新他们的登录脚本。由于类似的原因,第二个选项不起作用……至于第三个选项,我已经在这样做了。好吧,更具体地说,我在这里使用该技术:stackoverflow.com/a/15307467/2124637
    • 如果你使用了这种技术,你就包含了错误的目录或者你做得太晚了(也许是因为你在一个模块中改变了@INC,这没有任何意义。)
    【解决方案2】:

    我设法找到了解决方案。这很混乱,但这是我加入一个已经有一个混乱系统的项目所必须付出的代价。

    在包含 Moose 之前,我必须明确要求新 Carp:

    require "[path to Carp]/Carp.pm";
    

    这产生了很多关于重新定义子程序的警告,所以我不得不(暂时)禁止它们:

    my $restore_warn = $SIG{'__WARN__'};
    $SIG{'__WARN__'} = sub {};
    require "[path to Carp]/Carp.pm";
    $SIG{'__WARN__'} = $restore_warn;
    

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 2021-09-20
      • 2018-02-02
      • 2017-04-08
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多