2014-09-05 113 views
0

我正在尋找更好的方式來構建我的研究項目。我有以下設置:項目結構。科學Python項目

有項目a,b,c和庫lib。每個項目都會解決一個不同的研究問題,並且該庫提供跨項目使用的代碼。因此所有項目都取決於lib。事情變得更加複雜,因爲項目c也取決於項目ab。當我在項目c上工作時,我還將同時更新a,blib。每個項目都在一個單獨的git存儲庫中。

到目前爲止,我已經通過包含上述依賴關係通過git submodule處理了這種情況,並且所有源文件都位於項目的根目錄中。好處是我跟蹤我的項目依賴於哪個版本的lib。我的一個項目也可能依賴lib的過時版本。我從根目錄運行所有的東西,而無需將任何軟件包「安裝」到網站軟件包等等。當路徑設置不正確時,我通過sys.path.insert覆蓋它。

然而,有以下幾點讓我想改變佈局:

  • 我一直無法追蹤我的編輯,其中lib版本。
  • 我想利用自動化測試工具(tox,jenkins等),這些工具似乎更容易處理標準的項目設置。
  • sys.path.insert可能會導致難以調試的細微問題。
  • 我通常希望我的所有項目都可以使用lib的小費。

所以我目前正在重新整理所有項目(especiall lib)是在標準Python目錄結構線(源存儲在一個子目錄,根含有setup.py文件),能夠在virtualenv工作。然後我可以在requirements.txt中列出我的所有依賴項。首先,我通過pip install -e開發安裝lib。然後我運行pip freeze> requirements.txt,然後包含類似於此的一行。

-e git+<path_to_remote>@<sha>#egg=`lib` 

所以我一再產生於特定的依賴性提交(SHA)與git submodule,確保我能籤一個老犯,項目應運行。我現在可以安裝所有東西在virtualenv並擺脫我的路徑問題。大。

雖然我面臨一些新的麻煩。一個問題是,如何更新requirements.txt中的sha。我看到的最簡單(但可能不是最優雅的)解決方案是編寫一個pre-commit hook,在提交之前更新sha。有沒有更好的辦法?

更一般地說 - 你看到一個更好的解決方案給我的設置?

回答

0

就我所見,你已經基本解決了你的問題,只剩下一小部分。

1)不要使用散列來標識您的庫的版本。即使您沒有將庫發佈到奶酪店,也要執行正常的庫版本管理(semver)並相應地爲您的git存儲庫添加標籤。事情的方式是,您將在您的git+https://github.com/...依賴關係網址中擁有易於理解且可管理的版本。

2)以允許您測試穩定版本的依賴關係(您上次標記的版本)和最新版本的主版本的方式設置您的tox。