我已經安裝了 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.pmto~/perl5/perlbrew/perls/perl-5.22.4/lib/5.22.4/Some/Module.pm或 to移動到/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指定目標 lib 目錄,但它會在下面創建下一棵樹/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
- 一些
- perl5
- 男人
- 男人3
- [……]
- 男人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:
庫的目錄權限:
和

@terry0its是庫的名稱(在示例中我將其稱為@somename.
更新 4:
列印變數:
PERL_MB_OPTPERL_MM_OPTPERL5LIBPATHPERL_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/用戶名/anaconda3/condabin:/root/Komodo IDE/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=
- 使用終端:
內容型別:文本/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/用戶名/anaconda3/condabin:/root/Komodo IDE/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/用戶名/.perlbrew/libs/perl-5.22.4@terry0its
更新 5:
當我切換到純 perl-5.22.4(沒有外部庫,如 @terry0its)時,我看到相同腳本的下一個輸出(在服務器重新啟動后):
- 在網路瀏覽器中:
變數:
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/username/.local/share/JetBrains/Toolbox/scripts
PERL_LOCAL_LIB_ROOT=
- 使用終端:
內容型別:文本/html
變數:
PERL_MB_OPT--install_base "/home/用戶名/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:/home /用戶名/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/username/.local/share/JetBrains/Toolbox/scripts
PERL_LOCAL_LIB_ROOT= /home/用戶名/perl5
uj5u.com熱心網友回復:
該問題與具有 ENV 變數的Apache2服務器特定行為有關。
它去除了一些環境變數,因此它們在您的 CGI 腳本中是未定義的。
要將它們包含在 CGI 腳本中,您只需將它們添加PassEnv PERL5LIB到您的主機 conf 檔案中并重新啟動服務器。然后,瞧 - 您已經在整個站點PERL5LIB的所有輸出中正確顯示。$ENV{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并在 Perls 之間輕松切換并自動處理所有庫(包括外部創建的庫perlbrew create lib somename),您必須在主機的 Apache 組態檔中明確地將環境傳遞給 CGI 腳本。PERl5LIB
不要忘記檢查您的 mod_env 是否在 httpd.conf(主 Apache 組態檔)中啟用LoadModule env_module modules/mod_env.so(必須取消注釋)。
我希望它能幫助其他人使用 Apache2 服務器輕松處理他們的 perlbrew Perl 庫。
此外,模塊mod_env允許我們添加自定義環境變數,我們將能夠在主機或服務器上使用所有這些變數(這取決于您將其放入的位置 - 在主 conf檔案中,您的主機檔案中,或者只是進入.htaccess對于特定的目錄甚至頁面)。
uj5u.com熱心網友回復:
perlbrew做兩件事:
- 使安裝 Perl 更容易一些。
- 操縱加載它的 shell 的 PATH。
CGI 腳本不是由 shell 啟動的。
首先,你不應該使用PERL5LIB. 為什么安裝自定義perl使用perlbrew然后嘗試使其使用另一個安裝的模塊perl?這不過是不好的。取消設定PERL5LIB。
如果沒有設定,PERL5LIB你也不應該使用。您需要讓模塊安裝在可以找到它們的地方。PERL_MB_OPTPERL_MM_OPTperl
所以從清理混亂開始。確保PERL5LIB,PERL_MB_OPT并且PERL_MM_OPT沒有設定在任何地方。如果模塊安裝在奇怪的地方,您可能需要重新安裝這些模塊。
現在,使用 correctperl將加載由那個安裝的模塊perl。
所以剩下的就是確保我們使用正確的perl. 你/usr/bin/env用來定位perl。perlApache 的 PATH 控制您的應用程式使用哪個有意義嗎?可能不是。
我要做的是在 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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/534289.html
上一篇:從Perl散列參考開始構建資料結構是一種糟糕的方式嗎?
下一篇:有沒有一種方法可以使用Hibernate中的IdentifierGenerator管理自定義生成的ID,以服務于多個具有不同前綴的物體?
