【问题标题】:perlbrew and local::lib at the same time?perlbrew 和 local::lib 同时?
【发布时间】:2021-12-01 00:17:09
【问题描述】:

到目前为止,我一直在使用系统 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?

【问题讨论】:

  • 这里的大多数答案都已经过时了。向下滚动查看当前信息。

标签: perl perlbrew locallib


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    您可以继续将 local::lib 用于纯 Perl 模块(因此您不必为您编写的每个 Perl 版本都安装它们,但 XS 模块应该安装到 perlbrew-created您不需要清除 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 模块。

    【讨论】:

    • 我想知道为什么人们推荐 INSTALL_BASE 而不是 PREFIX。 local::lib 有这个问题,因为它使用 INSTALL_BASE 而不是 PREFIX。
    【解决方案3】:

    这是可能的,但不是很舒服。如果这是单用户设置,最好不要使用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)将是一种更清洁的方法。

    【讨论】:

      【解决方案4】:

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

      例如:

      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。

      【讨论】:

        【解决方案5】:

        作为miyagawasaid,如果你只使用Perlbrew安装的Perls,可能不需要使用local::lib。

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

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

        【讨论】:

        • 是的!!!这正是我所需要的!我在使用 Debian 的系统 perl 时遇到问题,我无法用 perlbrew 完全重现,因此能够切换到系统 perl 并仍然使用 local::lib 安装依赖项很重要。该脚本使该过程变得轻松。谢谢!
        猜你喜欢
        • 2011-06-15
        • 2012-03-28
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 2022-12-08
        • 1970-01-01
        • 2014-10-01
        • 1970-01-01
        相关资源
        最近更新 更多