在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
答案 0 :(得分:21)
有一个名为local::lib
的工具可以为您完成所有工作,就像virtualenv
一样。它会:
@INC
。PERL5LIB
和其他此类内容。MakeMaker
,Module::Build
等,以便在本地目录中安装库和存储配置。PATH
,以便找到已安装的二进制文件。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,但具有更好的可用性。
我还没有看到这个问题的正确答案,但从我所读过的内容来看,最好的解决方案似乎是:
说实话,这不是一个理想的设置,虽然我还在学习,所以它可能还是优越的。它感觉不对。对于virtualenv的替换来说当然不是一样。
答案 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)。