[英]Perlbrew libs management
我已经安装了 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
然后脚本工作。 而 Perl 5.22.4(在我们的示例中)有自己的库,无需使用use lib 'path';
但是,如何设置 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
指定目标库目录,但是它会在/home/arseniigorkin/perl5/perlbrew/perls/perl-5.22.4/lib/site_perl/5.22.4/x86_64-linux
下创建下一棵树:
遗憾的是,脚本抛出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 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 :
@terry0its
是库的名称(在示例中我称之为@somename
。
更新 4:
打印变量:
PERL_MB_OPT
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
变量:
PERL_MB_OPT
=
PERL_MM_OPT
=
PERL5LIB
=
PATH
= /home/username/.perlbrew/libs/perl-5.22.4@terry0its/bin:/home/username/perl5/perlbrew/bin:/home/username/perl5/perlbrew/perls/perl-5.22.4/ bin:/root/Komodo IDE/bin:/home/username/anaconda3/condabin:/root/Komodo IDE/bin:/home/username/pycharm/bin:/home/username/.local/bin:/usr/local /sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home /用户名/.local/share/JetBrains/Toolbox/scripts
PERL_LOCAL_LIB_ROOT
=
内容类型:文本/html
变量:
PERL_MB_OPT
= --install_base /home/username/.perlbrew/libs/perl-5.22.4@terry0its
PERL_MM_OPT
= INSTALL_BASE=/home/username/.perlbrew/libs/perl-5.22.4@terry0its
PERL5LIB
= /home/用户名/.perlbrew/libs/perl-5.22.4@terry0its/lib/perl5
PATH
= /home/username/.perlbrew/libs/perl-5.22.4@terry0its/bin:/home/username/perl5/perlbrew/bin:/home/username/perl5/perlbrew/perls/perl-5.22.4/ bin:/root/Komodo IDE/bin:/home/username/anaconda3/condabin:/root/Komodo IDE/bin:/home/username/pycharm/bin:/home/username/.local/bin:/usr/local /sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home /用户名/.local/share/JetBrains/Toolbox/scripts
PERL_LOCAL_LIB_ROOT
= /home/username/.perlbrew/libs/perl-5.22.4@terry0its
更新 5 :
当我切换到纯 perl-5.22.4(没有外部库,如 @terry0its)时,我看到相同脚本的下一个 output(在服务器重新启动后):
变量:
PERL_MB_OPT
=
PERL_MM_OPT
=
PERL5LIB
=
PATH
= /home/username/anaconda3/condabin:/home/username/perl5/perlbrew/bin:/home/username/perl5/perlbrew/perls/perl-5.22.4/bin:/root/Komodo IDE/bin:/ home/arseniigorkin/perl5/bin:/home/username/pycharm/bin:/home/username/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin :/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/用户名/.local/share/JetBrains/Toolbox/scripts
PERL_LOCAL_LIB_ROOT
=
内容类型:文本/html
变量:
PERL_MB_OPT
--install_base "/home/username/perl5"
PERL_MM_OPT
= INSTALL_BASE=/home/用户名/perl5
PERL5LIB
=
PATH
= /home/username/anaconda3/condabin:/home/username/perl5/perlbrew/bin:/home/username/perl5/perlbrew/perls/perl-5.22.4/bin:/root/Komodo IDE/bin:/家/用户名/perl5/bin:/home/用户名/pycharm/bin:/home/用户名/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin :/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/home/用户名/.local/share/JetBrains/Toolbox/scripts
PERL_LOCAL_LIB_ROOT
= /home/用户名/perl5
该问题与带有 ENV 变量的Apache2服务器特定行为有关。
它去除了一些环境变量,因此它们在您的 CGI 脚本中是未定义的。
要将它们包含在 CGI 脚本中,您只需将PassEnv PERL5LIB
添加到您的主机配置文件中并重新启动服务器。 然后,瞧 - 您的PERL5LIB
正确显示在整个站点的$ENV{PERL5LIB}
的 output 中。
示例代码:
<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 并在 Perls 之间轻松切换并自动处理所有库(包括使用perlbrew create lib somename
在外部创建),您必须在PERl5LIB
环境传递给 CGI 脚本。
不要忘记检查您的 mod_env 是否在 httpd.conf(主 Apache 配置文件)中启用为LoadModule env_module modules/mod_env.so
(必须取消注释)。
我希望它能帮助其他人使用 Apache2 服务器轻松处理他们的 Perl perlbrew 库。
此外,模块mod_env允许我们添加自定义环境变量,我们将能够在主机或服务器上使用所有这些变量(这取决于你把它放在哪里 - 在主 conf文件中,你的主机文件中,或者只是进入.htaccess
对于特定的目录甚至页面)。
perlbrew
做了两件事:
CGI 脚本不是由 shell 启动的。
首先,您不应该使用PERL5LIB
。 为什么使用perlbrew
安装自定义perl
然后尝试使其使用另一个perl
安装的模块? 这不过是不好的。 取消PERL5LIB
。
在未设置PERL5LIB
的情况下,您也不应使用PERL_MB_OPT
和PERL_MM_OPT
。 您需要让模块安装在perl
可以找到它们的位置。
所以从清理混乱开始。 确保没有在任何地方设置PERL5LIB
、 PERL_MB_OPT
和PERL_MM_OPT
。 如果模块安装在奇怪的地方,您可能需要重新安装这些模块。
现在,使用正确的perl
将加载由该perl
安装的模块。
所以剩下的就是确保我们使用正确的perl
。 您使用/usr/bin/env
来定位perl
。 Apache 的 PATH 控制您的应用程序使用哪个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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.