perlbrew和local :: lib同时?

时间:2011-03-27 06:21:01

标签: 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

,而

$ which cpan
/home/gabor/perl5/perlbrew/perls/perl-5.12.3/bin/cpan

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

perlbrew是否有某种兼容模式,还是需要手动关闭PERL5LIB和PERL_MM_OPT?

4 个答案:

答案 0 :(得分:17)

由于我开始使用perlbrew,我停止使用local :: lib进行shell使用,因为现在我拥有自己的perl,我对所有内容都有写权限,只需安装到site_perl就更简单了,这让我可以每个perl都有不同版本的模块。

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

答案 1 :(得分:11)

local::lib不适用于同时安装的多个Perl版本。 Pure-Perl模块通常不是问题,但XS模块在主要版本中不兼容。

您可以继续将local :: lib用于pure-Perl模块(因此您不必为已经酿造的每个Perl版本安装它们,但是应该在perlbrew中安装XS模块创建目录。您不需要清除PERL5LIB(您不应该,因为XS模块可能具有安装在那里的纯Perl依赖项),但您需要清除PERL_MB_OPT和{{1}安装XS模块时,不要将它们安装到local :: lib目录中。

如果你需要为系统Perl继续使用local :: lib for XS模块,那么我建议为它创建第二个local :: lib环境(可能在PERL_MM_OPT中)。使用perlbrew可能更容易安装与Perl系统相同版本的Perl的副本,然后使用它而不是系统Perl。

您可以通过删除~/perl5sys目录来清除现有local :: lib中的XS模块。

答案 2 :(得分:5)

有可能,但不舒服。如果这是单用户设置,最好不要使用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 OS上)。离开local :: lib并且只使用perlbrew(忽略系统perl),这将是一种更清洁的方法。

答案 3 :(得分:2)

作为miyagawa said,如果您使用Perlbrew安装的Perls,则可能没有必要使用local :: lib。

但是如果你仍然希望能够在煮好的Perls和Perl系统之间来回切换,那么就有一个名为Perlswitcher的脚本。它不漂亮,但它的工作原理。您需要做的就是下载脚本,您可以将其保存为~/perl5/userperls/bashrc并获取源代码。

它提供了两个命令。 perlswitch允许您切换到Perlbrew安装的Perl或系统Perl。 perlinfo告诉您当前正在使用哪个Perl。然后,您可以使用cpanm,它将在使用Perl系统时将软件包安装到本地lib,或者在使用自定义Perl时直接安装到Perl站点。

使用perlswitch切换到自定义Perl后,perlbrew list也会知道正在使用哪个Perl:

$ perlswitch perl-5.18.4
Setting new perl /var/www/perl5/perlbrew/perls/perl-5.18.4/bin/perl...
Using user perl (site_perl) instead of local::lib
$ perlbrew list
  perl-5.16.3
* perl-5.18.4
  perl-5.20.2