如何为不同的Perl应用安装专用环境?
有没有什么东西在功能上跟Python的virtualenv相似,但适用于Perl呢?
我之前在Python上做过一些开发,能够在一个单独的环境中安装非系统版本的模块,而不会搞得一团糟,这个优势非常大。现在我需要在Perl上做一个新项目,我在找类似于virtualenv的东西,但适用于Perl。你能推荐一个Perl中类似或替代Python的virtualenv的工具吗?
我想为Y个不同的应用程序设置X个不同的非系统Perl包。更糟糕的是,这些应用程序可能需要同一个包的不同版本,所以每个应用可能都需要在一个单独的模块/库环境中安装。对于X小于Y小于3的情况,你可能可以手动处理。但如果X小于Y大于10,就不应该手动去做了。
理想情况下,我希望找到的工具能像这样工作:
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 个回答
我用过 schroot
来实现这个功能。它比 virtualenv 稍微重一些,但你可以放心,里面不会有不该出现的东西。
Schroot
会为你管理一个 chroot 环境,它会把你的主目录挂载到这个环境里,这样看起来就像是一个正常的命令行会话,只不过是使用 chroot 里的程序和库。
不过我觉得它可能只适用于 debian/ubuntu 系统。
设置好 schroot
后,你上面的脚本会变成这样:
schroot -c my_perl_dev
wget ...
你可以查看 http://www.debian-administration.org/articles/566,那里有一篇有趣的文章介绍这个内容。
另外,可以看看 perl-virtualenv,这个工具看起来是对local::lib的一个封装,正如Hobbs所提到的,它会创建一个bin/activate和bin/deactivate的脚本,这样你就可以像使用Python工具一样使用它。
我已经成功使用了大约一个月,没意识到它可能没有达到标准。
这个工具让为Perl设置一个工作环境变得简单多了,因为虽然local::lib会告诉你需要设置哪些变量等等,但perl-virtualenv会创建一个激活脚本,帮你自动完成这些设置。
有一个工具叫做 local::lib
,它能帮你处理很多事情,跟 virtualenv
有点像。它的功能包括:
- 在使用它的过程中,设置
@INC
,这是一个用来告诉程序去哪里找库的地方。 - 为子进程设置
PERL5LIB
和其他相关的环境变量。 - 设置合适的变量,让 CPAN、
MakeMaker
、Module::Build
等工具能够安装库,并把配置存储在本地目录。 - 设置
PATH
,这样安装好的程序可以被找到。 - 在命令行使用时,打印环境变量到标准输出,这样你可以把
eval $(perl -Mlocal::lib)
放到你的.profile
文件里,然后大部分时间就不用再管它了。