【问题标题】:How do I use a dependency on a Perl module installed in a non-standard location?如何使用对安装在非标准位置的 Perl 模块的依赖项?
【发布时间】:2011-03-05 06:13:13
【问题描述】:

我需要在网络主机上安装两个 Perl 模块。我们称它们为 A::B 和 X::Y。 X::Y 取决于 A::B (需要 A::B 运行)。他们都使用Module::Install。我已使用

成功地将 A::B 安装到非系统位置
perl Makefile.PL PREFIX=/non/system/location
make; make test; make install

现在我想安装 X::Y,所以我尝试同样的事情

perl Makefile.PL PREFIX=/non/system/location

输出是

$ perl Makefile.PL PREFIX=/non/system/location/
Cannot determine perl version info from lib/X/Y.pm
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- Test::More          ...loaded. (0.94)
- ExtUtils::MakeMaker ...loaded. (6.54 >= 6.11)
- File::ShareDir      ...loaded. (1.00)
- A::B                ...missing.
==> Auto-install the 1 mandatory module(s) from CPAN? [y] 

它似乎在系统中找不到 A::B,尽管它已安装,并且当它尝试从 CPAN 自动安装模块时,它尝试将其写入系统目录(忽略 PREFIX)。我曾尝试在PREFIX=... 之后在命令行上使用PERL_LIBLIB 等变量,但我所做的一切似乎都不起作用。

makemake install 可以成功,但由于这个问题,我不能make test。有什么建议吗?

我在 http://servers.digitaldaze.com/extensions/perl/modules.html 找到了一些使用环境变量 PERL5LIB 的建议,但这似乎也不起作用:

export PERL5LIB=/non/system/location/lib/perl5/

没有解决问题。

【问题讨论】:

    标签: perl perl-module


    【解决方案1】:

    答案是local::lib,但你可能是already know that :)

    【讨论】:

    • local::lib 在这里看起来是一个不错的解决方案,但它涉及另一个依赖项,并且它没有安装在 Web 主机上。
    • 如果您无法将更多库安装到标准位置,您可以将 local::lib 引导到自身中。
    【解决方案2】:

    好的,以下处方做到了:

    perl Makefile.PL --skipdeps --no-manpages PREFIX=/non/system/location INSTALLSITELIB=/non/system/location/lib INSTALLSITEBIN=/non/system/location/bin INSTALLMAN1DIR=/non/system/location/man/man1 INSTALLMAN3DIR=/non/system/location/man/man3
    

    这只是“猴子看猴子做”,但现在make test 有效。

    • 此处的 --skipdeps 选项抑制了 Module::Install 的便利功能/令人恼火的问题,它尝试使用 CPAN.pm 下载缺失的模块。
    • --no-manpages 应该会阻止它安装手册页,但它不起作用。

    【讨论】:

      【解决方案3】:

      因为这是我认为我会根据我的经验更新的顶部链接(这需要一段时间才能开始工作,因此更新了 7 年前的帖子)。

      第一次运行perl -le 'print join $/, @INC'

      添加(注意,最后没有 / !!) export PERL5LIB=/nonstddir/scripts/modules/lib/site_perl:/nonstddir/scripts/modules/lib

      运行perl -le 'print join $/, @INC' 确保添加了新目录。这使它工作。如果您在路径末尾添加 /,则 INC 条目看起来很奇怪且错误。我的中间有一个//。

      完成工作后,我的看起来像

      /nonstddir/scripts/modules/lib/site_perl/5.8.4/sun4-solaris-64int
      /nonstddir/scripts/modules/lib/site_perl/5.8.4
      /nonstddir/scripts/modules/lib/site_perl
      /nonstddir/scripts/modules/lib/sun4-solaris-64int
      /nonstddir/scripts/modules/lib
      /usr/perl5/5.8.4/lib/sun4-solaris-64int
      /usr/perl5/5.8.4/lib
      /usr/perl5/site_perl/5.8.4/sun4-solaris-64int
      /usr/perl5/site_perl/5.8.4
      /usr/perl5/site_perl
      /usr/perl5/vendor_perl/5.8.4/sun4-solaris-64int
      /usr/perl5/vendor_perl/5.8.4
      /usr/perl5/vendor_perl
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-07
        • 2014-11-09
        • 2013-11-29
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        相关资源
        最近更新 更多