2009-07-31 55 views
10

我目前正在開發一個項目,使用另一個部門開發的框架作爲基礎。我們目前正在爲我們的部門引入質量標準(最後,耶!),但目前不可能將這些質量標準引入其他部門。因此,我們正在努力克服一個持續不變的目標,而不是穩定的API或穩定的版本,這至少是壓力。如何管理Perl模塊依賴關係?

由於我們試圖首先解決問題,所以我們希望儘可能保證自己能夠抵擋「上游」a.k.a.框架代碼中的更改。我們設想了硬件模塊依賴關係:

  1. 僅使用特定版本範圍的框架模塊,在代碼中定義。
  2. 使用單元測試檢查來確保所有必需的版本仍然可用。
  3. 每個版本範圍擴展需要對框架代碼進行同行評審。

這是迄今爲止的計劃。現在的問題:

  1. 明智嗎?如果沒有,還有其他想法?
  2. 如何在Perl中實現這個?使用use Module,我們只能定義應該使用的最低版本代碼。

回答

2

雖然我希望CPAN比您所依賴的模塊更穩定,但我想問一個類似的問題:您將如何保護自己免受CPAN模塊中的意外更改?

一個答案:你可以下載模塊並在測試環境中對它進行迴歸。

這裏可以使用相同的嗎?你是否必須指向他們模塊的「實時」副本,還是可以指向你自己的副本?

+1

CPAN不穩定,因爲你不能阻止任何人做任何事情。一個特定的模塊可能完全沒有bug,但即使是一個接口更改也可能會破壞依賴它的代碼。罪魁禍首是CPAN工具鏈的設計,其中最新的版本是客戶端試圖安裝的版本。 – 2009-07-31 17:27:07

2

我會通過製作我的代碼所依賴的庫的私有副本並將它們放在我的項目的lib目錄中,瞭解到我將永遠不會修改這些副本,除非定期簽出新版本作爲里程碑。

14

這是一個非常明智的計劃,我通過一個叫做'DPAN'的類似CPAN的私有存儲庫來實現它。您可以從真正的CPAN(或BackPAN)中選擇所需的分發版本和版本,並從中創建您自己的存儲庫。您的CPAN客戶端僅指向此存儲庫,有效地將版本凍結到您想要的值。你只需要升級就可以了。

此外,DPAN允許您輕鬆添加您自己的本地私有代碼,但修改第三方軟件包以修復其安裝問題等。我在2009年夏季刊中爲該想法提供了完整的理由的The Perl Review。您也可以在YAPC :: Russia上的我的Creating Your Own CPAN演講中看到我的幻燈片。

如果您對此類解決方案感興趣,請查看我的MyCPAN::App::DPAN模塊。它需要一個發行目錄,然後爲你完成剩下的工作。你把你的CPAN客戶端指向它(並確保它不會連接到互聯網),就是這樣。

一旦你可以建立自己的倉庫,你可以很容易地建立一個測試倉庫。轉儲您認爲要升級的版本,將代碼部署到您的測試服務器上,並收集結果。如果您不喜歡結果,可以輕鬆更改存儲庫。

我的DPAN工作的下一個重要步驟是採用現有的Perl安裝以及您可能已安裝的任何模塊,並創建可爲您提供安裝狀態的存儲庫。我擁有所有需要完成這項工作的主要部分,但是我一直在忙着讓幾位客戶在第一部分中運行。

如果您想了解更多關於這個東西的信息,請告訴我。 :)

+1

DPAN聽起來不錯。一旦我索引我的模塊,我如何將我的CPAN客戶端指向它? – jeje 2009-07-31 17:48:02

+1

如果您使用的是CPAN.pm,則可以將urllist設置修改爲file:/// URL。這對於miniCPAN來說是一樣的。我現在要去上班了,但如果遇到問題,請給我發電子郵件([email protected])。 – 2009-07-31 17:56:32

+0

我會嘗試。謝謝! – jeje 2009-07-31 18:01:21

4

看看PAR。它可以讓你將一組依賴關係打包成一個文件。您可以將它們發佈的模塊放入PAR文件中,只需要在接受其更改時升級PAR文件。

-1

如果你想檢查外部模塊的版本,你可以(如果至少他們正確地報告他們的$ VERSION)使用是這樣的:

BEGIN { 
    use foo; 
    use bar; 

    die "Ghaaaa" if $foo::VERSION < 2.1; 
    die "Aaaargh" if $foo::VERSION > 3.12; 
} 
1

有人已經指出PAR。我提到PAR::Repository和它的夥伴模塊PAR::Repository::Client。他們實現了一個客戶端/服務器基礎架構,可以自動加載任何在本地找不到的依賴關係(或者甚至可以選擇服務器的包)。作爲管理員,您可以簡單地向存儲庫添加或刪除軟件包。包的實際服務是用完全正常的服務器完成的:任何http(s)服務器或簡單的file://都可以。其他協議應該是相當簡單的實施。

它具有上述魔術自動加載機制,軟件包安裝和自動軟件包升級。除了模塊文檔外,您還可以看看presentation on PAR from YAPC::Europe 2008,它涵蓋了一些擴展。

我不得不承認,自動升級是足夠先進的技術,可能會吃一個或兩個嬰兒,如果它全部運行的小貓啃。

1

那麼我認爲Carton是你正在尋找的東西(perl的打包機)。結合plenv我相信會做到這一點。