2009-01-05 49 views
3

我試圖找出真實世界應用程序開發的最佳實踐。我無法理解如何正確配置第三方庫作爲獨立軟件包進行部署。看起來,ASDF-INSTALL和ASDF旨在將庫安裝到家庭或站點,從而改變開發平臺的狀態。這很好,如果我正在開發一個服務器端應用程序,並且我想爲這個盒子上的整個CL安裝管理這些依賴關係。ASDF或其他獨立於家庭和網站配置的模塊系統

但是如果我想創建一個獨立的應用程序,通過安裝腳本進行部署,並在其自己的CL實例中單獨運行,該怎麼辦?我想避免更改任何其他應用程序的CL實例或目標系統配置(即覆蓋其他應用程序依賴的庫的其他副本)。在Java中,我所要做的就是創建一個包含這些庫的包含目錄並設置我的CLASSPATH。我如何在CL中獲得相同的隔離級別,假設我沒有安裝自己的CL運行時,而是使用系統上的內容?

對我來說,這是所有動態編譯/解釋語言的常見問題,因爲運行時的壽命比運行時運行的任何特定應用程序(即Ruby或Python)都要長,應用程序將共享相同的庫負載狀態。我對這些語言沒有任何經驗,所以最好的做法可能是讓我看着臉。

IDK如果這將是具體實現,但我正在運行Clozure CL。

編輯:

Ramarren:

我會檢查出Mudballs。謝謝。

安裝庫與我想要的相反,因爲安裝意味着修改主機系統狀態。我認爲關鍵一定在你最後一段。你如何創建啓動腳本來設置中央註冊表到一個孤立的目錄?是否可以使用ASDF-INSTALL將東西提取到所述目錄中?如果CL實現的基本映像不包含ASDF(Clozure默認具有ASDF,但CLISP如何實現),那麼如何引導整個事物呢?

我在開發團隊方面也在思考。在我創建一個新的CL項目存根並且對CVS或SVN進行初始提交之後,其他開發人員如何檢查它們的本地環境並使用它?即使假設每個人在其個人資料/網站啓動時都有ASDF,其他開發人員在他們的中央註冊表中可能有不同的庫集。我們不應該只爲了一起工作而同步工作。從Emacs/SLIME啓動一個CL運行時項目特定的實例並加載項目中指定的內容,不必多也不少。

如果有任何CL或任何其他語言的最佳實踐資源,我會很樂意推出我自己的解決方案並將其開源。

路易斯:

SAVE-應用是很好的部署,而不是爲多開發項目存根我概括。

編輯2:

vatine:

版本依賴正因爲如此,這是一個問題。如果我正在開發一個Perl或Ruby Web應用程序,那麼我可以依靠webadmin的存在來管理這些依賴關係。開發零售應用程序或Lisp是外來技術的中小型企業應用程序(我無法說服他們「技能化」IT組織來管理它),但這種方法是不可接受的。

我能夠昨晚種得到我想要的東西通過創建加載其自身的特定項目的ASDF實例的項目級.lisp文件,項目設置本地中央登記,並手動下載相關libs(沒有ASDF-INSTALL,這對於CLSQL和Weblock而言是一個痛苦的級聯依賴關係)。從開發工具的角度來看,它仍然不夠理想,因爲我必須從我的家和網站中刪除SLIME和Clozure本身的所有定製。另外,共享依賴關係也不能解決(CLSQL和Weblocks都使用MD5)。

Java具有類加載器隔離,這是它如何解決版本依賴性問題。然後還有一個單獨的問題,就是如何將你想要的庫放到項目中(la Maven)。前者是一個核心語言問題;後者與工具有關。我將一起修改一個SLIME擴展,它可以執行ASDF-INSTALL對項目包含的目錄(la Maven)所做的修改,並修改lib源代碼以攔截defpackage調用,以某種方式預先加載gensym字符串以強制隔離。我知道,這種方法存在很多漏洞,而且我對包規格知之甚少,無法知道我可以埋葬這種方案。

