Perlbrew库管理

py49o6xq  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(259)

我已经安装了perlbrew,并安装了两个Perls。现在我正在尝试为我用cpanm安装的模块分离库。
我希望(如果可能)切换到一个Perl(在Perlbrew中)(例如:5.22.4),一旦我调用cpanm install Some::Module,模块将安装在单独的库中,仅与此Perl相关。
然后,在脚本中,我想有像下面的例子:

#!/usr/bin/env perl

use strict;
use Some::Module;
print "Content-type:text/html\n\n";
print "Works!";

就是这样。没有任何其他的use lib 'path';之类的。我试着使用perlbrew lib create perl-5.22.4@somename,然后切换到它。
然后调用cpanm install Some::Module,我在~/.perlbrew/perl-5.22.4@somename/lib/perl5/Some/Module.pm位置看到结果,但是当我从浏览器调用脚本时,我看到Error 500,日志显示"missing module Some::Module, check @INC etc..."
我还发现,如果我将~/.perlbrew/perl-5.22.4@somename/lib/perl5/Some/Module.pm移到~/perl5/perlbrew/perls/perl-5.22.4/lib/5.22.4/Some/Module.pm/home/arseniigorkin/perl5/perlbrew/perls/perl-5.22.4/lib/site_perl/5.22.4/x86_64-linux/Some/Module.pm,那么脚本就可以工作。
但是,如何设置Perlbrew将cpanm自动切换到该目录?
我还在努力:cpanm install -l /home/arseniigorkin/perl5/perlbrew/perls/perl-5.22.4/lib/site_perl/5.22.4/x86_64-linux Some::Module以指定目的lib目录,但它会在/home/arseniigorkin/perl5/perlbrew/perls/perl-5.22.4/lib/site_perl/5.22.4/x86_64-linux下创建下一个树:

  • 自由
  • perl 15
  • 部分
  • Module.pm
  • x86_64-Linux操作系统
  • 自动的
  • [.....]
  • . meta
  • [.....]
  • perllocal.pod
  • install.pm
  • 男子3
  • [.....]

不幸的是,脚本抛出了Error 500
那么,有没有可能在脚本中省略use lib 'path';,在Perlbrew中的多个Perl版本之间切换呢?
这一切都发生在Ubuntu 22.04上。

更新

当切换到perl-5.22.4@somename并通过cpanm安装Some::Module时,该模块出现在~/.perlbrew/perl-5.22.4@somename/lib/perl5/Some/Module.pm下,如上所述,但CGI脚本失败并显示错误500。
但是,当我执行下一个命令时:perlbrew list-modules它显示Some::Module安装在当前的Perl下(我切换到了它)。所以,这是一个不和谐:Perlbrew“看到”特定Perl下的模块,但CGI脚本无法“看到”同一Perl下的此模块。

更新2

这是perlbrew info:的输出

Current perl:
  Name: perl-5.22.4@somename
  Path: /home/username/perl5/perlbrew/perls/perl-5.22.4/bin/perl
  Config: -de -Dprefix=/home/username/perl5/perlbrew/perls/perl-5.22.4 -Dusesitecustomize -Aeval:scriptdir=/home/username/perl5/perlbrew/perls/perl-5.22.4/bin
  Compiled at: Nov 10 2022 23:26:53

perlbrew:
  version: 0.96
  ENV:
    PERLBREW_ROOT: /home/username/perl5/perlbrew
    PERLBREW_HOME: /home/username/.perlbrew
    PERLBREW_PATH: /home/username/.perlbrew/libs/perl-5.22.4@somename/bin:/home/username/perl5/perlbrew/bin:/home/arseniigorkin/perl5/perlbrew/perls/perl-5.22.4/bin
    PERLBREW_MANPATH: /home/username/.perlbrew/libs/perl-5.22.4@somename/man:/home/username/perl5/perlbrew/perls/perl-5.22.4/man

更新3

库的目录权限:x1c 0d1x和

