乱用不同的Perl安装

时间:2014-09-13 00:31:09

标签: linux perl yum padre

我尝试升级Perl并将我的计算机弄得一团糟 我目前正在运行RHEL6.5,64位,这就是事情:

  • 我安装了perl-5.10.1,工作得很好。这个来了, 我可以从yum看到它
  • 我想安装Padre,一个Perl IDE,但至少需要v5.11 [我太近了! :(]
  • 在我可以访问的回购中没有更新版本的Perl(我有一个限制,我无法添加新的回购)
  • 我得到老板的同意从www.perl.org下载perl-5.20 .0并试图安装

......混乱开始了!

  • 首先我用我自己的id安装了新的perl,并将perl推送到我家的目录下
  • 我使用'perl -v'进行了测试,可以看到我的环境指向较新的安装,但是,yum从未认识到它(不是真正的问题)
  • 当我尝试安装Padre时,似乎某种程度上它已经硬编码了原始的perl(来自/ usr / bin)并仍然声称有更新的5.11。
  • 尝试修复它,我确实再次安装了新的perl,现在使用root,使其在/ usr树下推送perl ...安装,但是将perl推送到/ usr / local / bin,而不是/ usr / bin中
  • 再说一次,我还有一个perl安装,但Padre仍在寻找/ usr / bin上的那个

我放弃了Padre,并删除了与它相关的文件,以及我家庭目录上安装的perl,但是我现在编写的一些perl脚本会抛出如下错误:

perl -cw "xmltest.pl" (in directory: /home/myid/scripts/xmltest.pl)
perl: symbol lookup error: /usr/lib64/perl5/auto/Data/Dumper/Dumper.so: undefined symbol: Perl_Istack_sp_ptr
Compilation failed.

...和Data :: Dumper不是唯一一个......每当我禁用其中一个模块时,另一个模块以相同或相似的方式挂起

从我读到的内容来看,似乎这个问题与最初为一个perl版本安装的模块有关,并且被另一个版本调用,但是,我已经强制我使用的模块直接从CPAN重新安装,他们仍然失败

问题:如何安全地从当前的perl安装中解脱出来,并执行新的干净安装,以便能够在没有这些版本冲突的情况下使用它?

我主要担心的是我拥有的依赖于Perl的众多应用程序,而我在卸载时没有破坏

任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:7)

你应该:

  1. 清理

    • 从任何不需要的路径清除(注释掉)您的~/.profile,依此类推
    • $HOME清除任何新的perl安装(确保移至安全的地方)
    • 简而言之,请尝试将环境恢复到之前的工作状态
  2. relog,(退出,登录)

  3. 修复你的系统perl。多数民众赞成,

    • 阅读@Sam Varshavchik的回答
    • 使用您的软件包管理器(5.10)从您的发行版重新安装它。
    • 这一步应该覆盖你造成的混乱。
    • 测试它!
    • 在你确定之前不要继续,一切正常。
  4. 获得的经验教训:永远不会覆盖您的系统perl

    1. 学习

    2. 安装perlbrew

      • 运行安装命令\wget -O - http://install.perlbrew.pl | bash
      • 应该没有错误
      • 按照说明修改启动文件,例如~/.profile或其他......(您需要在末尾添加一行)
      • 检查您的~/perl5/perlbrew/bin是否应包含prelbrewpatchperl
    3. 重新记录

    4. 设置新的perl,运行

      • perlbrew init #init environment
      • perlbrew available #show你可以安装什么perl
      • perlbrew install 5.20.0#将需要几分钟 - 取决于您的系统速度
      • perlbrew install-cpanm
      • perlbrew list #check
      • perlbrew switch perl-5.20.0 #activate new installed perl 5.20
    5. 检查您的安装

      • ~/perl5/perlbrew/bin中您应该有3个脚本:prelbrewpatchperlcpanm
      • perl -v应返回5.20
      • type cpanm - 应该返回~/perl5/perlbrew/bin/cpanm

      你已经完成了。

      1. CPAN模块
      2. 您可以使用cpanm安装新模块,例如:

        检查~/perl5/perlbrew/perls/perl-5.20.0/bin/是否有新命令

        您需要更新您自己的 perl脚本的shebang行

        #!/usr/bin/env perl
        

        我希望不要忘记任何事情,也许其他更有经验的perl-gurus会添加/编辑/更正。

        无论如何,在现实中,步骤5,6,7更容易听起来(通过阅读本文)并且可以在几分钟内完成。

