繁体   English   中英

Perlbrew 库管理

[英]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下创建下一棵树:

    • perl5
      • 一些
        • 模块.pm
      • x86_64-linux
        • 汽车
          • [……]
        • .meta
          • [……]
        • perllocal.pod
      • 安装.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 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
  1. 在 web 浏览器中:

变量

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 =

  1. 使用终端:

内容类型:文本/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(在服务器重新启动后):

  1. 在 web 浏览器中:

变量

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 =

  1. 使用终端:

内容类型:文本/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做了两件事:

  • 使安装 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 的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM