我正在尋找更好的方式來構建我的研究項目。我有以下設置:項目結構。科學Python項目
有項目a
,b
,c
和庫lib
。每個項目都會解決一個不同的研究問題,並且該庫提供跨項目使用的代碼。因此所有項目都取決於lib
。事情變得更加複雜,因爲項目c
也取決於項目a
和b
。當我在項目c
上工作時,我還將同時更新a
,b
或lib
。每個項目都在一個單獨的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。有沒有更好的辦法?
更一般地說 - 你看到一個更好的解決方案給我的設置?