我已经安装了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 5PERL5LIB
=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/工具箱/脚本
用户名/密码/密码/用户名
2条答案
按热度按时间5cnsuln71#
该问题与使用ENV变量的 * Apache 2 * 服务器特定行为有关。
它去除了一些环境变量,因此它们在CGI脚本中未定义。
要在CGI脚本中包含它们,只需将
PassEnv PERL5LIB
添加到主机conf文件中并重新启动服务器,然后,瞧,您就可以在整个站点的$ENV{PERL5LIB}
输出中正确显示PERL5LIB
。示例代码:
因此,要使用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
中的特定目录或页面中)。mf98qq942#
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的环境控制您的应用程序使用哪个perl
有意义吗?可能没有。我要做的是在perlbrew中为您的项目创建一个别名。
然后使用以下shebang行:
这将允许您使用来控制项目使用的
perl
版本它使用符号链接工作,而不是PATH操作,所以它可以在任何地方工作,而不仅仅是使用
perlbrew
的shell。