到目前为止,我一直在使用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。
这并不好:
$ 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而
$ which cpan
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/cpan因此,它使用的是正确版本的cpan客户端,但由于PERL5LIB环境变量,它从错误的位置获取模块。
perlbrew是否具有某些兼容模式,或者我是否需要手动关闭PERL5LIB和PERL_MM_OPT?
发布于 2011-03-28 10:57:33
自从我开始使用perlbrew以来,我不再使用local::lib作为外壳使用,因为现在我有了自己的perl,我对所有东西都有写权限,只需安装到site_perl就更简单了,这允许我为每个perl使用不同版本的模块。
我仍然使用local::lib (或者更具体地说,自动设置local::lib目录的cpanm的-l或-L选项)来将特定于应用程序的依赖项保存在应用程序目录中。
发布于 2011-03-27 15:53:30
local::lib不是为同时安装多个Perl版本而设计的。纯Perl模块通常不是问题,但是XS模块不能跨主要版本兼容。
对于纯Perl模块,您可以继续使用local::lib (这样就不必为您准备好的每个Perl版本都安装它们,但XS模块应该安装到perlbrew-created目录中。不需要清除PERL5LIB (也不应该清除,因为XS模块可能有安装在那里的纯Perl依赖项),但是在安装XS模块时需要清除PERL_MB_OPT和PERL_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模块。
发布于 2011-05-18 04:57:56
这是可能的,但并不舒服。如果这是一个单用户设置,那么最好不要使用local::lib,而是让perlbrew为您管理模块。此外,如果这是一个同构网络上的多用户设置,其中每个人都有相同的机器和操作系统,那么您只需将PERLBREW_ROOT设置为例如/net/share/perlbrew,然后您安装的perls (及其模块)就可以共享。正如在其他答案中指出的,如果您尝试混合机器,这将是一个问题(如果您有不同的操作系统,也可能会出现问题)。
在一个非常多样化的网络中,我们更喜欢保持一切独立。您可以简单地将您的local::lib设置为当前perl和当前平台的函数。
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)将是一种更简洁的方法。
https://stackoverflow.com/questions/5447595
复制相似问题