到目前为止,我一直在使用系统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?
我一直在使用local :: lib来处理服务器上Perl模块的安装,这样我就可以在不污染系统安装的情况下为一些开发工作获得正确的版本.
但是,系统管理员最近将Perl从5.16升级到5.18,我现在遇到与二进制模块有关的错误,例如
perl -e 'use Scalar::Util'
Perl API version v5.16.0 of List::Util does not match v5.18.0 at /usr/lib64/perl5/5.18.2/XSLoader.pm line 92.
Compilation failed in require at /home/paul/perl5/lib/perl5/x86_64-linux/Scalar/Util.pm line 11.
Compilation failed in require at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
Run Code Online (Sandbox Code Playgroud)
我的理解是我可以通过强制local :: lib来重建它的所有模块来修复这个问题,但我在文档中找不到任何告诉我如何做到这一点的内容,甚至找不到如何获取所有模块的列表.使用local :: lib安装的模块(如果我在"每行一个模块"文本文件中有这个模块,我可以轻松编写一个Bash脚本来处理它).
这是可能的,还是我必须删除〜/ perl5目录并从头开始重新安装所有模块(可能会遗漏一些,因为我不记得它们全部)?
我不明白use local::lib常规use lib不是什么.有人可以解释一下吗?
我最近建立了一个新系统,并希望安装Padre来检查它.Padre安装说明专门说安装local :: lib,所以我这样做了(虽然我之前从未需要它).然后我继续安装其他几个模块,从我的普通用户帐户运行CPAN,sudo以处理安装所需的根部分.
然后,时间来测试这些模块需要支持的其中一个网络应用程序,而且,看哪,apache找不到它们.他们从命令行加载得很好,快速查看~/perl5确认我怀疑local :: lib劫持了我的CPAN会话并在那里安装了这些模块,而不是在站点范围内安装,尽管我的CPAN配置包括
makepl_arg [INSTALLDIRS=site]
mbuildpl_arg [--installdirs site]
Run Code Online (Sandbox Code Playgroud)
我需要对CPAN配置做什么,以便即使安装了local :: lib,也可以在站点范围内安装模块?或者Padre会在没有它的情况下工作,我可以完全删除local :: lib吗?
(我不希望安装任何模块,~/perl5除非Padre坚持他们在那里.我开发的代码有自己的项目特定的目录位置,其他一切都应该是站点范围的.我不需要私有的catch-all位置. )
我没有对系统的root访问权限,所以我使用local :: lib安装perl模块,我使用bootstrapping方法安装它:
perl Makefile.PL --bootstrap=~/foo
make test && make install
echo '[ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"' >>~/.bash_profile
Run Code Online (Sandbox Code Playgroud)
然后我成功安装了cpanm并使用cpanm来安装模块FAST.但是,当我尝试使用fasgrep函数时,我收到以下错误:
% fasgrep
Can't locate FAST.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at /home/dpearton/perl5/bin/fasgrep line 5.
Run Code Online (Sandbox Code Playgroud)
我已经检查过FAST.pm在本地lib中是可用的,但系统似乎并没有在那里寻找它.
根据路径变量,它应该在正确的位置寻找:
$ echo PATH=$PATH ; env|sort|grep PERL
PERL5LIB=/home/dpearton/perl5/lib/perl5:/home/dpearton/perl5/lib/perl5
PERLBREW_BASHRC_VERSION=0.73
PERLBREW_HOME=/home/dpearton/.perlbrew
PERLBREW_ROOT=/home/dpearton/perl5/perlbrew
PERL_LOCAL_LIB_ROOT=/home/dpearton/perl5
PERL_MB_OPT=--install_base "/home/dpearton/perl5"
PERL_MM_OPT=INSTALL_BASE=/home/dpearton/perl5
Run Code Online (Sandbox Code Playgroud)
我甚至将导出PER5LIB = $ HOME/perl5/lib/perl5添加到我的.bash_profile中它仍然无效.
我很擅长使用perl.问题可能是我还安装了perlbrew吗?如果是这样,我怎样才能对prelbrew进行"干净"的卸载?
我已经完成了两个cpan模块的源检查:A和B.
模块A和B都是开发人员版本.
B依赖于A.
我的问题是如何在不安装A的情况下在B上工作.
(我已经安装了旧版本的A)
我想停用环境变量并从@INC中删除附加的/ home/myusername/perl5 ..目录,这些目录是Local :: Lib的结果.任何人都可以建议吗?我真的想在Local :: Lib之前回到perl ENV vars和@INC文件夹的状态.我在Fedora 16上.
我们的系统管理员最近升级了我的操作系统和perl(到5.12.3).当我加载local :: lib环境变量时,它似乎打破了依赖于xs的任何东西:
demianshell~> perl -e 'use Storable; store({a=>1}, 'test')'
demianshell~> eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)
demianshell~> perl -e 'use Storable; store({a=>1}, 'test')'
Assertion ((svtype)((_svi)->sv_flags & 0xff)) >= SVt_RV failed: file "Storable.xs", line 3753 at blib/lib/Storable.pm (autosplit into blib/lib/auto/Storable/_store.al) line 263, at -e line 1
Run Code Online (Sandbox Code Playgroud)
有一个简单的解决方案吗?