目錄

名稱

CPAN - 從 CPAN 網站查詢、下載和建置 Perl 模組

摘要

互動模式

perl -MCPAN -e shell

--或--

cpan

基本命令

# Modules:

cpan> install Acme::Meta                       # in the shell

CPAN::Shell->install("Acme::Meta");            # in perl

# Distributions:

cpan> install NWCLARK/Acme-Meta-0.02.tar.gz    # in the shell

CPAN::Shell->
  install("NWCLARK/Acme-Meta-0.02.tar.gz");    # in perl

# module objects:

$mo = CPAN::Shell->expandany($mod);
$mo = CPAN::Shell->expand("Module",$mod);      # same thing

# distribution objects:

$do = CPAN::Shell->expand("Module",$mod)->distribution;
$do = CPAN::Shell->expandany($distro);         # same thing
$do = CPAN::Shell->expand("Distribution",
                          $distro);            # same thing

描述

CPAN 模組自動化或至少簡化了 Perl 模組和擴展的製作和安裝。它包括一些原始的搜索功能,並知道如何使用 LWP、HTTP::Tiny、Net::FTP 和某些外部下載客戶端從網上提取分發包。

這些從一個或多個鏡像的 CPAN(綜合 Perl 存檔網路)站點提取並解壓縮到一個專用目錄中。

CPAN 模組還支援命名和帶版本的模組 捆綁。捆綁簡化了相關模組集的處理。參見下文的捆綁。

該套件包含一個會話管理器和一個緩存管理器。會話管理器跟蹤當前會話中已提取、構建和安裝的內容。緩存管理器跟蹤製作過程佔用的磁盤空間,並使用一個簡單的 FIFO 機制刪除多餘的空間。

所有提供的方法都可以以程序員風格和互動式外殼風格訪問。

CPAN::shell([$prompt, $command]) 開始互動模式

運行以下命令進入互動模式

perl -MCPAN -e shell

cpan

這將使您進入一個 readline 介面。如果安裝了 Term::ReadKeyTerm::ReadLine::PerlTerm::ReadLine::Gnu 中的任何一個,將支援歷史記錄和命令完成。

一旦處於命令行模式,輸入 h 以獲得一頁式幫助;其餘內容應該是不言而喻的。

函數調用 shell 接受兩個可選參數:一個是提示,第二個是默認的初始命令行(僅在安裝了真正的 ReadLine 介面模組時有效)。

互動模式的最常見用法是

尋找作者、捆綁、發布文件和模組

對於每個類別的四個相應的單字母命令 abdm,還有另一個命令 i 用於前述的四個中的任何一個。每個四個實體都以稍有不同的方法實現,以顯示對象。

這些命令的參數要麼是與對象的識別字符串完全匹配的字符串,要麼是對對象的各種屬性進行不區分大小寫匹配的正則表達式。當您用斜線將其括起來時,解析器只會識別正則表達式。

原則是找到的對象數量將影響項目的顯示方式。如果搜索找到一個項目,則結果將使用相當冗長的方法 as_string 顯示,但如果找到多個項目,則每個對象將使用簡潔的方法 as_glimpse 顯示。

例子

cpan> m Acme::MetaSyntactic
Module id = Acme::MetaSyntactic
    CPAN_USERID  BOOK (Philippe Bruhat (BooK) <[...]>)
    CPAN_VERSION 0.99
    CPAN_FILE    B/BO/BOOK/Acme-MetaSyntactic-0.99.tar.gz
    UPLOAD_DATE  2006-11-06
    MANPAGE      Acme::MetaSyntactic - Themed metasyntactic variables names
    INST_FILE    /usr/local/lib/perl/5.10.0/Acme/MetaSyntactic.pm
    INST_VERSION 0.99
cpan> a BOOK
Author id = BOOK
    EMAIL        [...]
    FULLNAME     Philippe Bruhat (BooK)
cpan> d BOOK/Acme-MetaSyntactic-0.99.tar.gz
Distribution id = B/BO/BOOK/Acme-MetaSyntactic-0.99.tar.gz
    CPAN_USERID  BOOK (Philippe Bruhat (BooK) <[...]>)
    CONTAINSMODS Acme::MetaSyntactic Acme::MetaSyntactic::Alias [...]
    UPLOAD_DATE  2006-11-06
cpan> m /lorem/
Module  = Acme::MetaSyntactic::loremipsum (BOOK/Acme-MetaSyntactic-0.99.tar.gz)
Module    Text::Lorem            (ADEOLA/Text-Lorem-0.3.tar.gz)
Module    Text::Lorem::More      (RKRIMEN/Text-Lorem-More-0.12.tar.gz)
Module    Text::Lorem::More::Source (RKRIMEN/Text-Lorem-More-0.12.tar.gz)
cpan> i /berlin/
Distribution    BEATNIK/Filter-NumberLines-0.02.tar.gz
Module  = DateTime::TimeZone::Europe::Berlin (DROLSKY/DateTime-TimeZone-0.7904.tar.gz)
Module    Filter::NumberLines    (BEATNIK/Filter-NumberLines-0.02.tar.gz)
Author          [...]

這些示例說明了幾個方面:前三個查詢直接針對模塊、作者或發行版,並且結果確實只有一個。最後兩個使用正則表達式並且結果有多個。最後一個同時針對包、模塊、作者和發行版。當有多個結果可用時,它們以一行格式打印。

get, make, test, install, clean 模塊或發行版

這些命令接受任意數量的參數並調查執行操作所需的內容。參數處理如下:

known module name in format Foo/Bar.pm   module
other embedded slash                     distribution
  - with trailing slash dot              directory
enclosing slashes                        regexp
known module name in format Foo::Bar     module

如果參數是分發文件名(通過嵌入的斜線識別),則進行處理。如果它是一個模塊,CPAN 確定包含此模塊的分發文件並處理該文件,跟隨模塊的 META.yml 或 Makefile.PL 中命名的任何依賴項(此行為由配置參數 prerequisites_policy 控制)。如果一個參數被斜線括起來,則將其視為正則表達式:它將被展開,如果結果是單個對象(分發、包或模塊),則處理該對象。

例子

install Dummy::Perl                   # installs the module
install AUXXX/Dummy-Perl-3.14.tar.gz  # installs that distribution
install /Dummy-Perl-3.14/             # same if the regexp is unambiguous

get 下載一個分發文件並解壓縮它,make 構建它,test 運行測試套件,install 安裝它。

任何 maketest 都會無條件運行。一個

install <distribution_file>

也將無條件運行。但對於

install <module>

CPAN 檢查是否需要安裝,如果包含模塊的分發文件不需要更新,則打印 模塊已經是最新的

CPAN 還跟踪了在當前會話中所做的工作並且不會嘗試再次構建包,無論成功與否。如果測試成功運行過,則不重複測試運行。安裝運行也是一樣的。

在另一個命令(目前為:getmaketestinstall)之前,force pragma 可以執行命令並嘗試繼續繞過某些錯誤。請參閱下面有關forcefforce pragma 的部分。

notest pragma 跳過構建過程中的測試部分。

例子

cpan> notest install Tk

clean 命令導致

make clean

在發行文件的工作目錄中執行。

readmeperldoclook 模塊或發行版

readme 顯示相關發行版的 README 文件。Look 獲取並解壓縮(如果尚未完成)發行文件,切換到適當的目錄並在該目錄中打開一個子殼程式過程。perldoc 以 HTML 或純文本格式顯示模塊的 pod 文件。

ls 作者
ls globbing_expression

第一種形式列出作者的 CPAN 目錄中的所有發行文件,這些文件存儲在 CPAN 上分發的 CHECKSUMS 文件中。列表遞歸到子目錄。

第二種形式使用類似以下示例中的 shell globbing 限制或擴展輸出。

ls JV/make*
ls GSAR/*make*
ls */*make*

最後一個示例非常緩慢,並且輸出額外的進度指示器,這會破壞結果的對齊。

