2017-10-16 200 views
6

我無法找到CPAN安裝其文件的權威/全面描述。我假設必須有一組規則,並且它不像「XYZ目錄」那樣簡單,因爲例如,Linux機器上的多個用戶可以運行CPAN,即使只有一個Perl安裝,它仍然可以工作。那麼,這些規則是什麼?CPAN在哪裏安裝模塊?

此問題的第二部分:PERL5LIB環境變量的文檔說它是「在查看標準庫和當前目錄之前查找Perl庫文件的目錄列表」。

我假定CPAN沒有安裝到標準的庫位置,因爲大概是針對特定的Perl版本固定的。那麼CPAN可能安裝到PERL5LIB中?

最後,正如我已經提到的那樣,CPAN如何處理多個用戶可能運行相同Perl安裝的事實?對不起,如果這是一個單獨的問題,但似乎可能相關。

回答

5

Perl指定了三組安裝位置。

  • perl,對於Perl本身包含的模塊。
  • vendor,適用於您的perl二進制文件提供商安裝的模塊。
  • site,對於使用cpan安裝的模塊。

這些集合中的每一個都提供了許多文件類型的安裝位置。

     Installation location 
         -------------------------------------------------------- 
Type of file   perl    vendor     site 
---------------------- --------------- --------------------- ------------------- 
Build-specific modules installarchlib installvendorarch  installsitearch 
Modules     installprivlib installvendorlib  installsitelib 
Binary programs   installbin  installvendorbin  installsitebin 
Other programs   installscript installvendorscript installsitescript 
man pages for scripts installman1dir installvendorman1dir installsiteman1dir 
man pages for modules installman3dir installvendorman3dir installsiteman3dir 
html docs for scripts installhtml1dir installvendorhtml1dir installsitehtml1dir 
html docs for modules installhtml3dir installvendorhtml3dir installsitehtml3dir 

您可以獲取路徑任何使用這些位置如下:

perl -V:{var} 

可以使用獲得以下這些地點的所有路徑:

perl -V:'install.*' 

這些都是安裝人員默認使用[1]。但是,最常用的兩個安裝程序允許用戶進行安裝,以覆蓋所有這些安裝程序。如果模塊安裝在非標準位置,則可以使用PERL5LIBperl知道在哪裏找到模塊。


  1. CPAN不安裝模塊。這是一個存儲庫。

    cpan不會安裝模塊。 cpan從CPAN下載發行版並運行Makefile.PLBuild.PL中提供的安裝程序。 (同去的cpanmcpanp

    這些腳本大多使用ExtUtils::MakeMakerModule::Build自己安裝(儘管存在其他安裝程序)。

+0

除了CPAN-the-repository之外,還有CPAN-per-Perl模塊(這是'cpan'命令使用的)。 – melpomene

+0

表是從哪裏來的,還是你自己寫的? – simbabque

2

CPAN實際上並未安裝文件。它運行嵌入到每個發行版中的安裝腳本,然後執行實際安裝。

對於使用ExtUtils::MakeMaker的分配,缺省值在此處記錄爲:https://metacpan.org/pod/ExtUtils::MakeMaker#make-install(缺省值INSTALLDIRSsite)。有關Module::Build,請參閱https://metacpan.org/pod/Module::Build#INSTALL-PATHS

當文檔談到$Config{foo}%Config時,表示the Config module提供的%Config變量。 $Config{foo}的值也可以通過運行perl -V:foo進行檢查。

(如果你覺得這似乎是不必要的複雜,你是對的。)

短的版本是,Perl有多個「系統目錄」,其中之一是「特定地點」模塊,因此作爲默認的安裝目標。你說得對,這是一個單一的目錄(perl install),它不能與多用戶系統完美匹配:它在所有用戶之間共享,並且你需要root權限來安裝模塊(並且這樣做可能會升級/從系統包中覆蓋模塊,這是一個壞主意)。

人們所做的事情是將ExtUtils :: MakeMaker,Module :: Build等配置爲安裝到用戶的主目錄中。這可以通過環境變量來完成。然後他們告訴perl將這個目錄添加到@INC,所以模塊實際上可以找到並加載。這是通過另一個環境變量PERL5LIB完成的。 (PERL5LIB不影響安裝,它僅用於加載。)

以上所有內容均爲自動化並封裝在local::lib中。 (本地:: lib中也可以使用如創建每個項目的模塊子目錄)

的CPAN文件還稱:

由於CPAN 1.9463,如果你沒有權限寫默認的perl庫目錄,CPAN的配置過程會問你是否要引導local::lib,這使得保持個人perl庫目錄容易。


你可以通過在你的主目錄中安裝一個私人的Perl(在這種情況下,「系統」目錄只是在你$HOME另一個子目錄,因此不會與任何人共享,並能迴避整個問題由你寫信)。這是很容易的,例如, perlbrew


另一個注意事項:您剛剛在PERL5LIB的文檔中發現了一個錯誤。 「和當前目錄」已過期:出於安全原因,.已從模塊位置的默認列表中刪除。

+0

謝謝,這很有幫助。關於這一點:「人們做的是將ExtUtils :: MakeMaker,Module :: Build等配置爲安裝到用戶的主目錄中」Local local :: lib是否使這種冗餘? – Stephen

+0

@Stephen那麼,大多數人使用local :: lib來做到這一點。 :-) local :: lib只是一個自動化的方式來創建一些目錄並正確設置一些環境變量。所以是的:如果你使用local :: lib(通過添加魔術線到你的'.bashrc'或等價物),你不需要手動配置任何東西。 – melpomene

1

這是一個複雜的問題。你可以告訴在那裏核心庫尋求其中之一的地方位於:

perldoc -l B 

會告訴你其中B核心模塊的位置。你可以嘗試其他結果不同的其他人......

另外,perl -V會告訴你所有的shell變量和@INC的值,它們將查找庫的位置。

核心庫通常是在不同的地方找到比當地庫。此外,如果您使用perlbrewlocal::lib您可能需要考慮更多事項。關於shell變量,以及PERL5LIB,您也有PERL_LOCAL_LIB_ROOT

關於你的其他問題,我想說root可能會在系統範圍內安裝庫。任何用戶都會擁有那些以及隨後通過shell變量或其他方式(如命令行選項perl -I <lib location>)或代碼use lib <lib location>;包含的任何本地位置。

還有perlbrewlocal::lib沿着允許非特權用戶安裝的Perl和庫在本地目錄。

關於從CPAN安裝模塊的方法,我最喜歡的是cpanminus。它被調用cpanm <library to install>。它永遠不會失敗......