Perl在Mac OS 10.10 Yosemite上有奇怪的@INC路径

时间:2014-11-05 07:39:57

标签: perl osx-yosemite

升级到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 /网络/库/ Perl / 5.18 / darwin-thread-multi-2level /Network/Library/Perl/5.18和所有其他已知的(并添加了5.18 perl.pm文件夹)。 每个perl dev都知道这条消息。 但字面意思是:@INC显然链接到5.18文件夹!乍一看我应该使用Perl 5.18。

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

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


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

2 个答案:

答案 0 :(得分:4)

经验丰富的Perl开发人员会告诉您忽略系统perl。如果您升级它,对于您需要的错误修正,您将面临破坏操作系统的风险。如果升级操作系统,修改后的系统perl可能会破坏您的代码。

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

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

答案 1 :(得分:3)

<强>解决

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的二进制文件。 / p>

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

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

现在: 在sitebin中创建文件夹/opt/local/libexec/perl5.18/并将文件/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的新行(末尾没有斜线)。

就是这样。