請注意,globbing 只列出明確要求的目錄,例如 FOO/* 將不會列出 FOO/bar/Acme-Sthg-n.nn.tar.gz。這可能被視為一個錯誤,可能在將來的某個版本中更改。

failed

failed 命令報告在當前運行的 shell 會話中因某種原因失敗的所有發行版,在maketestinstall中。

會話間的持久性

如果安裝了YAMLYAML::Syck模塊,則會在每個步驟後將所有模塊的內部狀態記錄到磁盤上。文件包含當前運行的 perl 版本的簽名,以供以後查看。

如果配置變量build_dir_reuse設置為真值,則 CPAN.pm 讀取收集的 YAML 文件。如果存儲的簽名與當前運行的 perl 匹配,則將存儲的狀態加載到內存中,從而有效地建立了會話間的持久性。

forcefforce pragma

為了加快複雜安裝情境的速度,CPAN.pm 會追蹤它已經完成的工作,並拒絕再次執行某些操作。一次 getmakeinstall 不會重複執行。只有在前一次測試失敗時,才會重複執行 test。當 CPAN.pm 拒絕再次執行某些操作時,所顯示的診斷訊息是 已經 unwrapped|made|tested successfully 或類似的。另一種情況是,如果對應的 test 不成功,CPAN 就會拒絕執行 install

在所有這些情況下,使用者可以通過在命令前加上 force 來覆蓋這種固執的行為,例如

cpan> force get Foo
cpan> force make AUTHOR/Bar-3.14.tar.gz
cpan> force test Baz
cpan> force install Acme::Meta

每個 強制 命令都會使用其相應部分的記憶體。

fforce pragma 是一種模擬 force get 的變體,它會擦除整個記憶體,然後執行指定的操作,從頭重新啟動整個 get/make/test/install 程序。

鎖檔

互動式會話會維護一個鎖檔,默認為 ~/.cpan/.lock。批次作業可以在沒有鎖檔的情況下運行,並且不會相互干擾。

當另一個進程持有鎖檔時,shell 提供運行在 降級模式 的選項。這是一個實驗性的功能,尚未經過很好的測試。然後,這個第二個 shell 不會寫入歷史檔案,不使用元數據檔案,並且具有不同的提示符。

訊號

CPAN.pm 為 SIGINT 和 SIGTERM 安裝訊號處理程序。當您在 cpan-shell 中時,預期您可以隨時按下 ^C 鍵,然後返回到 cpan-shell 提示符。SIGTERM 會導致 cpan-shell 執行清理並離開 shell 迴圈。您可以通過發送兩個連續的 SIGINT 來模擬 SIGTERM 的效果,通常是通過兩次按下 ^C 鍵。

CPAN.pm 忽略 SIGPIPE。如果使用者設置了 inactivity_timeout,則在執行 perl Makefile.PLperl Build.PL 子進程期間會使用 SIGALRM。在模組版本解析期間也會使用 SIGALRM,並由 version_timeout 控制。

CPAN::Shell

Shell 介面中可用的命令是 CPAN::Shell 套件中的方法。如果您輸入 shell 命令,則您的輸入會由 Text::ParseWords::shellwords() 例程拆分,它的操作方式類似於大多數 shell。第一個字被解釋為要調用的方法,其餘的字被視為方法的參數。通過以文字反斜線結束一行來支持連續行。

autobundle

autobundle 將一個捆綁檔寫入到 $CPAN::Config->{cpan_home}/Bundle 目錄中。該檔案包含所有從 CPAN 獲得並當前安裝在 @INC 中的模組列表。每個發行版的重複項目都會被壓制。捆綁檔的名稱基於當前日期和一個計數器,例如 Bundle/Snapshot_2012_05_21_00.pm。這通過運行 cpan Bundle::Snapshot_2012_05_21_00 或從 CPAN shell 安裝 Bundle::Snapshot_2012_05_21_00 來再次安裝。

返回值:寫入文件的路徑。

主機

注意:此功能仍處於 alpha 狀態,可能在 CPAN.pm 的未來版本中更改。

此命令提供最近下載活動的統計概述。此數據收集在您的 cpan_home 目錄中的 YAML 文件 FTPstats.yml 中。如果未配置 YAML 模塊或未安裝 YAML,則不提供統計信息。

install_tested

安裝所有已成功測試但尚未安裝的發行版。另請參閱 is_tested

is_tested

列出所有已成功測試但尚未安裝的發行版的構建目錄。另請參閱 install_tested

mkmyconfig

mkmyconfig() 將您自己的 CPAN::MyConfig 文件寫入您的 ~/.cpan/ 目錄,以便您可以保存自己的偏好,而不是系統範圍的偏好。

r [模組|/正則表達式/]...

掃描當前的 perl 安裝,查找在 CPAN 上有更新版本可用的模組並列出它們的清單。如果不帶參數調用,則列出所有潛在的升級;如果帶有參數,則將列表過濾為給定的模組和正則表達式。

列表看起來像這樣

Package namespace         installed    latest  in CPAN file
CPAN                        1.94_64    1.9600  ANDK/CPAN-1.9600.tar.gz
CPAN::Reporter               1.1801    1.1902  DAGOLDEN/CPAN-Reporter-1.1902.tar.gz
YAML                           0.70      0.73  INGY/YAML-0.73.tar.gz
YAML::Syck                     1.14      1.17  AVAR/YAML-Syck-1.17.tar.gz
YAML::Tiny                     1.44      1.50  ADAMK/YAML-Tiny-1.50.tar.gz
CGI                            3.43      3.55  MARKSTOS/CGI.pm-3.55.tar.gz
Module::Build::YAML            1.40      1.41  DAGOLDEN/Module-Build-0.3800.tar.gz
TAP::Parser::Result::YAML      3.22      3.23  ANDYA/Test-Harness-3.23.tar.gz
YAML::XS                       0.34      0.35  INGY/YAML-LibYAML-0.35.tar.gz

它壓制了 在 CPAN 文件中 列中的重複項,因此只列出具有多個可升級模組的發行版一次。

請注意,列表未排序。

recent ***實驗性命令***

recent 命令下載最近上傳到 CPAN 的清單並顯示它們 慢慢地。當命令運行時,$SIG{INT} 顯示當前項目後退出循環。

注意:此命令需要安裝 XML::LibXML。

注意:此整個命令目前僅是一個 hack,可能在 CPAN.pm 的將來版本中更改,但一般方法可能保持不變。

注意:另請參見 smoke

重新編譯

recompile()是一個特殊的命令,不帶任何參數運行,並以強制模式運行make/test/install週期,以強制執行所有已安裝的動態可加載擴展(也稱為XS模塊)。該命令的主要目的是完成網絡安裝。想象一下,您有一個用於兩種不同架構的共同源代碼樹。您決定進行完全獨立的新安裝。您首先在一個架構上啟動,並在之前生成的Bundle文件的幫助下進行。CPAN會為您安裝整個Bundle,但是當您試圖在第二個架構上重複此作業時,CPAN對所有模塊都會回應“Foo已經是最新版本”的消息。因此,您在第二個架構上調用CPAN的recompile命令,問題解決。

recompile的另一個常見用途是在perl破壞二進制兼容性的情況下充當救援。如果CPAN使用的模塊之一反過來依賴於二進制兼容性(因此您無法運行CPAN命令),那麼您應該嘗試使用CPAN::Nox模塊進行恢復。

報告 Bundle|Distribution|Module

report命令臨時打開test_report配置變量,然後使用給定的參數運行force test命令。force指示重新運行測試並重復之前可能失敗的每個步驟。

煙霧 ***實驗性命令***

*** 警告:此命令從CPAN下載並執行軟件到您的電腦,其狀態完全未知。您永遠不應該使用常規帳戶執行此操作,最好使用一台專用的、良好分離且安全的機器進行此操作。***

smoke命令使用由recent命令提供的最近上傳到CPAN的軟件清單並對它們進行測試。在命令運行時,$SIG{INT}被定義為當前項應被跳過。

注意:此整個命令目前僅是一個 hack,可能在 CPAN.pm 的將來版本中更改,但一般方法可能保持不變。

注意:另請參見最近的

升級 [模塊|/正則表達式/]...

upgrade命令首先使用給定的參數運行r命令,然後安裝該命令列出的所有模塊的最新版本。

四個CPAN::*類別:Author、Bundle、Module、Distribution

雖然它可能被視為內部,但類別層次結構對用戶和程式設計師都很重要。CPAN.pm 處理上述提到的四個類別,這些類別都共享一組方法。傳統的單一多型性正在生效。一個元類別物件註冊所有類型的所有物件,並使用字串索引它們。引用物件的字串具有一個分離的命名空間(嗯,不完全分離)。

      Namespace                         Class

words containing a "/" (slash)      Distribution
 words starting with Bundle::          Bundle
       everything else            Module or Author

模組知道它們關聯的發行物件。它們總是參照最新的官方發行版。開發人員可以將他們的版本標記為不穩定的開發版本(通過將底線插入模組版本號,當您運行 'make dist' 時,這也會反映在發行名稱中),因此最熱門和最新的發行版並不總是默認選擇。如果一個名為 Foo 的模組在 CPAN 上以版本 1.23 和 1.23_90 的形式存在,CPAN.pm 提供了一種方便的方法來安裝版本 1.23,方法是

install Foo

這將安裝完整的發行檔案(比如 BAR/Foo-1.23.tar.gz),以及所有相關材料。但是,如果您想安裝版本 1.23_90,您需要知道發行檔案在 CPAN 上相對於 authors/id/ 目錄的位置。如果作者是 BAR,這可能是 BAR/Foo-1.23_90.tar.gz;所以您需要說

install BAR/Foo-1.23_90.tar.gz

第一個例子將由 CPAN::Module 類的物件驅動,第二個例子將由 CPAN::Distribution 類的物件驅動。

集成本地目錄

注意:此功能仍處於 alpha 狀態,可能在 CPAN.pm 的未來版本中更改。

分發物件通常是來自 CPAN 的發行物,但是對於 Distribution 物件,也存在一個稍微退化的情況,即在本地磁盤上保存的專案。這些分發物件與本地目錄同名,並以點結尾。一個單獨的點也被允許代表當 CPAN.pm 使用時的當前目錄。所有動作,如 maketestinstall 都直接應用於該目錄。這使得命令 cpan . 具有一個有趣的功能:儘管安裝 CPAN 模組的正常口頭禪是

perl Makefile.PL                 perl Build.PL
       ( go and get prerequisites )
make                             ./Build
make test                        ./Build test
make install                     ./Build install

命令 cpan . 一次完成所有操作。它找出哪一個口頭禪是適用的,獲取並安裝所有先決條件,遞歸地處理它們,最後完成模組在當前目錄中的安裝,無論它是 CPAN 模組還是其他模組。

典型的使用情況是用於私有模組或來自本地磁盤上遠程存儲庫的專案的工作副本。

重定向

一般的 shell 重定向符號 | > 只有在被空白字符包圍時,才會被 cpan shell 辨識。因此,將輸出導向到分頁器或將輸出重定向到文件的操作與常規 shell 中的操作類似,但必須多輸入一些空格。

插件支持 ***實驗性***

插件是實現當前八種方法之一的對象。

pre_get
post_get
pre_make
post_make
pre_test
post_test
pre_install
post_install

plugin_list 配置參數保存的是形式為字符串的列表。

Modulename=arg0,arg1,arg2,arg3,...

例如

CPAN::Plugin::Flurb=dir,/opt/pkgs/flurb/raw,verbose,1

運行時,每個列出的插件都通過運行等效於以下虛擬代碼的方式被實例化為單例對象

my $plugin = <string representation from config>;
<generate Modulename and arguments from $plugin>;
my $p = $instance{$plugin} ||= Modulename->new($arg0,$arg1,...);

生成的單例對象從實例化一直保留到 shell 會話結束。在運行 cpan shell 時,它會在上述列出的八個參考點的每個參考點檢查所有已激活的插件,並且如果為該對象實現了該方法,則運行相應的方法。該方法將以活動的 CPAN::Distribution 對象作為參數傳遞。

配置

當第一次使用 CPAN 模塊時,會出現配置對話框,嘗試確定一些特定於站點的選項。對話框的結果存儲在一個哈希引用中,即 $CPAN::Config ,存儲在文件 CPAN/Config.pm 中。

在用戶特定文件中,可以覆蓋 CPAN/Config.pm 文件中定義的默認值:CPAN/MyConfig.pm。這樣的文件最好放在 $HOME/.cpan/CPAN/MyConfig.pm 中,因為在使用 use() 或 require() 語句之前,會將 $HOME/.cpan 添加到 CPAN 模塊的搜索路徑中。mkmyconfig 命令會為您編寫此文件。

o conf 命令有各種功能

完成支持

如果安裝了 ReadLine 模塊,您可以在命令行的任何位置按 TAB,o conf 將為內置子命令和/或配置變量名提供完成。

顯示幫助信息:o conf help

顯示簡短的幫助信息

顯示當前值:o conf [KEY]

顯示此配置變量的當前值。如果沒有 KEY,則顯示所有子命令和配置變量。

例子

o conf shell

如果 KEY 以斜杠開頭並結尾,則其中的字符串被視為正則表達式,僅顯示與此正則表達式匹配的鍵

例子

o conf /color/
改變純量值:o conf KEY VALUE

將設定變數 KEY 設置為 VALUE。在 shell 中可以像平常一樣使用空字符串,即 ''""

例子

o conf wget /usr/bin/wget
改變列表值:o conf KEY SHIFT|UNSHIFT|PUSH|POP|SPLICE|LIST

如果配置變數名稱以 list 結尾,則它是一個列表。 o conf KEY shift 移除列表的第一個元素,o conf KEY pop 移除列表的最後一個元素。 o conf KEYS unshift LIST 在列表的開始添加一個值列表,o conf KEYS push LIST 在列表的末尾添加一個值列表。

同樣地,o conf KEY splice LIST 將 LIST 傳遞給相應的拼接命令。

最後,任何其他參數列表都被視為 KEY 變數的新列表值,舊值將被丟棄。

例子

o conf urllist unshift http://cpan.dev.local/CPAN
o conf urllist splice 3 1
o conf urllist http://cpan1.local http://cpan2.local ftp://ftp.perl.org
恢復到保存的狀態:o conf defaults

將所有配置變數還原為保存的配置文件中的狀態。

保存配置:o conf commit

將所有配置變數保存到當前的配置文件(在啟動時加載的 CPAN/Config.pm 或 CPAN/MyConfig.pm)。

隨時可以通過在 CPAN shell 中發出命令 o conf init 來重新啟動配置對話框。可以通過發出 o conf init WORD 命令來運行配置對話框的子集,其中 WORD 是任何有效的配置變數或正則表達式。

配置變數

哈希引用 $CPAN::Config 中目前定義的以下鍵

allow_installing_module_downgrades
                   allow or disallow installing module downgrades
allow_installing_outdated_dists
                   allow or disallow installing modules that are
                   indexed in the cpan index pointing to a distro
                   with a higher distro-version number
applypatch         path to external prg
auto_commit        commit all changes to config variables to disk
build_cache        size of cache for directories to build modules
build_dir          locally accessible directory to build modules
build_dir_reuse    boolean if distros in build_dir are persistent
build_requires_install_policy
                   to install or not to install when a module is
                   only needed for building. yes|no|ask/yes|ask/no
bzip2              path to external prg
cache_metadata     use serializer to cache metadata
check_sigs         if signatures should be verified
cleanup_after_install
                   remove build directory immediately after a
                   successful install and remember that for the
                   duration of the session
colorize_debug     Term::ANSIColor attributes for debugging output
colorize_output    boolean if Term::ANSIColor should colorize output
colorize_print     Term::ANSIColor attributes for normal output
colorize_warn      Term::ANSIColor attributes for warnings
commandnumber_in_prompt
                   boolean if you want to see current command number
commands_quote     preferred character to use for quoting external
                   commands when running them. Defaults to double
                   quote on Windows, single tick everywhere else;
                   can be set to space to disable quoting
connect_to_internet_ok
                   whether to ask if opening a connection is ok before
                   urllist is specified
cpan_home          local directory reserved for this package
curl               path to external prg
dontload_hash      DEPRECATED
dontload_list      arrayref: modules in the list will not be
                   loaded by the CPAN::has_inst() routine
ftp                path to external prg
ftp_passive        if set, the environment variable FTP_PASSIVE is set
                   for downloads
ftp_proxy          proxy host for ftp requests
ftpstats_period    max number of days to keep download statistics
ftpstats_size      max number of items to keep in the download statistics
getcwd             see below
gpg                path to external prg
gzip               location of external program gzip
halt_on_failure    stop processing after the first failure of queued
                   items or dependencies
histfile           file to maintain history between sessions
histsize           maximum number of lines to keep in histfile
http_proxy         proxy host for http requests
inactivity_timeout breaks interactive Makefile.PLs or Build.PLs
                   after this many seconds inactivity. Set to 0 to
                   disable timeouts.
index_expire       refetch index files after this many days
inhibit_startup_message
                   if true, suppress the startup message
keep_source_where  directory in which to keep the source (if we do)
load_module_verbosity
                   report loading of optional modules used by CPAN.pm
lynx               path to external prg
make               location of external make program
make_arg           arguments that should always be passed to 'make'
make_install_make_command
                   the make command for running 'make install', for
                   example 'sudo make'
make_install_arg   same as make_arg for 'make install'
makepl_arg         arguments passed to 'perl Makefile.PL'
mbuild_arg         arguments passed to './Build'
mbuild_install_arg arguments passed to './Build install'
mbuild_install_build_command
                   command to use instead of './Build' when we are
                   in the install stage, for example 'sudo ./Build'
mbuildpl_arg       arguments passed to 'perl Build.PL'
ncftp              path to external prg
ncftpget           path to external prg
no_proxy           don't proxy to these hosts/domains (comma separated list)
pager              location of external program more (or any pager)
password           your password if you CPAN server wants one
patch              path to external prg
patches_dir        local directory containing patch files
perl5lib_verbosity verbosity level for PERL5LIB additions
plugin_list        list of active hooks (see Plugin support above
                   and the CPAN::Plugin module)
prefer_external_tar
                   per default all untar operations are done with
                   Archive::Tar; by setting this variable to true
                   the external tar command is used if available
prefer_installer   legal values are MB and EUMM: if a module comes
                   with both a Makefile.PL and a Build.PL, use the
                   former (EUMM) or the latter (MB); if the module
                   comes with only one of the two, that one will be
                   used no matter the setting
prerequisites_policy
                   what to do if you are missing module prerequisites
                   ('follow' automatically, 'ask' me, or 'ignore')
                   For 'follow', also sets PERL_AUTOINSTALL and
                   PERL_EXTUTILS_AUTOINSTALL for "--defaultdeps" if
                   not already set
prefs_dir          local directory to store per-distro build options
proxy_user         username for accessing an authenticating proxy
proxy_pass         password for accessing an authenticating proxy
pushy_https        use https to cpan.org when possible, otherwise use http
                   to cpan.org and issue a warning
randomize_urllist  add some randomness to the sequence of the urllist
recommends_policy  whether recommended prerequisites should be included
scan_cache         controls scanning of cache ('atstart', 'atexit' or 'never')
shell              your favorite shell
show_unparsable_versions
                   boolean if r command tells which modules are versionless
show_upload_date   boolean if commands should try to determine upload date
show_zero_versions boolean if r command tells for which modules $version==0
suggests_policy    whether suggested prerequisites should be included
tar                location of external program tar
tar_verbosity      verbosity level for the tar command
term_is_latin      deprecated: if true Unicode is translated to ISO-8859-1
                   (and nonsense for characters outside latin range)
term_ornaments     boolean to turn ReadLine ornamenting on/off
test_report        email test reports (if CPAN::Reporter is installed)
trust_test_report_history
                   skip testing when previously tested ok (according to
                   CPAN::Reporter history)
unzip              location of external program unzip
urllist            arrayref to nearby CPAN sites (or equivalent locations)
urllist_ping_external
                   use external ping command when autoselecting mirrors
urllist_ping_verbose
                   increase verbosity when autoselecting mirrors
use_prompt_default set PERL_MM_USE_DEFAULT for configure/make/test/install
use_sqlite         use CPAN::SQLite for metadata storage (fast and lean)
username           your username if you CPAN server wants one
version_timeout    stops version parsing after this many seconds.
                   Default is 15 secs. Set to 0 to disable.
wait_list          arrayref to a wait server to try (See CPAN::WAIT)
wget               path to external prg
yaml_load_code     enable YAML code deserialisation via CPAN::DeferredCode
yaml_module        which module to use to read/write YAML files

您可以使用以下指定的 o confo conf init 命令在 cpan shell 中交互式地設置和查詢每個選項。

o conf <scalar option>

打印當前的 純量選項

o conf <scalar option> <value>

標量選項的值設置為

o conf <list option>

以MakeMaker的neatvalue格式列印列表選項的當前值。

o conf <list option> [shift|pop]

列表選項中的數組進行shift或pop操作

o conf <list option> [unshift|push|splice] <list>

與對應的perl命令類似。

互動編輯:o conf init [MATCH|LIST]

運行一個互動配置對話框以匹配變量。沒有參數運行對話框時,將對所有支持的配置變量進行對話框。要指定一個MATCH,參數必須用斜杠括起來。

例子

o conf init ftp_passive ftp_proxy
o conf init /color/

注意:通過此方法設置配置變量通常提供了有關變量功能的更多解釋,比manpage更詳細。

CPAN::anycwd($path):關於配置變量getcwd的注意事項

CPAN.pm經常更改當前工作目錄,並需要確定其自身的當前工作目錄。默認情況下,它使用Cwd::cwd,但如果出於某些原因在您的系統上不起作用,則根據以下表格配置替代方案

cwd

調用Cwd::cwd

getcwd

調用Cwd::getcwd

fastcwd

調用Cwd::fastcwd

getdcwd

調用Cwd::getdcwd

backtickcwd

調用外部命令cwd。

關於urllist參數格式的注意事項

urllist parameters are URLs according to RFC 1738. We do a little guessing if your URL is not compliant, but if you have problems with file URLs, please try the correct format. Either

file://127.0.0.1/whatever/ftp/pub/CPAN/

file:///home/ftp/pub/CPAN/

urllist 參數具有 CD-ROM 支援

配置表的 urllist 參數包含用於下載的 URL 列表。如果列表中包含任何 file URL,CPAN 將始終首先嘗試那裡。此功能對於索引文件是禁用的。因此,對於具有 CPAN 內容的 CD-ROM 的擁有者的建議是:在 urllist 的末尾包含您的本地、可能過時的 CD-ROM 作為 file URL,例如:

o conf urllist push file://127.0.0.1/CDROM/CPAN

然後,CPAN.pm 將從 urllist 開頭的 CPAN 站點之一中提取索引文件。它稍後將檢查每個模塊,以查看是否存在最新版本的本地副本。

urllist 的另一個特殊之處在於,我們可以成功從上次文件中提取的網站將自動獲得優先權令牌,並作為下一個請求的第一個網站進行嘗試。因此,如果您在運行時添加新站點,可能會發生先前首選站點再次嘗試的情況。這意味著如果您希望在下一次傳輸中禁止一個站點,則必須將其從 urllist 中明確刪除。

維護 urllist 參數

如果您安裝了 YAML.pm(或一些其他在 yaml_module 中配置的 YAML 模塊),CPAN.pm 將收集有關最近下載的一些統計數據。您可以使用 hosts 命令查看統計信息,或直接查看您的 cpan_home 目錄中的 FTPstats.yml 文件。

為了獲得一些有趣的統計信息,建議設置 randomize_urllist;這將在 URL 選擇中引入一定程度的隨機性。

requiresbuild_requires 依賴聲明

自 CPAN.pm 版本 1.88_51 起,由發行版宣告為 build_requires 的模組將根據配置變數 build_requires_install_policy 處理方式不同。通過將 build_requires_install_policy 設置為 no,此類模組將不會安裝。它僅被建構和測試,然後保留在已測試但未安裝的模組列表中。因此,在依賴模組的建構期間,通過將 blib/archblib/lib 目錄的路徑整合到環境變數 PERL5LIB 中,該模組是可用的。如果將 build_requires_install_policy 設置為 yes,則將會同樣處理宣告為 requires 和宣告為 build_requires 的模組。通過將其設置為 ask/yesask/no,CPAN.pm 將詢問用戶並相應地設置默認值。

允許安裝的_* 參數的配置

make 階段期間評估 allow_installing_* 參數。如果設置為 yes,則允許測試和安裝當前發行版,否則不起作用。如果設置為 no,則可能會中止建構(阻止測試和安裝),具體取決於 blib/ 目錄的內容。 blib/ 目錄是通常會在 install 階段安裝的所有文件的目錄。

allow_installing_outdated_distsblib/ 目錄與 CPAN 索引進行比較。如果它在那裡發現屬於不同發行版的東西,則根據索引,它將中止當前建構。

allow_installing_module_downgradesblib/ 目錄與已安裝模組進行比較,實際上是比較它們的版本號,由 ExtUtils::MakeMaker 或等效工具確定。如果要安裝的模組會導致已安裝模組降級,則當前建構將被中止。

當一個 distroprefs 文件要求通過 goto 安裝一個過時的 dist,而 allow_installing_outdated_dists 禁止這樣做時,會出現一個有趣的轉折。如果沒有額外的規定,這將讓 allow_installing_outdated_dists 獲勝,而 distroprefs 輸掉。因此,在這種情況下的正確安排是為 goto 指向的發行版撰寫第二個 distroprefs 文件,並在那裡覆蓋 cpanconfig。例如:

---
match:
  distribution: "^MAUKE/Keyword-Simple-0.04.tar.gz"
goto: "MAUKE/Keyword-Simple-0.03.tar.gz"
---
match:
  distribution: "^MAUKE/Keyword-Simple-0.03.tar.gz"
cpanconfig:
  allow_installing_outdated_dists: yes

單個發行版的配置(Distroprefs

(注意:此功能已在 CPAN.pm 1.8854 中引入)

CPAN 上的發行版通常會按照我們所謂的 CPAN 箴言行事。或者自從 Module::Build 出現以來,我們應該談論兩個箴言

perl Makefile.PL     perl Build.PL
make                 ./Build
make test            ./Build test
make install         ./Build install

但是一些模塊無法按照這個箴言構建。它們試圖通過環境、額外的參數或交互式方式從用戶那裡獲取一些額外的數據,從而干擾大包裝的安裝,如 Phalanx100 或具有許多依賴的模塊,如 Plagger。

CPAN.pm 的 distroprefs 系統解決了這個問題,允許用戶在 YAML 文件中指定額外的信息和配方,以便

請參閱附帶 CPAN.pm 發行版中的 distroprefs/ 目錄中的 YAML 和 Data::Dumper 文件作為示例。

文件名

YAML 文件本身必須具有 .yml 擴展名;所有其他文件都將被忽略(有兩個例外情況,請參見下面的 備用 Data::Dumper 和 Storable)。 包含目錄可以在 CPAN.pm 中的 prefs_dir 配置變量中指定。 在 CPAN shell 中嘗試 o conf init prefs_dir 以設置並激活 distroprefs 系統。

每個 YAML 文件可以包含符合 YAML 規範的任意文檔,每個文檔都被視為可以指定單個發行版處理方式的實體。

文件名可以任意選擇;CPAN.pm 始終讀取所有文件(按字母順序),並將鍵 match(請參見下面的 語言規範)視為包含匹配標準的哈希引用,以確定當前發行版是否與 YAML 文檔匹配。

回退 Data::Dumper 和 Storable

如果您配置的 yaml_module 或 YAML.pm 都未安裝,CPAN.pm 會回退使用 Data::Dumper 和 Storable,並在 prefs_dir 目錄中尋找擴展名為 .dd.st 的文件。這些文件應該包含一個或多個哈希引用。對於 Data::Dumper 生成的文件,預期應該定義 $VAR1$VAR2 等來完成。YAML shell 可以使用以下命令生成這些文件

ysh < somefile.yml > somefile.dd

對於 Storable 文件,規則是它們必須構建成這樣,即 Storable::retrieve(file) 返回一個數組引用,而數組元素代表一個 distropref 對象。從 YAML 轉換過來的形式如下

perl -MYAML=LoadFile -MStorable=nstore -e '
    @y=LoadFile(shift);
    nstore(\@y, shift)' somefile.yml somefile.st

在啟動情況下,通常只需將幾個 YAML 文件轉換為 Data::Dumper 以供關鍵模塊使用,如 YAML::SyckYAML.pmExpect.pm。如果您更喜歡 Storable 而不是 Data::Dumper,請記住提取一個寫入舊格式的 Storable 版本,以便所有其他需要讀取它們的 Storable 版本。

藍圖

以下示例包含所有支援的關鍵字和結構,但不包括可以使用代替 expecteexpect

---
comment: "Demo"
match:
  module: "Dancing::Queen"
  distribution: "^CHACHACHA/Dancing-"
  not_distribution: "\.zip$"
  perl: "/usr/local/cariba-perl/bin/perl"
  perlconfig:
    archname: "freebsd"
    not_cc: "gcc"
  env:
    DANCING_FLOOR: "Shubiduh"
disabled: 1
cpanconfig:
  make: gmake
pl:
  args:
    - "--somearg=specialcase"

  env: {}

  expect:
    - "Which is your favorite fruit"
    - "apple\n"

make:
  args:
    - all
    - extra-all

  env: {}

  expect: []

  commandline: "echo SKIPPING make"

test:
  args: []

  env: {}

  expect: []

install:
  args: []

  env:
    WANT_TO_INSTALL: YES

  expect:
    - "Do you really want to install"
    - "y\n"

patches:
  - "ABCDE/Fedcba-3.14-ABCDE-01.patch"

depends:
  configure_requires:
    LWP: 5.8
  build_requires:
    Test::Exception: 0.25
  requires:
    Spiffy: 0.30

語言規範

每個 YAML 文件代表一個單一的哈希引用。該哈希中的有效鍵如下

comment [scalar]

一個註釋

cpanconfig [hash]

暫時覆蓋各種 CPAN.pm 配置變量。

支援的有:build_requires_install_policycheck_sigsmakemake_install_make_commandprefer_installertest_report。如果您需要其他支援,請報告為錯誤。

depends [hash] *** 實驗性功能 ***

所有三種類型,即 configure_requiresbuild_requiresrequires 都支援 META.yml 規範中指定的方式。當前實現方式是將指定的依賴項與包維護者聲明的依賴項合併。在將來的實現中,這可能會更改為覆蓋原始聲明。

disabled [boolean]

指定此發行版應完全不進行處理。

features [array] *** 實驗性功能 ***

用於處理 META.yml 中 optional_features 的實驗性實現。仍需與安裝軟件協調,目前僅適用於聲明 dynamic_config=0 的 META.yml。請謹慎使用。

goto [string]

要安裝的委託發行版的正式名稱。當新版本雖然本身測試正常,但卻破壞了其他東西,或者已經上傳了開發版本或者分支版本,比上一個正式版本更好時,此功能很有用。

install [hash]

CPAN 歌詞的 make install./Build install 階段的處理指令。請參閱下文的 處理指令

make [hash]

CPAN 歌詞的 make./Build 階段的處理指令。請參閱下文的 處理指令

match [hash]

具有一個或多個鍵 distributionmoduleperlperlconfigenv 的哈希引用,指定文檔是否針對特定的 CPAN 發行版或安裝。以 not_ 為前綴的鍵否定對應的匹配。

相應的值被解釋為正則表達式。與 distribution 相關的將與正規發行版名稱匹配,例如 "AUTHOR/Foo-Bar-3.14.tar.gz"。

module 相關的將與發行版中的所有模塊進行匹配,直到找到一個匹配的模塊。

perl 相關的將與 $^X(但是帶有絕對路徑)進行匹配。

perlconfig 關聯的值本身是一個哈希引用,與 %Config::Config 中的相應值進行匹配。以 not_ 為前綴的鍵否定對應的匹配。

env關聯的值本身是一個哈希參考,將與%ENV哈希中的相應值進行匹配。以not_為前綴的鍵將否定相應的匹配。

如果指定了moduledistribution等多個限制,則分別計算的匹配值的結果必須全部匹配。如果是這樣,則將由YAML文檔表示的哈希參考返回為當前分發的偏好結構。

patches [array]

要通過外部補丁程序按順序應用在CPAN或本地磁盤上的補丁的數組。如果-p參數的值為01,則通過事先讀取補丁來確定。每個補丁的路徑可以是本地文件系統上的絕對路徑,也可以是相對於在patches_dir配置變量中指定的補丁目錄或以規範分發名稱的格式。有關示例,請參閱CPAN.pm分發中的distroprefs/目錄(這些示例默認未安裝)。

注意:如果已安裝了applypatch程序,CPAN::Config知道它並且由makepatch程序編寫了補丁,則CPAN.pm會讓applypatch應用補丁。makepatchapplypatch都可以從CPAN的JV/makepatch-*分發中獲取。

pl [hash]

CPAN口訣的perl Makefile.PLperl Build.PL階段的處理指令。詳情請參見下面的處理指令

test [hash]

CPAN口訣的make test./Build test階段的處理指令。詳情請參見下面的處理指令

處理指令

args [array]

要添加到命令行的參數

命令行

通過system()運行的完整命令行。在執行期間,將環境變量PERL設置為$^X(但帶有絕對路徑)。如果指定了commandline,則不使用args

eexpect [hash]

擴展的expect。這是一個哈希參考,有四個允許的鍵,modetimeoutreusetalk

您必須安裝Expect模塊才能使用eexpect。CPAN.pm不會為您安裝它。

mode可以具有值deterministic(所有問題按照指定的順序提出)或anyorder(問題可以按任意順序提出)的情況。默認模式是deterministic

timeout表示超時時間,以秒為單位。可以使用浮點數。在mode=deterministic模式下,超時時間表示每個問題的超時時間;在mode=anyorder模式下,它表示從串流或問題接收的每個字節的超時時間。

talk是一個參考陣列,其中包含交替的問題和答案。問題是正則表達式,答案是字面字符串。Expect模組監視外部程序的執行(perl Makefile.PLperl Build.PLmake等)的串流。

對於mode=deterministic,CPAN.pm在串流匹配正則表達式時立即注入相應的答案。

對於mode=anyorder,當下一個字節的超時時間到達時,CPAN.pm立即回答問題。在此模式下,您可以使用reuse參數來決定在使用問題-答案對之後將會發生什麼。在默認情況下(reuse=0),它將從陣列中移除,避免意外再次使用。如果您想要多次回答問題Do you really want to do that,則它必須至少包含在陣列中與您想要給出答案的次數相同。將參數reuse設置為1可以使此重複變得不必要。

env [hash]

在執行命令期間設置的環境變量

expect [array]

您必須安裝Expect模組才能使用expect。CPAN.pm不會為您安裝它。

expect: <array>是這個eexpect的簡短表示法

eexpect:
	mode: deterministic
	timeout: 15
	talk: <array>

使用Kwalify進行模式驗證

如果您安裝了Kwalify模組(它是Bundle::CPANxxl的一部分),則會檢查所有您的distroprefs文件的語法正確性。

示例Distroprefs文件

CPAN.pm附帶了一組示例YAML文件。請注意,這些只是示例,不應該毫無保留地使用,因為它們無法適應每個人的需求。畢竟,要求提問的包的作者有提問的需要,所以您應該查看他們的問題並根據您的環境和需求調整示例。您已被警告:-)

程序員接口

如果您不進入shell,則shell命令可以作為方法(CPAN::Shell->install(...))和作為呼叫包中的函數(install(...))提供。在調用低級命令之前,初始化您需要的CPAN組件是有意義的,例如

CPAN::HandleConfig->load;
CPAN::Shell::setup_output;
CPAN::Index->reload;

高級命令會自動執行這些初始化。

目前只有一個具有穩定接口的類 - CPAN::Shell。在CPAN shell中可用的所有命令都是CPAN::Shell類的方法。命令行上的參數被作為方法的參數傳遞。

因此,如果您以shell命令為例

notest install A B C

實際執行的命令是

CPAN::Shell->notest("install","A","B","C");

產生模組清單的每個指令(rautobundleu)也會返回清單中所有模組的 ID 列表。

expand($type,@things)

程式中所有可用物件的 ID 都是可擴展為相應實際物件的字串,方法是使用 CPAN::Shell->expand("Module",@things)。擴展會根據給定的 @things 參數返回一組 CPAN::Module 物件的列表。在標量上下文中,它只返回列表的第一個元素。

expandany(@things)

類似於 expand,但返回適當類型的物件,即捆綁包的 CPAN::Bundle 物件,模組的 CPAN::Module 物件,以及發行版的 CPAN::Distribution 物件。注意:它不會擴展為 CPAN::Author 物件。

程式範例

這使得程式設計師能夠執行結合外殼中可用功能的操作。

# install everything that is outdated on my disk:
perl -MCPAN -e 'CPAN::Shell->install(CPAN::Shell->r)'

# install my favorite programs if necessary:
for $mod (qw(Net::FTP Digest::SHA Data::Dumper)) {
    CPAN::Shell->install($mod);
}

# list all modules on my disk that have no VERSION number
for $mod (CPAN::Shell->expand("Module","/./")) {
    next unless $mod->inst_file;
    # MakeMaker convention for undefined $VERSION:
    next unless $mod->inst_version eq "undef";
    print "No VERSION in ", $mod->id, "\n";
}

# find out which distribution on CPAN contains a module:
print CPAN::Shell->expand("Module","Apache::Constants")->cpan_file

或者,如果您想要安排一個 cron 任務來監控 CPAN,您可以列出所有需要更新的模組。首先是一個快速且骯髒的方法

perl -e 'use CPAN; CPAN::Shell->r;'

如果您不希望有任何輸出,所有模組都是最新的,則解析上述命令的輸出以匹配正則表達式 /模組是最新的/,並決定僅在不匹配時發送輸出。

如果您更喜歡以一個程序員風格在一個單一進程中完成,類似這樣的方法可能更適合您

# list all modules on my disk that have newer versions on CPAN
for $mod (CPAN::Shell->expand("Module","/./")) {
  next unless $mod->inst_file;
  next if $mod->uptodate;
  printf "Module %s is installed as %s, could be updated to %s from CPAN\n",
      $mod->id, $mod->inst_version, $mod->cpan_version;
}

如果每天輸出太多,您可能只想監視三個模組。您可以寫成

for $mod (CPAN::Shell->expand("Module","/Apache|LWP|CGI/")) {

作為第一行。或者您可以結合上述一些技巧

# watch only for a new mod_perl module
$mod = CPAN::Shell->expand("Module","mod_perl");
exit if $mod->uptodate;
# new mod_perl arrived, let me know all update recommendations
CPAN::Shell->r;

其他類別中的方法

CPAN::Author::as_glimpse()

返回作者的一行描述

CPAN::Author::as_string()

返回作者的多行描述

CPAN::Author::email()

返回作者的電子郵件地址

CPAN::Author::fullname()

返回作者的名稱

CPAN::Author::name()

fullname 的別名

CPAN::Bundle::as_glimpse()

返回捆綁包的一行描述

CPAN::Bundle::as_string()

返回捆绑包的多行描述

CPAN::Bundle::clean()

递归地在捆绑包中包含的所有项目上运行 clean 方法。

CPAN::Bundle::contains()

返回捆绑包中包含的对象的 ID 列表。相关对象可以是捆绑包、模块或分发。

CPAN::Bundle::force($method,@args)

强制 CPAN 执行其通常会拒绝执行的任务。Force 接受一个要调用的方法名称作为参数,以及应传递给所调用方法的任意数量的额外参数。对象的内部进行必要的更改,以便 CPAN.pm 不拒绝执行操作。将 force 递归传递到所有包含的对象中。另请参阅上面关于 forcefforce 声明的部分。

CPAN::Bundle::get()

递归地在捆绑包中包含的所有项目上运行 get 方法。

CPAN::Bundle::inst_file()

返回捆绑包在 @INC 或 $CPAN::Config->{cpan_home} 中安装的最高版本。请注意,这与 CPAN::Module::inst_file 不同。

CPAN::Bundle::inst_version()

类似于 CPAN::Bundle::inst_file,但返回 $VERSION

CPAN::Bundle::uptodate()

如果捆绑包本身和所有成员都是最新的,则返回 1。

CPAN::Bundle::install()

递归地在捆绑包中包含的所有项目上运行 install 方法。

CPAN::Bundle::make()

递归地在捆绑包中包含的所有项目上运行 make 方法。

CPAN::Bundle::readme()

递归地在捆绑包中包含的所有项目上运行 readme 方法。

CPAN::Bundle::test()

递归地在捆绑包中包含的所有项目上运行 test 方法。

CPAN::Distribution::as_glimpse()

返回分发的一行描述

CPAN::Distribution::as_string()

返回分發的多行描述

CPAN::Distribution::author

返回上傳此分發的維護者的 CPAN::Author 物件

CPAN::Distribution::pretty_id()

返回形式為 "AUTHORID/TARBALL" 的字符串,其中 AUTHORID 是作者的 PAUSE ID,TARBALL 是分發的文件名。

CPAN::Distribution::base_id()

返回不帶任何存檔後綴的分發文件名。例如 "Foo-Bar-0.01"

CPAN::Distribution::clean()

更改分發已解壓縮的目錄並在其中運行 make clean

CPAN::Distribution::containsmods()

返回分發文件中包含的模組的 ID 列表。僅對列在 02packages.details.txt.gz 文件中的分發起作用。這通常意味著僅涵蓋分發的最新版本。

CPAN::Distribution::cvs_import()

更改分發已解壓縮的目錄並運行類似以下的操作

cvs -d $cvs_root import -m $cvs_log $cvs_dir $userid v$version

CPAN::Distribution::dir()

返回將此分發解壓縮到的目錄。

CPAN::Distribution::force($method,@args)

強制 CPAN 執行通常會拒絕執行的任務。Force 接受方法名作為參數,以及應傳遞給被調用方法的任意數量的額外參數。對象內部進行必要的更改,以使 CPAN.pm 不會拒絕採取行動。另請參見上面關於 forcefforce 指示詞的部分。

CPAN::Distribution::get()

從 CPAN 下載分發並解壓縮它。如果分發在當前會話中已經被下載和解壓縮,則不執行任何操作。

CPAN::Distribution::install()

更改分發已解壓縮的目錄並在其中運行外部命令 make install。如果尚未運行 make,則首先運行它。無論如何都會執行 make test,如果失敗,則取消安裝。可以讓 force 為您運行 install 來避免取消安裝。

這個安裝方法只有在沒有任何相依性的情況下才能安裝發行版。要安裝一個物件及其所有相依性,請使用 CPAN::Shell->install。

請注意,install() 不提供有意義的返回值。請參閱 uptodate()。

CPAN::Distribution::isa_perl()

如果此發行檔案似乎是 Perl 發行,則返回 1。通常只從檔案名稱派生,但 CPAN 的索引可能包含提示,以實現對其他檔案名稱的真值返回。

CPAN::Distribution::look()

變更到已解壓縮發行版的目錄並在其中開啟子殼層。退出子殼層後返回。

CPAN::Distribution::make()

首先運行 get 方法以確保已下載並解壓縮發行版。變更到已解壓縮發行版的目錄並在其中運行外部命令 perl Makefile.PL 或 perl Build.PL 和 make。

CPAN::Distribution::perldoc()

下載與發行版相關聯的檔案的 pod 文件(以 HTML 格式)並通過在 $CPAN::Config->{lynx} 中指定的外部命令 lynx 執行它。如果 lynx 不可用,則將其轉換為純文本,並通過在 $CPAN::Config->{pager} 中指定的外部命令 html2text 執行。

CPAN::Distribution::prefs()

返回用戶在 prefs_dir/ 目錄中存入的第一個匹配的 YAML 文件的哈希參考。第一次成功匹配者勝出。prefs_dir/ 中的文件按字母順序處理,並將規範的發行版名稱(例如 AUTHOR/Foo-Bar-3.14.tar.gz)與存儲在 $root->{match}{distribution} 屬性值中的正則表達式進行匹配。此外,將發行版中包含的所有模塊名與 $root->{match}{module} 屬性值中的正則表達式進行匹配。這兩個匹配值進行 AND 運算。這兩個屬性都是可選的。

CPAN::Distribution::prereq_pm()

返回由發行版宣布為 requires 和 build_requires 元素的哈希參考。這些可以由 META.yml(如果官方)聲明,或者可以在執行 Build.PL 後在文件 ./_build/prereqs 中存入,或者在執行 Makfile.PL 後作為 Makefile 中的 PREREQ_PM 哈希的註釋。注意:此方法僅在嘗試進行 make 發行版之後才有效。否則返回 undef。

CPAN::Distribution::readme()

下載與發行相關聯的 README 檔案並通過 $CPAN::Config->{pager} 指定的分頁器運行它。

CPAN::Distribution::reports()

從 www.cpantesters.org 下載此發行版的報告數據並顯示其子集。

CPAN::Distribution::read_yaml()

將此分發版的 META.yml 內容作為哈希參考返回。注意:僅在嘗試 make 發行版後才有效。否則返回 undef。如果 META.yml 的內容不可靠也返回 undef。(有關內容何時可靠的規則仍在變動中。)

CPAN::Distribution::test()

切換到已解壓縮的分發目錄並在那裡運行 make test

CPAN::Distribution::uptodate()

如果分發中包含的所有模塊都是最新的,則返回 1。依賴於 containsmods。

CPAN::Index::force_reload()

強制重新加載所有索引。

CPAN::Index::reload()

如果超過 $CPAN::Config->{index_expire} 天未讀取所有索引,則重新加載所有索引。

CPAN::InfoObj::dump()

CPAN::Author、CPAN::Bundle、CPAN::Module 和 CPAN::Distribution 繼承此方法。它打印與對象關聯的數據結構。用於調試。注意:數據結構被視為內部結構,因此可能會隨時更改而無需通知。

CPAN::Module::as_glimpse()

返回模塊的一行描述,包括四列:第一列包含單詞 Module,第二列包含一個字符:如果此模塊已安裝且最新,則為等號,如果可以升級則為小於號,如果未安裝則為空格。第三列是模塊的名稱,第四列給出維護者或發行信息。

CPAN::Module::as_string()

返回模塊的多行描述

CPAN::Module::clean()

運行對與此模組關聯的發布進行清理。

CPAN::Module::cpan_file()

返回與模組關聯的 CPAN 上的檔案名稱。

CPAN::Module::cpan_version()

返回 CPAN 上此模組的最新版本。

CPAN::Module::cvs_import()

對與此模組關聯的發布進行 cvs_import。

CPAN::Module::description()

返回此模組的 44 字元描述。僅適用於列在模組清單中的模組(CPAN/modules/00modlist.long.html 或 00modlist.long.txt.gz)。

CPAN::Module::distribution()

返回包含此模組當前版本的 CPAN::Distribution 物件。

CPAN::Module::dslip_status()

返回一個哈希參考。哈希的鍵是字母 DSLI 和 <P>,分別表示開發狀態、支援級別、語言、介面和公共許可證。DSLIP 狀態的數據是由 pause.perl.org 在作者註冊其命名空間時收集的。5 個哈希元素的值是一個字元的單詞,其含義在下表中描述。還有 5 個哈希元素 DVSVLVIV 和 <PV>,它們攜帶了 5 個狀態變量的更加冗長的值。

其中 'DSLIP' 字元的含義如下

D - Development Stage  (Note: *NO IMPLIED TIMESCALES*):
  i   - Idea, listed to gain consensus or as a placeholder
  c   - under construction but pre-alpha (not yet released)
  a/b - Alpha/Beta testing
  R   - Released
  M   - Mature (no rigorous definition)
  S   - Standard, supplied with Perl 5

S - Support Level:
  m   - Mailing-list
  d   - Developer
  u   - Usenet newsgroup comp.lang.perl.modules
  n   - None known, try comp.lang.perl.modules
  a   - abandoned; volunteers welcome to take over maintenance

L - Language Used:
  p   - Perl-only, no compiler needed, should be platform independent
  c   - C and perl, a C compiler will be needed
  h   - Hybrid, written in perl with optional C code, no compiler needed
  +   - C++ and perl, a C++ compiler will be needed
  o   - perl and another language other than C or C++

I - Interface Style
  f   - plain Functions, no references used
  h   - hybrid, object and function interfaces available
  n   - no interface at all (huh?)
  r   - some use of unblessed References or ties
  O   - Object oriented using blessed references and/or inheritance

P - Public License
  p   - Standard-Perl: user may choose between GPL and Artistic
  g   - GPL: GNU General Public License
  l   - LGPL: "GNU Lesser General Public License" (previously known as
        "GNU Library General Public License")
  b   - BSD: The BSD License
  a   - Artistic license alone
  2   - Artistic license 2.0 or later
  o   - open source: approved by www.opensource.org
  d   - allows distribution without restrictions
  r   - restricted distribution
  n   - no license at all
CPAN::Module::force($method,@args)

強制 CPAN 執行通常會拒絕執行的任務。Force 接受一個要調用的方法名和任意數量的附加參數以傳遞該方法。對象的內部進行所需的更改,以便 CPAN.pm 不拒絕執行該操作。另請參閱上面關於 forcefforce pragma 的部分。

CPAN::Module::get()

對與此模組關聯的發布進行 get。

CPAN::Module::inst_file()

返回在 @INC 中找到的模組的檔案名稱。報告找到的第一個檔案,就像 perl 自己一樣,在找到模組後停止搜索 @INC。

CPAN::Module::available_file()

返回在 PERL5LIB 或 @INC 中找到的模組的檔案名稱。報告找到的第一個檔案。此方法優於 inst_file 的方法之處在於,已測試但尚未安裝的模組也包括在內,因為 PERL5LIB 會跟踪已測試的模組。

CPAN::Module::inst_version()

以易讀的格式返回已安裝模組的版本號。

CPAN::Module::available_version()

以易讀的格式返回可用模組的版本號。

CPAN::Module::install()

在與此模組關聯的發行版上執行install

CPAN::Module::look()

切換到與此模組關聯的發行版已解壓縮的目錄並在其中開啟一個子殼層。退出子殼層返回。

CPAN::Module::make()

在與此模組關聯的發行版上執行make

CPAN::Module::manpage_headline()

如果模組已安裝,則查看模組的man頁面,讀取標題並返回。此外,如果模組在本次會話中已下載,即使尚未安裝,也會對已下載的模組執行相應操作。

CPAN::Module::perldoc()

在此模組上運行perldoc

CPAN::Module::readme()

在與此模組關聯的發行版上運行readme

CPAN::Module::reports()

在關聯的發行版對象上調用reports()方法。

CPAN::Module::test()

在與此模組關聯的發行版上運行test

CPAN::Module::uptodate()

如果模組已安裝且是最新的,則返回1。

CPAN::Module::userid()

返回模組的作者ID。

快取管理器

目前快取管理器僅跟蹤建置目錄($CPAN::Config->{build_dir})。它是一個簡單的FIFO機制,一旦那裡的所有目錄的大小超過$CPAN::Config->{build_cache}(以MB為單位),就會刪除完整目錄。這個快取的內容可能用於以後您打算手動重新安裝的情況,但CPAN本身永遠不會信任這些快取。這是因為用戶可能使用這些目錄在不同的架構上構建模組。

還有另一個目錄($CPAN::Config->{keep_source_where}),其中存放著原始發行版文件。此目錄不受快取管理器的控制,必須由用戶控制。如果您選擇將相同目錄作為build_dir和keep_source_where目錄,則您的源代碼將使用相同的FIFO機制刪除。

捆裝

捆裝(Bundle)只是在名稱空間 Bundle:: 中的一個 Perl 模塊,不定義任何函數或方法。它通常只包含文檔。

它開始就像一個 Perl 模塊,有一個 package 声明和一个 $VERSION 變量。在那之後,POD 部分看起來像任何其他的 POD,唯一的區別是存在一個特殊的 POD 部分,以(verbatim)開始

=head1 CONTENTS

在這個 POD 部分中,每一行都遵循以下格式

Module_Name [Version_String] [- optional text]

唯一需要的部分是第一個字段,即模塊的名稱(例如 Foo::Bar,即不是分發文件的名稱)。其餘部分是可選的。註釋部分被一條破折號界定,就像 man 頁眉一樣。

捆裝的分發應該遵循與其他分發相同的約定。

在 CPAN 套件中,捆裝(Bundles)被特殊處理。如果你說 'install Bundle::Tkkit'(假設存在這樣的捆裝),CPAN 將安裝 POD 的 CONTENTS 部分中的所有模塊。您可以通過將符合規範的捆裝文件放在 @INC 路徑中的某個地方來在本地安裝您自己的捆裝。在 shell 界面中可用的 autobundle() 命令將為您完成這項工作,它將包括當前安裝的所有模塊在一個快照捆裝文件中。

先決條件

CPAN 程序試圖盡可能少地依賴於環境,以便用戶可以在惡劣的環境中使用它。環境提供的好處越多,它的功能就越好。例如,如果您在 CPAN shell 中嘗試

install Bundle::CPAN

install Bundle::CPANxxl

你會發現與之前的裸殼 shell 相比,這個 shell 更加方便。

如果您有 CPAN 的本地鏡像並且可以通過 "file:" URL 訪問所有文件,那麼您只需要一個 perl5.003 之後的 Perl 版本來運行此模塊。否則,強烈建議使用 Net::FTP。對於非 UNIX 系統,或者如果您最近的 CPAN 站點與非ftp: URL 相關聯,可能需要使用 LWP。

如果您既沒有 Net::FTP 也沒有 LWP,則對於外部 ftp 命令或外部 lynx 命令實現了一個後備機制。

工具

查找包和版本

此模塊假設 CPAN 上的所有包

除錯

由於 CPAN 上軟體產生的索引、CPAN 上的鏡像處理過程、封裝、配置、同步性,甚至是(噁心!)CPAN.pm 模組本身的錯誤,使得對這個模組進行除錯變得相當複雜。

要在互動模式下除錯 CPAN.pm 本身的代碼,可以為 CPAN.pm 中的大多數包啟用一些除錯輔助功能之一:

o debug package...

設置包的除錯模式。

o debug -package...

取消包的除錯模式。

o debug all

將所有包的除錯模式打開。

o debug number

直接設置除錯包。請注意,o debug 0 會關閉除錯。

似乎一種成功的策略是結合 reload cpan 和除錯開關。在 shell 中運行時添加一個新的除錯語句,然後發出 reload cpan 命令,即可立即查看到新的除錯消息,而不會失去當前的上下文。

o debug 不帶參數時列出有效的包名和當前處於除錯模式的包。 o debug 具有內置的完成支持。

要對 CPAN 數據進行調試,可以使用 dump 命令,該命令接受與 make/test/install 相同的參數,並輸出每個對象的 Data::Dumper dump。如果參數看起來像一個 Perl 變量,並包含 $@% 中的一個,它將被 eval() 並直接提供給 Data::Dumper。

軟盤、Zip、離線模式

CPAN.pm 也可以在沒有網絡訪問的情況下正常工作。如果您管理的機器根本沒有網絡,您應該考慮使用 file: URL。您首先必須在某個地方收集您的模組。因此,您可以使用 CPAN.pm 在連接到網絡的機器上組合所需的所有內容。然後將 $CPAN::Config->{keep_source_where}(但不包括 $CPAN::Config->{build_dir})目錄複製到一張軟盤上。這個軟盤有點像是個人的 CPAN。在沒有網絡訪問的機器上,CPAN.pm 可以與這個軟盤很好地配合。請參閱下面有關 CD-ROM 支持的段落。

程序員的基本工具

has_inst($module)

如果模組已安裝,返回 true。用於將所有被認為是可選的模組加載到運行中的 CPAN.pm 中。配置變量 dontload_list 截取 has_inst() 調用,以便即使可選模組可用,也不會加載。例如,下面的命令將防止加載 YAML.pm

cpan> o conf dontload_list push YAML

詳細請參見來源。

use_inst($module)

has_inst()相似,嘗試載入可選庫,但如果庫不可用則也會終止執行。

has_usable($module)

如果模組已安裝並處於可用狀態,則返回 true。僅對內部使用的少數模組有用。詳細資訊請參見來源。

instance($module)

用於表示模組、分發、作者和捆綁的單例的構造函數。如果對象已存在,此方法將返回該對象;否則,它將調用構造函數。

frontend()
frontend($new_frontend)

前端對象的設置器/設置器。此方法僅允許子類化 CPAN.pm。

SECURITY

CPAN.pm 中沒有強大的安全層。CPAN.pm 幫助您在計算機上安裝外部、未遮罩、未簽署的代碼。我們將其與來自網絡的校驗和分發文件本身相比較的校驗和分發文件本身相比較。但是,我們會試圖使其易於按需添加安全性。

Cryptographically signed modules

自版本1.77起,CPAN.pm 可以使用 Module::Signature 驗證密碼簽名的模組分發。CPAN 模組可以由其作者簽名,從而提供更多安全性。CPAN 之前使用的簡單未簽名的 MD5 校驗主要保護免於意外文件損壞。

您需要安裝 Module::Signature,而 Module::Signature 又需要您至少安裝 Crypt::OpenPGP 模組或命令行工具 gpg

您還需要能夠通過互聯網連接到公共金鑰服務器,如 pgp.mit.edu,以及它們的端口 11731(HKP 協議)。

配置參數 check_sigs 可用於打開或關閉簽名檢查。

EXPORT

CPAN 套件中的大多數函數默認導出。這是因為主要用途是 cpan shell 或單行命令。

ENVIRONMENT

當 CPAN shell 通過 look 命令進入子殼時,它將環境設置為 CPAN_SHELL_LEVEL 為 1,或者如果已設置,則增加該變量。

當 CPAN 運行時,它將環境變數 PERL5_CPAN_IS_RUNNING 設置為正在運行的進程的 ID。它還將 PERL5_CPANPLUS_IS_RUNNING 設置為防止與舊版本的 Module::Install 發生的不正常進程。

運行 perl Makefile.PL 時,將環境變數 PERL5_CPAN_IS_EXECUTING 設置為正在執行的 Makefile.PL 的完整路徑。這可以防止與較新版本的 Module::Install 發生不正常進程。

當設置配置變量ftp_passive時,所有下載將使用環境變量FTP_PASSIVE設置為此值運行。一般來說,這是一個不錯的主意,因為它影響了基於Net::FTP和LWP的連接。同樣的效果也可以通過啟動帶有此環境變量設置的cpan shell來實現。對於僅Net::FTP,也可以通過運行libnetcfg始終設置被動模式。

填充安裝包含大量模組

如果您維護一個私有的捆綁定義文件,那麼將新安裝的perl填充為自己喜歡的模組就非常容易。要獲得捆綁定義文件的有用藍圖,可以在CPAN shell命令行上使用autobundle命令。此命令為當前perl解釋器安裝的所有模組寫入捆綁定義文件。建議只運行此命令一次,然後在一個私有名稱下手動維護文件,例如Bundle/my_bundle.pm。有了一個聰明的捆綁文件,您就可以簡單地說

cpan> install Bundle::my_bundle

然後回答幾個問題,出去喝咖啡(甚至可能在不同的城市)。

維護捆綁定義文件意味著跟踪兩件事:依賴關係和交互性。 CPAN.pm有時會因為並非所有模組都正確定義了所有MakeMaker屬性而計算不出依賴關係,因此捆綁定義文件應該盡早指定先決條件。另一方面,令人煩惱的是,許多分發需要一些交互式配置。因此,在您的私有捆綁文件中,您可以嘗試完成的是將需要早期配置的套餐放在文件的後面,這樣您就可以在幾分鐘後出去喝咖啡,讓CPAN.pm自行運行。

在防火牆後使用CPAN.pm

感謝Graham Barr提供關於perl和各種防火牆配置交互作用的以下段落。有關防火牆的進一步信息,建議諮詢帶有ncftp程序的文檔。如果您無法通過簡單的Perl設置穿過防火牆,則您可以配置ncftp使其通過您的防火牆運行。

三種基本類型的防火牆

防火牆可以分為三種基本類型。

http防火牆

這是防火牆機器運行網頁伺服器時,要訪問外部世界,必須通過該網頁伺服器進行。如果您設置了類似http_proxy或ftp_proxy開頭為http://的環境變量,或者在網絡瀏覽器中設置了代理信息,那麼您就知道您正在使用http防火牆。

要訪問這些類型的防火牆外的伺服器,即使是對ftp,您也需要使用LWP或HTTP::Tiny。

ftp防火牆

這是防火牆機器運行ftp伺服器時。這種類型的防火牆只允許您訪問防火牆外的ftp伺服器。通常是通過使用ftp連接到防火牆,然後輸入類似"user@outside.host.com"的用戶名來完成。

要訪問這些類型的防火牆外的伺服器,您需要使用Net::FTP。

單向可視性

單向可視性意味著這些防火牆試圖對內部用戶隱藏自己。FTP數據連接通常是通過將您的IP地址發送到遠程伺服器,然後等待返回連接來創建的。但是由於防火牆的存在,遠程伺服器將無法連接到您。對於這些類型的防火牆,FTP連接需要在被動模式下完成。

我能想到兩種。

SOCKS

如果您使用的是SOCKS防火牆,您需要編譯perl並將其與SOCKS庫鏈接起來。這通常被稱為“socksified” perl。使用此可執行文件,您將能夠連接到防火牆外的伺服器,就像它不存在一樣。

IP偽裝

這是當防火牆在內核中實現(通過NAT或網絡地址轉換)時,它允許您將整個網路隱藏在一個IP地址後面。使用此防火牆,不需要進行特殊編譯,因為您可以直接訪問主機。

要訪問此類防火牆後面的ftp伺服器,通常需要將環境變量FTP_PASSIVE或配置變量ftp_passive設置為true值。

為通過防火牆配置lynx或ncftp

如果您可以使用lynx等工具通過防火牆,可能需要使用類似以下命令:

/usr/local/bin/lynx -pscott:tiger

然後,您會使用以下命令配置 CPAN.pm

o conf lynx "/usr/local/bin/lynx -pscott:tiger"

就這樣。對於 ncftp 或 ftp,您會配置類似的東西

o conf ncftp "/usr/bin/ncftp -f /home/scott/ncftplogin.cfg"

您的情況可能有所不同...

常見問題

1)

我安裝了模塊 X 的新版本,但 CPAN 一直說我安裝了舊版本

很可能您確實安裝了舊版本。如果模塊將自己安裝到與先前安裝時不同的 @INC 路徑中,就會發生這種情況。這不是 CPAN.pm 的問題,您手動安裝模塊時也會遇到相同的問題。防止這種行為的最簡單方法是將參數 UNINST=1 添加到 make install 調用中,這就是許多人永久添加此參數的原因

o conf make_install_arg UNINST=1
2)

那麼為什麼 UNINST=1 不是默認值?

因為有些人對誰可以在 @INC 路徑的哪個位置安裝、誰使用哪個 @INC 數組有明確的期望。在調整精細的環境中,UNINST=1 可能會造成損害。

3)

我想清理我的系統並安裝一個新的 Perl,以及我安裝的所有模塊。我該怎麼做?

為您的舊 Perl 執行 autobundle 命令,並可選擇重新命名生成的捆綁文件(例如 Bundle/mybundle.pm),使用 Configure 選項 prefix 安裝新的 Perl,例如

./Configure -Dprefix=/usr/local/perl-5.6.78.9

使用類似以下的方式安裝您在第一步中生成的捆綁文件

cpan> install Bundle::mybundle

然後您就完成了。

4)

當我使用一個命令安裝捆綁或多個模塊時,輸出太多,無法跟蹤。

您可以配置類似以下的東西

o conf make_arg "| tee -ai /root/.cpan/logs/make.out"
o conf make_install_arg "| tee -ai /root/.cpan/logs/make_install.out"

以便將 STDOUT 捕獲到文件中以供以後檢查。

5)

我不是 root,如何在個人目錄中安裝模塊?

從 CPAN 1.9463 開始,如果您沒有權限寫入默認的 Perl 庫目錄,CPAN 的配置過程將詢問您是否要引導安裝 <local::lib>,這使得保持個人 Perl 庫目錄變得容易。

另一件您應該記住的事情是,當您將模塊安裝到私有區域時,UNINST 參數可能是危險的,因為您可能會意外地刪除其他人依賴的模塊,而這些模塊不使用私有區域。

6)

如何獲取一個包裹、解開它並在構建之前進行更改?

請查看 look 命令。

7)

我安裝了一個捆綁,但有幾個失敗。當我重試時,一切都解決得很好。這可以在第一次嘗試時修復嗎?

這是因為當 CPAN 開始時,它不知道所有模塊的依賴關係。為了決定要安裝的其他項目,它只使用在 META.yml 文件或生成的 Makefile 中找到的數據。未檢測到的缺少部分將中斷進程。但可能您的捆綁在後面安裝了某些依賴項目,這樣您的第二次嘗試就能解決一切了。請注意,CPAN.pm 事先不知道依賴關係樹,也無法將要安裝的事項隊列按照拓撲順序進行排序。如果所有模塊都使用 PREREQ_PM 屬性向 MakeMaker 或 Module::Build 的 requires 章節正確聲明了先決條件,那麼它可以完美解析。對於經常失敗並且您需要安裝的捆綁,建議手動對捆綁定義文件進行排序。

8)

在我們的內部網絡中,我們有許多內部使用的模塊。我如何將這些模塊與 CPAN.pm 整合,但不上傳到 CPAN?

請查看 CPAN::Site 模組。

9)

當我執行 CPAN 的 shell 時,我收到一個關於我的 /etc/inputrc(或 ~/.inputrc)檔案中的問題的錯誤訊息。

這些是 readline 問題,只能通過研究您的架構上的 readline 配置並相應地調整引用的檔案來解決。請備份 /etc/inputrc~/.inputrc 並進行編輯。通常一些無害的更改,例如將一些參數改為大寫或小寫,就可以解決問題。

10)

一些作者名稱中有奇怪的字元。

內部 CPAN.pm 使用 UTF-8 字元集。如果您的終端期望 ISO-8859-1 字元集,則可以通過在配置檔中將 term_is_latin 設置為 true 來啟用轉換器。一種方法是

cpan> o conf term_is_latin 1

如果需要其他字元集支援,請在 rt.cpan.org 對 CPAN.pm 提交錯誤報告並描述您的需求。也許我們可以擴展支援,或者 UTF-8 終端會普及。

注意:此配置變數已棄用,將在未來版本的 CPAN.pm 中刪除。它將被 $LANG 和 $LC_* 環境變數家族周圍的約定取代。

11)

當某個安裝由於某些原因失敗,然後我更正錯誤條件並重試時,CPAN.pm 拒絕安裝模組,並顯示 Already tried without success

像這樣使用 force pragma

force install Foo::Bar

或者您可以使用

look Foo::Bar

然後直接在子 shell 中使用 make install

12)

如何安裝一個模組的「開發者版本」?

預設情況下,CPAN 將安裝一個模組的最新非開發者版本。如果您想安裝 dev 版本,您必須指定從作者 id 開始的部分路徑到您想要安裝的 tarball,像這樣

cpan> install KWILLIAMS/Module-Build-0.27_07.tar.gz

請注意,您可以使用 ls 命令列出此路徑。

13)

如何從命令行安裝一個模組及其所有依賴,而不管我的 CPAN 配置(或缺少配置)而不受提示?

CPAN 使用 ExtUtils::MakeMaker 的 prompt() 函數來詢問其問題,因此如果您設置了 PERL_MM_USE_DEFAULT 環境變數,則應該根本不會收到任何問題(假設您要安裝的模組也遵守該變數)

% PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install My::Module'
14)

如何從一個以 ExtUtils::MakeMaker 為中心的 Makefile.PL 衍生出一個基於 Module::Build 的 Build.PL?

http://search.cpan.org/dist/Module-Build-Convert/

15)

我經常對 CPAN shell 無法幫助我選擇一個好的鏡像感到惱怒。

CPAN 現在可以根據 'ping' 往返時間最低的鏡像來幫助您選擇一個“好”的鏡像。從 shell 中,使用命令 'o conf init urllist',並允許 CPAN 自動為您選擇鏡像。

除了這些幫助之外,urllist 配置參數是您的。您可以隨意添加和刪除站點。您應該找出哪些站點具有最佳的更新性、帶寬、可靠性等,並且與您拓撲上接近。有些人喜歡快速下載,有些人喜歡更新性,有些人喜歡可靠性。您可以決定按照哪個順序嘗試。

Henk P. Penning 維護了一個收集有關 CPAN 站點數據的網站

http://mirrors.cpan.org/

同時,請隨意嘗試實驗性功能。運行

o conf init randomize_urllist ftpstats_period ftpstats_size

並選擇您喜歡的參數。在幾次下載後,運行 hosts 命令可能會幫助您選擇最佳的鏡像站點。

16)

為什麼每次我啟動 shell 時都會被問到相同的問題?

您可以通過調用命令 o conf commit 使您的配置更改永久生效。或者通過運行 o conf init auto_commit 並以是的回答來將 auto_commit 變量設置為 true。

17)

舊版本的 CPAN.pm 將所有 tarballs 的原始根目錄放在構建目錄中。現在這些目錄名稱始終附加了隨機字符。這樣做的原因是什麼?

隨機字符由 File::Temp 提供,確保每個模塊的單獨構建目錄是唯一的。這使得同時運行 CPAN.pm 的並發進程變得安全。

18)

說到構建目錄。我需要自己清理嗎?

您可以選擇將配置變量 scan_cache 設置為 never。然後您必須自己清理它。其他可能的值,atstartatexit 在您啟動(或更準確地說,第一次提取到構建目錄中)或退出 CPAN shell 時清理構建目錄。如果您從未啟動過 CPAN shell,那麼您可能也必須自己清理構建目錄。

19)

我如何切換到 sudo 而不是 local::lib?

以下 5 個環境變量需要重置為先前的值:PATH、PERL5LIB、PERL_LOCAL_LIB_ROOT、PERL_MB_OPT、PERL_MM_OPT;並且這兩個 CPAN.pm 配置變量必須重新配置:make_install_make_command 和 mbuild_install_build_command。這五個環境變量可能已經被覆蓋在您的 $HOME/.bashrc 或某些等效位置中。您可以在那裡找到它們並刪除它們的蹤跡,然後登出/登錄,或者根據您的確切需求暫時覆蓋它們。這兩個 cpanpm 配置變量可以通過以下方式設置:

o conf init /install_.*_command/

可能跟隨著

o conf commit

COMPATIBILITY

舊版的Perl

CPAN.pm 定期被測試可在 5.005 及其他更新版本下運行。在舊版 Perl 上達到最低先決條件變得越來越困難。在那裡幾乎不可能讓整個 Bundle::CPAN 順利運行。如果你只能使用這些舊版本,請注意 CPAN 設計為無需安裝 Bundle::CPAN 也能正常運行。

為了讓事情順利進行,請注意 GBARR/Scalar-List-Utils-1.18.tar.gz 是與古老的 Perl 兼容的,並且 File::Temp 被列為先決條件,但如果缺少它,CPAN 有合理的解決方法。

CPANPLUS

這個模組及其競爭對手 CPANPLUS 模組都比其他模組更酷。CPAN.pm 是較舊的。CPANPLUS 被設計為更模塊化,但從未打算與 CPAN.pm 兼容。

CPANMINUS

在 2010 年,App::cpanminus 作為一種新方法推出,它有著相對更小的足跡。非常酷。

安全建議

這個軟體使您能夠在您的電腦上升級軟體,因此基於新安裝的軟體可能含有錯誤,並可能改變您的電腦運作方式,甚至使其無法使用。請在每次升級之前考慮備份您的數據。

錯誤

請通過 http://rt.cpan.org/ 報告錯誤。

在提交錯誤之前,請確保在您的環境中仍然可以通過從 shell 中按照該套件的安裝說明建立 Perl 模組包的傳統方法來工作。

作者

Andreas Koenig <andk@cpan.org>

許可證

本程式是自由軟體;您可以按照 Perl 本身的相同條款重新分發它或修改它。

參見 http://www.perl.com/perl/misc/Artistic.html

翻譯

Kawai, Takanori 提供了這份手冊的非常古老版本的日文翻譯,網址為 http://homepage3.nifty.com/hippo2000/perltips/CPAN.htm

參見

許多人透過執行與 perl 安裝在同一目錄中的 cpan 實用程式進入 CPAN shell。因此,如果您的 PATH 變數中有此目錄(或您作業系統中的某個等效項目),那麼在控制台視窗中輸入 cpan 將對您也適用。此外,該實用程式還提供了幾個命令列快捷方式。

melezhik(Alexey)發送給我一個鏈接,他在那裡發布了一個與 CPAN.pm 一起使用的 chef 配方:http://community.opscode.com/cookbooks/cpan。