代码之家  ›  专栏  ›  技术社区  ›  abbot

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

  •  21
  • abbot  · 技术社区  · 15 年前

    在功能方面是否有与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
    
    8 回复  |  直到 9 年前
        1
  •  21
  •   hobbs    15 年前

    有个工具叫 local::lib 这为你完成了所有的工作,就像 virtualenv . 它将:

    • 设置 @INC 在使用过程中。
    • 集合 PERL5LIB 以及其他类似于子进程的东西。
    • 设置正确的变量来说服CPAN, MakeMaker , Module::Build 安装库并将配置存储在本地目录中。
    • 集合 PATH 这样就可以找到已安装的二进制文件。
    • 从命令行使用时,将环境变量打印到stdout,以便 eval $(perl -Mlocal::lib) 在你的 .profile 然后大部分都忘了。
        2
  •  2
  •   Community CDub    8 年前

    在调查的时候,我发现了这个和其他一些页面( 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的PLENV相比,更倾向于基于bash的PLENV Perlbrew从我所看到的)
    • 模块版本管理: Carton
    • 模块安装:CPAN(好, cpanminus 不管怎样,YMMV)

    老实说,这不是 理想的 尽管我还在学习,但还是要准备好,这样可能会更好。只是感觉不对劲。它当然不是一个“以牙还牙”的替代品。 virtualenv .

    我发现有几个帖子说 it is possible 但他们都没有走得更远。

        3
  •  1
  •   hillu    15 年前

    我不确定这和那是不是一样 virtualenv 你在说什么,但是看看 @INC 中的特殊变量 perlvar 木版纸。

        4
  •  1
  •   Nick Craig-Wood    15 年前

    我已经用过 schroot 为此目的。它比virtualenv重一点,但您可以确保不会有任何泄漏。

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

    我想可能只有Debian/Ubuntu。

    在设置 施鲁特 ,上面的脚本看起来像

    schroot -c my_perl_dev
    wget ...
    

    http://www.debian-administration.org/articles/566 关于它的一篇有趣的文章

        5
  •  1
  •   Powerlord    15 年前

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

    我相信CPAN也可以将库安装到特定的目录中。当然,CPAN从 CPAN site 为了安装东西,所以这可能不是最好的选择。

        6
  •  1
  •   rgammans    10 年前

    还结帐 perl-virtualenv ,这看起来像是霍布斯建议的围绕local::lib的包装,但是创建了一个bin/activate和bin/deactivate,这样您就可以像使用Python工具一样使用它。

    我已经成功地使用了一个月左右,但还没有意识到它并没有达到应有的标准。

    它使为Perl设置一个工作的virtualenv变得容易得多,而local:lib将告诉您需要设置什么变量等等。Perlvirtualenv创建一个激活脚本,它为您做这件事。

        7
  •  0
  •   reinierpost    15 年前

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

    然后,我将它的结果位置放在标准Perl之前的可执行文件$path中,并使用它的CPAN外壳来安装我需要的模块(通常很多)。 我的Perl脚本都是从行开始的

    #!/usr/bin/env perl
    

    这种方法从来没有问题。

        8
  •  0
  •   brian d foy    15 年前

    看起来您只需要使用makefile.pl的install_-base配置(或build.pl的--install_-base选项)?你到底需要什么解决方案来帮你?听起来您只需要将已安装的模块安装到正确的位置。你把你的问题当作 XY Problem 通过指定您认为是什么解决方案,而不是让我们帮助您完成任务。

    How do I keep my own module/library directory? 例如,在PerlFaq8中。

    如果您正在从CPAN下载模块,最新的 cpan 命令(in) App::Cpan 有A -j 切换以允许您选择备用cpan.pm配置文件。在这些配置文件中,您可以将cpan.pm选项设置为随时随地安装。

    根据您的说明,听起来本地::lib可能在单一、简单的情况下对您有效,但我在工业强度部署中这样做,在这种部署中,我为每个应用程序设置自定义、私有CPAN,并直接从这些自定义CPAN安装。看到我 MyCPAN::App::DPAN 例如,模块。在此基础上,我使用定制的cpan.pm配置来分析它们的环境并为每个应用程序设置适当的值,这样就可以为该应用程序在目录中安装所有内容。

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