首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用perlbrew和local::lib?

同时使用perlbrew和local::lib?
EN

Stack Overflow用户
提问于 2011-03-27 14:21:01
回答 5查看 5.7K关注 0票数 22

到目前为止,我一直在使用system perl (在Ubuntu10.10上),并使用local::lib在我的私有目录~/perl5中安装CPAN模块

当我尝试使用perlbrew时,他们似乎并不了解对方。我使用perlbrew安装了perl-5.12.3,但是当我使用perlbrew使用perl-5.12.3切换到perl-5.12.3时,我仍然看到由local::lib设置的PERL5LIB和PERL_MM_OPT。

这并不好:

代码语言:javascript
复制
$ cpan XML::Simple
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/perl: symbol lookup error: /home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Cwd/Cwd.so: undefined symbol: Perl_Gthr_key_ptr

代码语言:javascript
复制
$ which cpan
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/cpan

因此,它使用的是正确版本的cpan客户端,但由于PERL5LIB环境变量,它从错误的位置获取模块。

perlbrew是否具有某些兼容模式,或者我是否需要手动关闭PERL5LIB和PERL_MM_OPT?

EN

回答 5

Stack Overflow用户

发布于 2011-03-28 10:57:33

自从我开始使用perlbrew以来,我不再使用local::lib作为外壳使用,因为现在我有了自己的perl,我对所有东西都有写权限,只需安装到site_perl就更简单了,这允许我为每个perl使用不同版本的模块。

我仍然使用local::lib (或者更具体地说,自动设置local::lib目录的cpanm的-l或-L选项)来将特定于应用程序的依赖项保存在应用程序目录中。

票数 17
EN

Stack Overflow用户

发布于 2011-03-27 15:53:30

local::lib不是为同时安装多个Perl版本而设计的。纯Perl模块通常不是问题,但是XS模块不能跨主要版本兼容。

对于纯Perl模块,您可以继续使用local::lib (这样就不必为您准备好的每个Perl版本都安装它们,但XS模块应该安装到perlbrew-created目录中。不需要清除PERL5LIB (也不应该清除,因为XS模块可能有安装在那里的纯Perl依赖项),但是在安装XS模块时需要清除PERL_MB_OPTPERL_MM_OPT,以防止它们安装到本地::lib目录中。

如果您需要继续为system Perl的XS模块使用local::lib,那么我建议为此创建另一个local::lib环境(可能在~/perl5sys中)。使用perlbrew安装与系统Perl相同版本的Perl副本,然后使用该版本而不是系统Perl,可能会更容易一些。

您可以通过删除/home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi目录来清除现有本地::lib中的XS模块。

票数 11
EN

Stack Overflow用户

发布于 2011-05-18 04:57:56

这是可能的,但并不舒服。如果这是一个单用户设置,那么最好不要使用local::lib,而是让perlbrew为您管理模块。此外,如果这是一个同构网络上的多用户设置,其中每个人都有相同的机器和操作系统,那么您只需将PERLBREW_ROOT设置为例如/net/share/perlbrew,然后您安装的perls (及其模块)就可以共享。正如在其他答案中指出的,如果您尝试混合机器,这将是一个问题(如果您有不同的操作系统,也可能会出现问题)。

在一个非常多样化的网络中,我们更喜欢保持一切独立。您可以简单地将您的local::lib设置为当前perl和当前平台的函数。

代码语言:javascript
复制
distro=lsb_release -d|cut -f2|tr ' ' '-'
arch=`uname -m`
platform="$distro-$arch"

export PERLBREW_ROOT=/net/share/perlbrew/$platform
# You will have to first do 'perlbrew init' (just once for all users)
# In this case you don't need (and shouldn't have) a ~/.perlbrew
source $PERLBREW_ROOT/etc/bashrc

perl5base=/net/share/perl
# When $PERLBREW_PERL is not defined, local::lib puts modules in $perl5base/$platform
perl5=$perl5base/$platform/$PERLBREW_PERL

# We also found that we needed to clean PERL5LIB in between
export PERL5LIB=`echo -n $PERL5LIB|sed "s|${perl5base}[^:]*||g"`
export PATH=`echo -n $PATH|sed "s|${perl5base}[^:]*||g"`

# Setup local lib, relative to the perl being used
lib=$perl5/lib/perl5
mkdir -p $lib
eval $(perl -I"$lib" -Mlocal::lib="$perl5")

这不是我们的确切脚本,特别是您需要首先检查这些目录是否都存在。您需要在每个平台上运行一次perlbrew init,并且每次都需要引导local::lib。

我不推荐这种方法,但提供了一种方法的示例,它适用于我们的混合网络(甚至在Mac上)。不使用local::lib而只使用perlbrew (忽略系统perl)将是一种更简洁的方法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5447595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档