如何为不同的Perl应用程序安装专用环境?

时间:2009-09-14 20:56:34

标签: python perl virtualenv

在Python virtualenv的功能方面是否有任何等效或接近的东西,但对于Perl?

我已经在Python中进行了一些开发,并且可以在单独的环境中安装非系统版本的模块,而不会产生任何混乱,这是一个巨大的优势。现在我必须在Perl中开发一个新项目,我正在寻找像virtualenv这样的东西,但对于Perl来说。你能建议任何Perl等价物或替换python的virtualenv吗?

我正在尝试为要部署的Y个不同应用程序设置X个不同的非系统Perl包。更糟糕的是,这些应用程序可能需要相同软件包的不同版本,因此每个应用程序可能需要安装在单独的模块/库环境中。您可能希望手动执行此操作以获得X< Y<但是你不应该手动为10> Y> X

理想情况下,我正在寻找的应该是这样的:

perl virtualenv.pl my_environment
. my_environment/bin/activate
wget http://.../foo-0.1.tar.gz
tar -xzf foo-0.1.tar.gz ; cd foo-0.1
perl Makefile.pl
make install # <-- package foo-0.1 gets installed inside my_environment
perl -MCPAN -e 'install Bar' # <-- now package Bar with all its deps gets installed inside my_environment

8 个答案:

答案 0 :(得分:21)

有一个名为local::lib的工具可以为您完成所有工作,就像virtualenv一样。它会:

  • 在使用过程中设置@INC
  • 为子进程设置PERL5LIB和其他此类内容。
  • 设置正确的变量以说服CPAN,MakeMakerModule::Build等,以便在本地目录中安装库和存储配置。
  • 设置PATH,以便找到已安装的二进制文件。
  • 从命令行使用时将环境变量打印到stdout,以便您可以放置​​eval $(perl -Mlocal::lib) 在你的.profile中然后大部分都忘了它。

答案 1 :(得分:2)

在调查时,我发现了这个和其他一些页面(this one is too old并且错过了新技术,this reddit post is a slight misdirect)。

perlbrew和plenv的问题在于它们似乎是pyenv的替代品,而不是virtualenv。如上所述here pyenv用于管理python版本,virtualenv用于管理每个项目模块版本。所以,是的,在某些方面类似于local::lib,但具有更好的可用性。

我还没有看到这个问题的正确答案,但从我所读过的内容来看,最好的解决方案似乎是:

  • Perl版本管理:plenv / perlbrew(与大多数人一样 支持基于perl的更现代的基于bash的plenv 从我所看到的perlbrew)
  • 模块版本管理:Carton
  • 模块安装:cpan(嗯,cpanminus无论如何,ymmv)

说实话,这不是一个理想的设置,虽然我还在学习,所以它可能还是优越的。它感觉不对。对于virtualenv的替换来说当然不是一样。

我发现有几篇帖子说&#34; it is possible&#34;但两者都没有进一步发展。

答案 2 :(得分:1)

程序可以使用use lib修改他们检查库的目录。此lib目录可以相对于当前目录。这些目录中的库将在系统库之前使用,因为它们位于@INC数组的开头。

我相信cpan还可以将库安装到特定目录。当然,cpan从CPAN site开始绘制以安装内容,因此这可能不是最佳选择。

答案 3 :(得分:1)

我不确定这与您所讨论的virtualenv事件是否相同,但请查看@INC联机帮助页中的perlvar特殊变量。

答案 4 :(得分:1)

我已将schroot用于此目的。它比virtualenv有点重,但你可以肯定没有任何东西会泄漏,不应该泄漏。

Schroot为您管理chroot环境,但是将您的主目录安装在chroot中,使其看起来像普通的shell会话,只需使用chroot中的二进制文件和库。

我认为它可能只是debian / ubuntu。

设置schroot后,上面的脚本看起来像

schroot -c my_perl_dev
wget ...

有关它的有趣文章,请参阅http://www.debian-administration.org/articles/566

答案 5 :(得分:1)

同时结帐perl-virtualenv,这似乎是Hobbs建议的local :: lib包装,但是创建了一个bin / activate和bin / deactivate,所以你可以像python工具一样使用它。

我已经相当成功地使用了一个月左右而没有意识到它不是它应该是的标准。

这使得为perl设置工作virtualenv变得更加容易,因为local:lib会告诉你需要设置哪些变量,等等.perl-virtualenv会创建一个激活脚本来为你完成。

答案 6 :(得分:0)

我所做的是启动CPAN shell(cpan)并从中安装我自己的Perl 5.10 (我相信命令是安装perl-5.10)。这将要求各种配置 设置;我确保它指向/ usr / local下的路径 (或默认值以外的其他一些安装位置)。

然后我将其结果位置放在标准perl之前的可执行文件$ PATH中,并使用其CPAN shell来安装我需要的模块(通常很多)。 我的Perl脚本都以行

开头
#!/usr/bin/env perl

这种做法从未出现过问题。

答案 7 :(得分:0)

看起来你只需要为Makefile.PL(或Build.PL的--install_base选项)使用INSTALL_BASE配置?你究竟需要解决方案为你做什么?听起来你只需要将安装的模块放在正确的位置即可。您已将问题显示为XY Problem,指定您认为解决方案的内容,而不是让我们帮助您完成任务。

例如,请参阅perlfaq8中的How do I keep my own module/library directory?

如果从CPAN下载模块,则最新的cpan命令(在App::Cpan中)具有-j开关,允许您选择备用CPAN.pm配置文件。在这些配置文件中,您可以将CPAN.pm选项设置为在任何您喜欢的位置安装。

根据您的澄清,听起来local :: lib可能在单个简单的情况下适合您,但我这样做是为了工业强度部署,我为每个应用程序设置自定义的私有CPAN,并直接从这些自定义安装CPANs。例如,请参阅我的MyCPAN::App::DPAN模块。从那时起,我使用自定义CPAN.pm配置来分析它们的环境,并为每个应用程序设置正确的值,可以将所有内容安装在仅为该应用程序的目录中。

您也可以考虑将您的应用程序分发为Task ::。您可以像任何其他Perl模块一样安装它,但依赖项共享相同的设置(即INSTALL_BASE)。