23

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

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

我正在尝试为要部署的 Y 个不同应用程序设置 X 个不同的非系统 Perl 包集。更糟糕的是,这些应用程序可能需要同一包的不同版本,因此它们中的每一个都可能需要安装在单独的模块/库环境中。对于 X < Y < 3,您可能希望手动执行此操作。但对于 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
4

8 回答 8

21

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

  • @INC在使用它的过程中设置。
  • 为子进程设置PERL5LIB和其他类似的东西。
  • 设置正确的变量以说服 CPAN、MakeMakerModule::Build等安装库并将配置存储在本地目录中。
  • 设置PATH以便可以找到已安装的二进制文件。
  • 从命令行使用时将环境变量打印到标准输出,这样您就可以放入eval $(perl -Mlocal::lib) 您的环境变量.profile,然后几乎忘记它。
于 2009-09-14T21:12:15.927 回答
2

我已经用于schroot此目的。它比 virtualenv 重一点,但您可以确定不会泄漏任何不应该的东西。

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

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

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

schroot -c my_perl_dev
wget ...

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

于 2009-09-15T12:16:37.437 回答
2

还要检查perl-virtualenv,这似乎是 Hobbs 建议的 local::lib 的包装,但创建了一个 bin/activate 和 bin/deactivate ,因此您可以像使用 python 工具一样使用它。

我已经相当成功地使用了一个月左右,却没有意识到它可能没有达到应有的标准。

它使为 perl 设置工作的 virtualenv 变得更加容易,因为 local:lib 会告诉您需要设置哪些变量等。 perl-virtualenv 创建一个为您执行此操作的激活脚本。

于 2014-07-04T08:32:17.023 回答
2

在调查时,我发现了这个页面和其他一些页面(这个页面太旧了,错过了新技术,这个 reddit 帖子有点误导)。

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

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

  • Perl 版本管理:pleenv / perlbrew(据我所知,大多数人更喜欢基于 bash 的 pleenv 而不是基于 perl 的 perlbrew)
  • 模块版本管理:纸箱
  • 模块安装:cpan(好吧,无论如何, cpanminus,ymmv)

老实说,这不是一个理想的设置,虽然我还在学习,所以它可能更优越。就是感觉不对。它肯定不是virtualenv的替代品。

我发现有几篇帖子说“ 可能的”,但都没有更进一步。

于 2016-04-20T04:23:11.550 回答
1

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

我相信 cpan 也可以将库安装到特定目录。诚然,cpan 从CPAN 站点提取以安装东西,因此这可能不是最佳选择。

于 2009-09-14T21:06:32.687 回答
1

我不确定这是否与virtualenv您所说的相同,但请查看手册页中的@INC特殊变量perlvar

于 2009-09-14T21:11:06.337 回答
1

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

请参阅如何保留自己的模块/库目录?例如,在 perlfaq8 中。

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

根据您的说明,听起来 local::lib 在单一、简单的情况下可能对您有用,但我这样做是为了工业强度部署,我为每个应用程序设置自定义的私有 CPAN,并直接从这些自定义 CPAN 安装。例如,参见我的MyCPAN::App::DPAN模块。从那以后,我使用自定义 CPAN.pm 配置来分析他们的环境并为每个应用程序设置适当的值,可以将所有内容安装在一个目录中,只为那个应用程序。

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

于 2009-09-15T16:27:12.867 回答
0

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

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

#!/usr/bin/env perl

这种方法从来没有问题。

于 2009-09-14T21:23:27.863 回答