sza*_*gab 22 perl perlbrew locallib
到目前为止,我一直在使用系统perl(在Ubuntu 10.10上),我使用local :: lib在我的私人目录中安装CPAN模块〜/ perl5
当我试图使用perlbrew时,似乎他们彼此不了解.我使用perlbrew安装了perl-5.12.3但是当我使用perlbrew使用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
Run Code Online (Sandbox Code Playgroud)
而
$ which cpan
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/cpan
Run Code Online (Sandbox Code Playgroud)
所以它正在使用正确版本的cpan客户端,但是由于PERL5LIB环境变量,它会从错误的位置获取模块.
perlbrew是否具有某种兼容性模式,还是需要手动关闭PERL5LIB和PERL_MM_OPT?
miy*_*awa 17
自从我开始使用perlbrew后,我停止使用local :: lib进行shell使用,因为现在我拥有自己的perl,我对所有内容都有写权限,只需安装到site_perl就更简单了,这样我就有了不同的版本每个perl的模块.
我仍然使用local :: lib(或更具体地说,cpanm的-l或-L选项自动设置local :: lib目录)来保持应用程序特定的依赖关系在应用程序目录中.
cjm*_*cjm 10
local :: lib的设计不适用于同时安装的多个Perl版本.Pure-Perl模块通常不是问题,但XS模块在主要版本中不兼容.
您可以继续使用本地:: lib中纯Perl模块(所以你不必安装它们对Perl的每个版本已酿造了,但XS模块应安装到perlbrew -created目录,你再也需要清除PERL5LIB(并且您不应该,因为XS模块可能具有安装在那里的纯Perl依赖项),但是您需要清除PERL_MB_OPT
并PERL_MM_OPT
在安装XS模块时将它们安装到local :: lib目录中.
如果你需要为系统Perl继续使用local :: lib for XS模块,那么我建议为它创建第二个local :: lib环境(可能在~/perl5sys
).使用perlbrew可能更容易安装与Perl系统相同版本的Perl的副本,然后使用它而不是系统Perl.
您可以通过删除/home/gabor/perl5/lib/perl5/x86_64-linux-gnu-thread-multi
目录来清除现有local :: lib中的XS模块.
这是可能的,但不舒服.如果这是单用户设置,最好不要使用local::lib
,只需让perlbrew为您管理模块.此外,如果它是同构网络上的多用户设置,每个人都拥有相同的机器和操作系统,那么您可以设置PERLBREW_ROOT
为eg /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")
Run Code Online (Sandbox Code Playgroud)
这不是我们确切的脚本,特别是您需要检查这些目录是否都存在.您需要为每个平台运行一次perlbrew init,并且每次都需要引导local :: lib.
我不推荐这种方法,但提供了一种实现这项工作的方法的例子,它为我们的混合网络(甚至在Mac OS上)做了.离开local :: lib并且只使用perlbrew(忽略系统perl),将是一种更清洁的方法.