答案 1 :(得分:4)

在基于rpm的Linux发行版上,你不应该手动安装系统软件,就像这样,尝试自己编译和构建它。 RHEL的包管理工具rpm执行一项重要功能,即跟踪包之间的依赖关系,并防止包冲突。

您显示的错误恰恰是系统Perl安装损坏的症状,并且rpm的存在恰恰是为了避免发生这种情况。手动构建和安装随机tarball完全绕过rpm提供的安全网。

从像perl这样的关键系统rpm的损坏的系统安装中恢复,没有一个千篇一律的秘诀,但总的来说:

1)运行" rpm -q" perl,这将显示rpm认为应安装的perl rpm软件包的确切版本。

2)转到RHEL安装媒体/目录,验证它是否包含相同的perl-.x86_64.rpm包。如果您以前安装过RHEL更新,则可能已经更新了perl,因此请查看rpm告诉您已安装在RHEL更新目录中的版本,并验证您是否具有正确的rpm包。

3)执行:

rpm -ivh --force perl-<version>.x86_64.rpm

这将重新安装以前安装的原始perl RPM软件包。您的问题不仅仅是您安装了额外版本的perl,而且您的某些自定义perl版本可能会破坏系统perl包,并且卸载它们不会有帮助,您必须重新安装系统perl。

4)在RHEL中,许多perl模块作为单独的软件包安装。应使用上述过程重新安装已安装的每个perl rpm软件包。执行:

rpm -q -a | grep '^perl'

这将为您提供已安装的所有Perl软件包的列表。您需要为每个Perl rpm包重复此过程。

这并非100%保证这将解决所有问题,也可能存在其他问题,但这是迈向恢复的良好开端。

答案 2 :(得分:0)

我做了什么:

来自@ Sam-Varshavchik回答:

  1. 在我的yum缓存中找到以前的perl rpm,并安装了...... rpm -ivh --force perl-<version>.x86_64.rpm

  2. 检查其他人&#34; perl *&#34;以前安装的软件包...已经有+260,因此将其保存在文件rpm -qa "perl*" > /tmp/perl.pkgs

  3. 要安装+260个软件包,我意识到手动操作需要花费太多时间,所以是时候将一些ksh技能付诸实践......

    我检查了我的yum缓存,发现了大约130个+260个包,所以

    • 从列表中取出了基础perl包(我已安装);
    • 对于缓存中的那些人,我决定用rpm安装,就像基本包一样;
    • 对于那些我没有方便的人,我使用了yum,它会下载并执行相同操作 rpm,所以......

    CACHE="/var/cache/yum/x86_64" for perlpkg in $(cat /tmp/perl.pkgs) do FILE=$(find $CACHE -name "${perlpkg}.rpm") if [[ ${FILE} != "" ]] ; then rpm -ivh --force ${FILE} else yum -y reinstall ${perlpkg} fi done

  4. 来自@ jm666:

    1. 安装了perlbrew(能够从我的auth repos获得它,所以使用yum获得它)并使用perlbrew,安装5.20.0 localy

      • TODO:没有任何额外的模块,也没有Padre ......需要了解更多关于perlbrew的工作方式并将已安装的版本与系统perl隔离开来
    2. 再次感谢@ Sam-Varshavchik和@ jm666的支持指导