我對Python一無所知,但我確實知道存在零售級應用程序;我一直使用MusicBrainz Picard。我將研究Python如何實現它。

回答

1

首先,ASDF與安裝庫無關。它只是一個按照由它們之間的依賴關係定義的順序來編譯和加載一組文件的工具。 ASDF-INSTALL安裝東西,它使用ASDF來確定依賴關係(我認爲),但還有其他安裝機制,如clbuild,手動提取和符號鏈接,或最近的開發Mudballs,它也替代ASDF。

特殊變量asdf:*central-registry*包含搜索asdf系統的目錄列表。它通常包含一個帶有符號鏈接到實際系統定義文件的目錄的補丁,但這不是必需的,因爲它只能包含具有系統定義文件的每個目錄。

這個變量將大部分時間由系統/網站庫註冊表的啓動腳本填充,但您可以將其更改爲任何您喜歡的內容,包括隔離的本地目錄。關於前一段的前一段,請注意,在同一個CL運行時上運行多個應用程序並不常見。通常會啓動一些默認的裸核,然後加載並運行庫和應用程序,然後在完成時關閉。

編輯:

ASDF只是一個圖書館和它的變量就像任何其他的LISP變量。在你描述的情況下,你可能想要抑制特定於實現的系統/用戶啓動腳本(在CCL中顯然是-n或--no-init命令行參數),然後手動加載asdf.lisp,(setf asdf:*central-registry* (list #p"pathtoprojectcentralregistry"))。或者可能創建一個函數來遞歸掃描項目目錄並將所有子目錄推送到那裏.asd文件。

1

一般來說,我會說任何安裝爲第三方庫的東西都應該修改主機系統狀態(因爲它是)。本地開發的東西可以通過幾種方法處理,我使用的是我自己的符號鏈接場(當需要時,隨附的shell腳本可以重建場)。 Lisp項目被簽出到他們自己的目錄中。相互依賴的項目也以這種方式檢出,在他們的ASDF系統定義中相互引用,並通過符號鏈接庫進行提取。

我用這個模型看到的一個可能性問題是,如果你突然發現你的支持庫的一部分依賴於庫BLAHONGA,在2008年12月1日之前檢出CVS並且你的支持庫的其他部分也取決於BLAHONGA ,但需要2008年12月29日之前僅在CVS中提供的功能。我想版本依賴也可能是一種可能性。

0

對於您的開發環境,您可以隨時在外部庫中檢查某處,並讓每位開發人員檢查到asdf:*central-registry*

另一個選擇是有一個單一的開箱,並讓每個開發人員在那裏運行一個Lisp + Swank。

0

我以前有過這樣的問題。我已經解決了通常的方式如下:

  1. 獲取整個系統,包括所需的庫的結構,變成了版本控制系統。 (像svn externals和git等效技術可以幫助解決這個問題)
  2. 在您的cl init文件中正確配置asdf:*central-registry*以指向您的工作副本中包含.asd文件的目錄。

事實上,因爲我在多個項目同時,我通常填充我CL初始化文件與多個配置像上面。例如,

(defun project1() 
    (push "/home/rpg/project1/src/" asdf:*central-registry*) 
    (push "/home/rpg/project1/extlib/" asdf:*central-registry*)) 

然後,當我開始我的開發環境,我可以簡單地輸入(project1)和航空自衛隊將被配置爲我準備到項目1環境中工作。

一個變體是爲每個項目製作一個加載文件,並將其檢入到源庫的根目錄中。該加載文件將配置ASDF的中央註冊表並加載系統。通過使用*load-truename*,中央註冊表的配置可以獨立於工作副本的位置。

另一個變種是自動搜索工作目錄樹來查找所有包含.asd文件的目錄,並相應地填充您的asdf:*central-registry*