2009-09-14 78 views
1

我目前正在使用PAR Packer(pp)打包幾個pl腳本,這樣他們就可以複製到一臺機器上,並且「正常工作」,而不必讓我的客戶端與CPAN混淆。PAR包裝器可以生成獨立的腳本嗎?

不幸的是,PAR包裝器不適用於深度依賴性。例如,一個腳本導入CHI :: Driver :: File,但不顯式導入CHI :: Driver :: File所需的Log :: Any :: Adapter :: Null。 PAR不拿起這種依賴和運行生成的腳本將以下錯誤消息崩潰:

Can't locate Log/Any/Adapter/Null.pm in @INC (@INC contains: CODE(0x874aab8) /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc/lib /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc CODE(0x87e8f54) CODE(0x87e9194)) at (eval 215) line 3. 
Compilation failed in require at CHI/Driver/File.pm line 11. 
BEGIN failed--compilation aborted at CHI/Driver/File.pm line 11. 

我的解決辦法是明確地導入「登錄::任何::適配器::空」但必須有是更好的方法。也許這是PAR Packer的一個錯誤?我已安裝最新版本(0.994)。

+3

描述您使用哪些命令行選項來構建包。 – 2009-09-15 01:21:38

+1

我使用腳本將每個pl文件單獨編譯爲一個cgi文件。我使用以下命令行參數:-I -X和-o – Jono 2009-09-15 16:49:33

回答

1

如果您需要獨立腳本而不是獨立二進制文件(這是pp的默認模式),請添加-P選項。不過,我建議不要這樣做。這是運行模式最少的模式。

另請注意,PAR :: Packer DOES適用於深度依賴性。你的問題的主題有點自命不凡。事實上,PAR :: Packer本身並沒有真正檢查任何依賴關係,而是將其委託給Module :: ScanDeps。現在,Module :: ScanDeps是依賴掃描的一種啓發式方法,並且可以通過動態加載依賴關係來進行醜陋的模糊處理。 (即在運行時生成模塊名稱,然後在eval中使用它們)。確實,如果你看看sources for Log::Any(CHI :: Driver :: File使用的),你很快就會發現它使用了模塊的動態加載。這就是爲什麼:: Adapter :: Null模塊沒有被拾取。

通常,我們通過向Module :: ScanDeps添加一個特殊情況來解決這些問題,這些模塊的作者認爲打敗任何類型的靜態分析都是一個好主意。在獲得Module::ScanDeps的固定版本之前,可以使用-c或-x選項來使pp依賴性解析使用編譯或執行程序,而不僅僅依賴於靜態分析。增強模塊:: ScanDeps的版本爲0.95,並應在一天內從CPAN提供。

+1

模塊:: ScanDeps 0.95已在CPAN上到達。參看http://search.cpan.org/dist/Module-ScanDeps/ – tsee 2009-09-16 13:07:20

+1

非常感謝Steffen,這很清楚。 – Jono 2009-09-16 17:29:37

+1

我還想指出,pp -c必須在腳本被封裝的同一目錄中執行,否則最終會出現錯誤的@INC(假設您包含自己的perl模塊,該模塊存在於另一個目錄中並且是使用BEGIN塊來推入@INC或「使用庫」模塊)。 這給了我試圖用pp -c打包腳本的麻煩。 – Jono 2009-09-16 18:31:57

3

那麼,你讀過documentation?它提供了許多命令行選項來包含依賴關係,甚至可以選擇手動強制包含模塊。

+0

謝謝布拉德。我確實已經閱讀過文檔,並且在PAR文檔中沒有任何地方指出爲了生成獨立腳本需要任何特定的標誌。 實際上,文檔中明確指出:「pp使用PAR提供的壓縮打包程序和Module :: ScanDeps提供的依賴性檢測啓發法,創建了Perl程序的獨立可執行文件,源文件逐字壓縮,無需編譯。 這正是我正在尋找的,但不幸的是它不起作用。有任何想法嗎? – Jono 2009-09-15 16:52:15