的关系
@terry0its是库的名称(在示例中我将其命名为@somename
更新四:
打印变量:

  • x1米20英寸
  • PERL_MM_OPT
  • PERL5LIB
  • PATH
  • PERL_LOCAL_LIB_ROOT

使用以下脚本:

#!/usr/bin/env perl

print "Content-type:text/html\n\n";
print <<HTML;
Vars:<br>
PERL_MB_OPT = @{[$ENV{"PERL_MB_OPT"}]}<br>
PERL_MM_OPT = @{[$ENV{"PERL_MM_OPT"}]}<br>
PERL5LIB = @{[$ENV{"PERL5LIB"}]}<br>
PATH = @{[$ENV{"PATH"}]}<br>
PERL_LOCAL_LIB_ROOT = @{[$ENV{"PERL_LOCAL_LIB_ROOT"}]}<br>
HTML

1.在Web浏览器中:

  • 变量 *:

PERL_MB_OPT =
PERL_MM_OPT =
PERL5LIB =
/home/用户名/perlbrew/perl 5/perlbrew/perl 5 - 5.22.4/bin:/home/用户名/perlbrew/perl 5/perlbrew/perl 5/perlbrew/perl 5 -5.22.4/bin:/root/科莫多IDE/bin:/home/用户名/anaconda 3/condabin:/root/科莫多IDE/bin:/home/用户名/pycharm/bin:/home/用户名/本地/bin:/usr/本地/sbin:/usr/sbin:/usr/本地/游戏:/usr/本地/游戏:/snap/bin:/snap/bin:/home/用户名/.本地/共享/JetBrains/工具箱/脚本
PERL_LOCAL_LIB_ROOT =
1.带终端:
内容类型:text/html
变量:
用户名/用户名/.perlbrew/库/perl-5.22.4@terry0its
用户名和密码
用户名/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码/密码
PATH = /home/用户名/.perlbrew/libs/perl-5.22.4@terry0its/bin:/home/用户名/perl 5/perlbrew/bin:/home/用户名/perl 5/perlbrew/perls/perl-5.22.4/bin:/root/科莫多IDE/bin:/home/用户名/anaconda 3/condabin:/root/科莫多IDE/bin:/home/用户名/pycharm/bin:/home/用户名/.本地/bin:/usr/本地/sbin:/usr/sbin:/usr/sbin:/sbin:/usr/游戏:/usr/本地/游戏:/snap/bin:/snap/bin:/home/用户名/.本地
用户名/用户名/用户名/用户名/用户名

更新5

当我切换到纯perl-5.22.4(没有外部lib,如@terry0its)时,我看到相同脚本的下一个输出(在重新启动服务器之后):
1.在Web浏览器中:

  • 变量 *:

PERL_MB_OPT =
PERL_MM_OPT =
PERL5LIB =
/home/用户名/pycharm/bin:/home/用户名/pycharm/bin:/usr/本地/sbin:/usr/本地/游戏:/usr/本地/游戏:/snap/bin:/snap/bin:/home/用户名/本地/共享/JetBrains/工具箱/脚本
PERL_LOCAL_LIB_ROOT =
1.带终端:
内容类型:text/html
变量:
PERL_MB_OPT--安装库“/home/用户名/perl 5”
PERL_MM_OPT =安装基础=/home/用户名/perl 5
PERL5LIB =
PATH = /home/用户名/anaconda 3/condabin:/home/用户名/perl 5/perlbrew/bin:/home/用户名/perl 5/perlbrew/perls/perl-5.22.4/bin:/root/Komodo IDE/bin:/home/用户名/perl 5/bin:/home/用户名/pycharm/bin:/home/用户名/.local/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/sbin:/bin:/usr/游戏:/usr/本地/游戏:/snap/bin:/snap/bin:/home/用户名/.local/share/JetBrains/工具箱/脚本
用户名/密码/密码/用户名

5cnsuln7

5cnsuln71#

该问题与使用ENV变量的 * Apache 2 * 服务器特定行为有关。
它去除了一些环境变量,因此它们在CGI脚本中未定义。
要在CGI脚本中包含它们,只需将PassEnv PERL5LIB添加到主机conf文件中并重新启动服务器,然后,瞧,您就可以在整个站点的$ENV{PERL5LIB}输出中正确显示PERL5LIB
示例代码:

<Directory "/home/user/someproject/server/www/public_html/cgi-bin">
    AllowOverride All
    Options None
    Require all granted
    Options +ExecCGI
    PassEnv PERL5LIB
    AddHandler cgi-script .cgi .pl
</Directory>

因此,要使用Perlbrew并在Perl之间轻松切换,以及自动处理所有库(包括使用perlbrew create lib somename外部创建的库),您必须在主机的Apache配置文件中显式地将PERl5LIB环境 PASS 给CGI脚本。
不要忘记检查您的mod_env是否在httpd.conf(Apache主配置文件)中作为LoadModule env_module modules/mod_env.so启用(必须取消注解)。
我希望它能帮助其他人用Apache 2服务器轻松处理他们的perlbrew的Perl库。
此外,模块mod_env允许我们添加自定义环境变量,我们将能够在整个主机或服务器上使用这些变量(这取决于您将其放入的位置--在 main conf 文件中,您的 *host文件 * 中,或者只是在.htaccess中的特定目录或页面中)。

mf98qq94

mf98qq942#

perlbrew执行两项操作:

  • 使Perl的安装变得简单一些。
  • 操纵加载它的shell的PATH。

CGI脚本不是由shell启动的。
首先,你不应该使用PERL5LIB。为什么要安装一个使用perlbrew的自定义perl,然后试图让它使用另一个perl安装的模块?这只会是一个坏消息。取消设置PERL5LIB
PERL5LIB未设置的情况下,您也不应该使用PERL_MB_OPTPERL_MM_OPT。您需要让模块安装在perl可以找到它们的位置。
所以从清理混乱开始。确保PERL5LIBPERL_MB_OPTPERL_MM_OPT没有被设置在任何地方。如果它们被安装在一个奇怪的地方,你可能需要重新安装这些模块。
现在,使用正确的perl将加载由该perl安装的模块。
所以剩下的就是确保我们使用正确的perl。您使用/usr/bin/env来定位perl。Apache的环境控制您的应用程序使用哪个perl有意义吗?可能没有。
我要做的是在perlbrew中为您的项目创建一个别名。

perlbrew alias create perl-5.22.4@somename myproject

然后使用以下shebang行:

#!/home/username/perl5/perlbrew/perls/myproject/bin/perl

这将允许您使用来控制项目使用的perl版本

perlbrew alias create -f ... myproject

它使用符号链接工作,而不是PATH操作,所以它可以在任何地方工作,而不仅仅是使用perlbrew的shell。

相关问题