2011-01-18 98 views
12

我準備嘗試將一些代碼部署到多臺機器。據我所知,使用Makefile.pm來跟蹤依賴性是確保它們被安裝到任何地方的最佳方式。我有的問題是我不確定我們的Makefile.pm已經更新,因爲這個應用程序已經通過幾個不同的開發人員。如何查找Perl腳本使用的所有模塊?

有沒有什麼辦法通過我的源程序或幾個完整的程序來自動解析,以確定我的應用程序依賴於哪些模塊的確切版本?最重要的是,有什麼方法可以根據CPAN包進行過濾嗎? (所以我只依賴於Moose而不是每一個Moose自帶的模塊。)

第三個相關的問題是,如果你依賴於不是最新的模塊版本,那麼最好的方法是什麼有別人安裝它?我應該開始在應用程序中包含完整的本地化Perl安裝嗎?

回答

12

只要是明確的 - 你不能籠統得到模塊列表,該應用僅通過代碼分析依賴。例如。如果您的應用程序確實是eval { require $module; $module->import() },其中$module是通過命令行傳遞的,則只能通過使用所有模塊值實際運行特定命令行版本來檢測此問題。

如果你想做到這一點,你可以計算出通過使用運行的組合,每個模塊:

  1. Devel::Cover。覆蓋率報告將列出100%使用的模塊。但是你沒有獲得版本號。

  2. 打印%INC每一個可能的退出點在代碼中作爲slu的答案說。這應該可以在END{}塊以及__DIE__處理程序中完成,以覆蓋所有可能的退出點,即使這樣,如果程序中的某個位置被覆蓋,也可能不是完全覆蓋通用情況的100%。

  3. Devel::Modlist(也SLU的答覆中提到) - 下跌相比Devel::Cover的是,它似乎並沒有能夠聚集數據庫跨多個樣品運行像Devel::Cover一樣。另一方面,它是專門構建的,所以有很多非常有用的選項(CPAN路徑,版本)。

  4. 請注意,其他模塊(Module::ScanDeps)似乎不允許您基於任意命令行參數進行運行時分析(例如,乍一看似乎只允許您執行沒有參數的程序)並且如果這是真的,那麼對於任何可能可能動態加載模塊的代碼而言,都不如上述3種方法。

+0

感謝您對此進行總結。 – slu 2011-01-19 21:37:16

5

Module::ScanDeps - 依賴關係

是否靜態和運行時掃描遞歸掃描Perl代碼。只是模塊,我不知道有什麼確切的方式來驗證哪個版本的發行版本。您可以從BackPan獲得舊包裹,或者只需將您的整個本地附屬鏈包裝爲PAR即可。

+0

請注意,`Module :: ScanDeps`似乎不允許你基於任意的命令行參數進行運行時分析(例如,乍看起來只允許你執行沒有參數的程序)。這是基於我對POD的看法,而不是經驗,所以我可能是錯的。 – DVK 2011-01-19 10:18:47

0

我肯定會使用Devel :: TraceUse,它也顯示了模塊的樹,所以很容易猜測它們在哪裏被加載。

相關問題