【问题标题】:Perl on Mac OS 10.10 Yosemite with strange @INC path带有奇怪 @INC 路径的 Mac OS 10.10 Yosemite 上的 Perl
【发布时间】:2015-01-01 08:00:36
【问题描述】:

升级到 OS 10.10 后,我不得不再次安装所有以前使用的 perl 模块。没问题。我想。

OS 10.10 上的 Perl 是“这是为 darwin-thread-multi-2level 构建的 perl 5,版本 16,subversion 3 (v5.16.3)”(来自 perl --version)。 @INC 看起来是(尝试 perl -e 'print join("\n", @INC);' 或 perl -V):

/opt/local/lib/perl5/site_perl/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/site_perl/5.16.3 /opt/local/lib/perl5/vendor_perl/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/vendor_perl/5.16.3 /opt/local/lib/perl5/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/5.16.3 /opt/local/lib/perl5/site_perl /opt/local/lib/perl5/vendor_perl

当我尝试使用未知模块时,perl 会抛出: “无法在 @INC 中找到 Mymodule.pm ...然后:@INC 包含:... /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl /5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 和所有其他已知的(并添加了 5.18 perl.pm 文件夹)。 每个 perl 开发人员都知道该消息。 但从字面上看:@INC 显然链接到 5.18 文件夹!乍一看,我应该使用 Perl 5.18。

我从 Macports 安装了我的第一批新模块。 5.18 端口文件。并将新的模块路径添加到列表 /Library/Perl/5.18/AppendToPath。工作得很好。 但是,当我使用 cpan 安装一个模块(在 Macports 中不作为 5.18 提供)时,我遇到了麻烦。该模块是用 5.16 编译的(当然,见上文)并且不被接受为 AppendToPath 文件中的其他路径。 Dynaloader 不匹配。

我不知道@INC 列表在运行时在哪里更改。在早期的 Mac OS 10 版本中,新的 @INC 包含相同版本的模块版本。 IE。一个活动的 perl 5.14 还包括 5.14 模块,5.12 包括 5.12 路径 a.s.o。 为什么 Yosemite 上的 perl 5.16 包含 5.18 模块路径?


在我的帖子之后添加一些混乱: 当我尝试在程序代码中打印 $^V 时,我得到 5.18。 这意味着,你没有得到你想要得到的东西。可能是我的 shebang #!/usr/bin/perl 开始于 5.18 而不是 5.16。

【问题讨论】:

  • 检查您对 PERL5LIB 或 PERLLIB 环境变量的设置(echo $PERL5LIB 等)。
  • 如果可能的话,我会使用 Perlbrew。与系统或 MacPorts Perl 混用总是很麻烦的。
  • 我当然已经检查过了。两者都是空的。注意,我编辑了我的帖子。 perl --version 的问题与 shebang 开头的含义有些不同。
  • 我想知道这里发生了什么的原因。 shebang 确实在 /usr/bin 中调用了 perl bin。问题“which perl”显示 /opt/local/bin/perl(perl 5.16 的符号链接)。 /usr/bin/perl 显然是 perl 5.18。我必须将我的 cpan 配置为使用 5.18。谢谢朋友的cmets。

标签: perl osx-yosemite


【解决方案1】:

经验丰富的 Perl 开发人员会告诉您忽略系统 perl。如果你升级它,你需要一个错误修复,你冒着破坏你的操作系统的风险。如果您升级操作系统,修改后的系统 perl 可能会破坏您的代码。

Macports 和 homebrew 都很棒,但对于 Perl 来说并不理想。我会从我的 PATH 甚至我的系统中清除 /opt/local/version。

帮自己一个大忙。使用Command Line Tools 安装Xcode。安装perlbrew。卷起你自己的 perl。哎呀,卷起 6 个你自己的 perl 并在它们之间来回跳转。保留一个线程版本,以备不时之需。保持一个非线程的速度。最重要的是,每当您更改所使用的版本时,perlbrew 都会为您正确更新您的环境。不要大惊小怪,不要大惊小怪。

【讨论】:

    【解决方案2】:

    已解决

    OS Yosemite 作为 Maverick 的更新提供 perl 5.16 5.18。 在测试which perl时,你会得到/opt/local/bin/perl,这是一个指向/opt/local/bin/perl5.16的符号链接。

    当您在 perl 程序中使用#!/usr/bin/perl作为标准 shebang(可移植到 Linux)时,您将使用另一个 perl 版本运行该程序,因为#!/usr/bin/perl 确实作为 5.18 版本的二进制文件存在。

    当您使用 cpan / cpanm (cpanminus) 轻松快速地安装新模块时,您将获得编译为 5.16 版本的模块。因为这被假定为标准路径/版本(见上文)。

    您会在/opt/local/libexec/perl5.16/sitebin/ 找到cpanm 您还会找到 /opt/local/libexec/perl5.18/,但没有 sitebin 和 cpanm。

    现在: 在/opt/local/libexec/perl5.18/ 中创建一个文件夹sitebin 并将文件/opt/local/libexec/perl5.16/sitebin/cpanm 复制到/opt/local/libexec/perl5.18/sitebin/(使用sudo ...获取权限)。

    cpanm 是一个普通的 perl 程序文件,独立于版本 - 但请注意这个文件的 shebang!打开文件并编辑前两行

    #!/opt/local/bin/perl5.16 
    eval 'exec /opt/local/bin/perl5.16  -S $0 ${1+"$@"}'
    

    #!/opt/local/bin/perl5.18 
    eval 'exec /opt/local/bin/perl5.18  -S $0 ${1+"$@"}'
    

    这意味着:只需将 5.16 更改为 5.18。就是这样。

    现在您可以使用这个新的 cpanm 安装新模块。 新的 cpanm 将在 /opt/local/lib/perl5/site_perl/5.18/darwin-thread-multi-2level/ 中部署模块。要让新路径知道 Mac 上的 perl 5.18,请编辑文件 /Library/perl/5.18/AppendToPath 并在新行后面添加 /opt/local/lib/perl5/site_perl/5.18/darwin-thread-multi-2level(末尾不带斜线)。

    就是这样。

    【讨论】:

    • /opt/local/bin/perl 不是 Yosemite 的一部分。它可能是旧的 Macports 安装遗留下来的。我会完全放弃它,或者至少将它从我的路径中删除......
    • 我想,这是 Maverick 或 Mountain Lion 的遗言
    • 如果是,我也会在我的 Mac 上安装它。我的赌注仍在 Macports 上。
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2016-05-16
    • 2014-12-24
    • 2014-07-24
    相关资源
    最近更新 更多