2009-11-07 50 views
3

組織和開發由共享一個(或多個)更大的Python庫的許多小腳本組成的項目的最佳方式是什麼?使用共享軟件包組織Python項目

我們在我們的倉庫中有一堆程序,它們都使用存儲在同一個倉庫中的相同的庫。所以,換句話說,像

trunk 
    libs 
     python 
     utilities 
    projects 
     projA 
     projB 

佈局當我們的節目的正式運行完成後,我們要記錄使用的是什麼版本的代碼。對於我們的C++可執行文件,事情很簡單,因爲只要工作副本在編譯時是乾淨的,一切都很好。 (由於我們通過編程獲得版本號,它必須是工作副本,而不是導出。)對於Python腳本,事情更復雜。

問題是,通常一個項目(例如projA)將會運行,而projB將需要更新。這可能會導致工作副本修訂在運行時出現混合到projA。 (該代碼需要時間來運行,並且可以被用作輸入,用於稱取天運行,因此強可追溯性目標的過程。)

我的當前的解決方法是,如果必要的話,檢查出中繼線的另一拷貝到不同的位置,並跑到那裏。但是,我需要記住將PYTHONPATH改爲指向lib/python的第二個版本,而不是第一個樹中的那個。

這不可能有完美的答案。但是一定有更好的辦法。

我們是否應該使用subversion關鍵字來存儲版本號,以便數據用戶導出文件?我們應該使用virtualenv嗎?我們是否應該更多地採用包裝和安裝機制? Setuptools是標準的,但我已經閱讀了有關它的各種各樣的東西,它似乎是爲非開發人員最終用戶(我們沒有)最終用戶設計的。

+0

你是說你正在改變你的生產庫,而直播代碼使用它們嗎? – 2009-11-07 01:01:41

+0

我在說可能會發生這種情況。當我正在執行程序的正式運行時,發生了類似的事情。我沒有更改當前使用的工作副本中的任何代碼,但svn不知道,所以它說它是一個混合存儲庫。我的跑步拋出了一個例外,因爲它應該。由於項目中的大多數人不關心使用乾淨的副本,我希望儘可能不可能做出這樣的可能性。 – AFoglia 2009-11-07 23:38:25

回答

2

更好的解決方案不涉及將所有項目及其共享依賴項存儲在同一個存儲庫中。

爲每個項目使用一個存儲庫,爲共享庫使用externals

利用共享庫存儲庫中的標籤,因此消費者項目可以使用他們在外部需要的版本。

編輯:(剛剛從我的評論複製此)使用virtualenv如果您需要在同一臺服務器上不同的應用程序提供隔離的運行時環境。然後每個環境可以包含它需要的唯一版本的庫。

+0

我同意,並且一直想要使用它們一年以上,但其他人似乎沒有爲他們推動。我們有幾個程序員在使用「svn cp」時遇到問題; svn外部對他們來說太複雜了。也沒有用的是可怕的精通建立系統,並知道如何設置。 但最重要的是,這並不能解決輕鬆控制Python在哪裏查看_runtime_的問題。 – AFoglia 2009-11-07 23:42:22

+1

AFoglia,也許你可以使用virtualenv爲每個項目創建一個單獨的運行時環境。 – 2009-11-08 00:00:27

+0

我一直在玩virtualenv,我認爲它會做我想做的。首先,我需要弄清楚如何使用setuptools輕鬆安裝軟件包,但這是另一個問題。 – AFoglia 2009-11-10 15:42:38

1

如果我正確理解你的問題,那麼你一定想要virtualenv。添加一些virtualenvwrapper善良,使它更好。