2011年11月22日 星期二

關於 CPAN Dependency Tracking 模組相依性

由於專案需求,需要一些 Dependency Tracking 的東西來做點事情,以下是大概 survey 的結果:


* Carton,  Tatsuhiko Miyagawa 最近釋出的 Dependency 管理工具,也就是 Bundler,這主要是給模組開發者使用的工具。

開發者可以利用 Makefile.PL 準確的將相依的模組選擇正確的版本安裝,也可以將相依的模組依照正確的版本整捆打包起來。

在部屬的時候,可以直接使用這些模組安裝檔。



* CPAN::Dependency, 該模組使用 CPANPLUS 提供的後端 CPANPLUS::Backend 來剖析模組,可透過多種格式的 Dist Path 來取得 Distribution Object ,而 Distribution 又提供了 fetch, extract 等方法可以下載 Distribution 並且剖析該模組的相依性。

不過 CPAN::Dependency 似乎只能剖析一層的 Dependency ,無法 Recursive 剖析相依的子模組,所以得透過 process 選項來處理 CPAN 上所有的模組的資訊才有辦法取得樹狀結果。

但要跑完整個 Module List 也太久了,CPAN 上有超過十萬個 Module ,兩萬三千多個 Distribution。

不過一個很不錯的地方是,CPAN::Dependency 提供了 load_deps_tree 以及 save_deps_tree 的方法,所以可以儲存樹狀結果為 YAML 檔案,也可以再次載入回來。

至於 cpants DB 的後端支援則是壞掉了。



* Module::Dependency (2006 年),提供了一些腳本可以處理相依性的資訊:

執行 pmd_indexer.plx 可以索引某個目錄來取得所有的相依性資訊:

    $ pmd_indexer.plx -o ./unified.dat -t -b ~/src/perl/test/CPANTS-Weight-0.15

使用 pmd_dump.pl 則可以將資料 dump 出來:

    $ pmd_dump.pl -o ./unified.dat -A

pmd_grapher 則提供 graph 產生:


其他詳細範例可參考: http://cpansearch.perl.org/src/TIMB/Module-Dependency-1.86/examples/example.html



* Graph::Dependency (2006) 也是取得 dist tarball 之後 extract 取得 meta yaml 來產生 graph .. 不過已經壞掉了。



* CPAN::FindDependencies 的 API 看起來還不錯,不過使用 synopsis 提供的 Code 卻會 dump 出一堆亂碼 (????) 後來發現需要給 02packages 的 option 給 findeps 使用才行。

另外也沒有提供 debug, verbose 等選項,所以只能靜靜的等輸出結果。

修改後 (gist) 的輸出結果很理想,但是 perl 的 Core module 沒有過濾掉

其他部分都很 OK。


* CPANDB

CPANDB 使用了 ORLite 的 SQLite ORM 作為基底,提供了一個 SQLite 的 database ,利用 scripts/cpangraph 可繪製 CPAN Module 的關聯圖 (via GraphViz)。

SQLite 資料庫上基本上由遠端存取

GET http://svn.ali.as/db/cpandb.bz2 ==> 200 OK (16s)

再利用 ORLite::Mirror 來做遠端以及本地端的資料同步。

不過好像第二次存取 svn.ali.as 的時候就出現 301 Not Modified ...

又,為何使用了 scripts/cpangraph 後的 CPAN Graph 只有:



* Debian::Dependency 則可指出與 Debian 套件之間的相關性


* Devel::ModInfo (2002) 似乎太舊了,壞掉了。


* PAR 的 scandeps.pl ,能幫上一點忙,不過格式的部份好像無法匯出 YAML ?


* Leon Brocard 寫的 Module::CPANTS ,測試了一下覺得效果還 OK ,結果發現這個模組是測試
資料序列化之後,儲存成一個 Module ,最後更新時間為 2003 年,所有序列化的資料還是太舊了,放棄。


* Module::CPANTS::Analyse 則可以透過一個路徑解開一個 Distribution 之後取得大量的測試的 Meta Data,包含 meta_yml, kawalitee, file hashes, size 等等...


* CPANTS::Weight 則因為版本問題,需要 ORDB::CPANTS 0.05 版本,但只取得到 0.04 版本,所以無法運行。
ORDB::CPANTS version 0.05 required--this is only version 0.04 at /Users/c9s/perl5/perlbrew/perls/perl-5.14.2/lib/site_perl/5.14.2/CPANTS/Weight.pm line 33.
有誰可以告訴我 ORDB::CPANTS 0.05 版在哪?XDDDD





這篇大概就是純粹做個筆記

台灣寫 Perl 的人太少了,少到我覺得這篇整理實在價值不高。

墮落中 XD