22

到目前为止,我一直在使用系统 perl(在 Ubuntu 10.10 上)并且我使用 local::lib 在我的私有目录 ~/perl5 中安装 CPAN 模块

当我尝试使用 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

5 回答 5

17

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

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

于 2011-03-28T02:57:33.013 回答
11

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

您可以继续将 local::lib 用于纯 Perl 模块(因此您不必为您编写的每个 Perl 版本都安装它们,但是应该将 XS 模块安装到perlbrew创建的目录中。您不需要不需要清除 PERL5LIB(您不应该这样做,因为 XS 模块可能安装了纯 Perl 依赖项),但您需要在安装 XS 模块时清除PERL_MB_OPTPERL_MM_OPT防止它们安装到 local::lib 目录.

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

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

于 2011-03-27T07:53:29.700 回答
6

这是可能的,但不是很舒服。如果这是一个单用户设置,你最好不要使用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")

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

我不推荐这种方法,但作为一个例子来说明这种方法,它适用于我们的混合网络(即使在 Mac OS 上)。离开 local::lib 并仅使用 perlbrew(忽略系统 perl)将是一种更清洁的方法。

于 2011-05-17T20:57:56.280 回答
4

perlbrew 很高兴使用 local::lib 并且已经使用了一段时间——甚至还有一些特殊的选项——运行之后perlbrew install ...,你可以创建一个新的 local-lib 目录perlbrew lib create ...

例如:

perlbrew install -j 9 --as 34.0 5.34.0
chmod -R a-w $HOME/perl5/perlbrew/perls/34.0
perlbrew lib create 34.0@std
perlbrew switch 34.0@std

这会安装一个新的 5.34.0 版本,锁定它的模块以便您无法更改它们,然后创建一个 local-lib 目录。此安装可以与perlbrew use 34.0@std- 您可以通过 , 创建一组新的模块安装来perlbrew use 34.0; perlbrew lib create 34.0@other_install与现有的并排使用,而无需再次构建新的 perl。

于 2021-11-30T16:17:09.560 回答
3

正如宫川所说,如果您使用 Perlbrew 专门安装的 Perls,则可能不需要使用 local::lib。

但是,如果您仍然希望能够在您制作的 Perls 和系统 Perl 之间来回切换,有一个名为Perlswitcher的脚本可以实现此目的。它不漂亮,但它有效。您需要做的就是下载脚本,您可以将其另存为~/perl5/userperls/bashrc并获取它。

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

使用 切换到自定义 Perl 后perlswitchperlbrew 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
于 2015-11-14T16:41:31.650 回答