2010-09-11 55 views
1

在我們公司,我們有一個非常好的系統設置,用於跟蹤我們當前桌面應用程序開發(C++/python)版本控制中的外部程序包依賴關係。我們正在開發一些python只有web應用程序正在尋找最佳實踐的建議,因爲只涉及python代碼,它來自easy_install可用包。在項目VCS中保持Python GAE依賴關係的最佳實踐

對於我們的桌面應用程序,我們有這樣的事情:

app_svn_root 
    - trunk 
    - src 
    - doc 
    - deps -> [svn:external to deps repos with rev num set] 

deps_svn_root 
    - trunk 
    - setup_env.sh/bat [generated automatically 
    - dep_project_1 [example: boost, libxml, python, etc] 
     - vendor_base [svn:external to vendor branch or project repository] 
     - install_linux_gcc43 
     - bin 
     - include 
     - lib 
     - install_linux_win32_vc90 
     - ... [whatever directory structure the project build creates] 

當上球隊的任何開發者檢出應用程序的代碼,它們會自動得到所有的依賴關係,並用正確的版本爲讓他們修改代碼。 [注:有幾個內部管理腳本等,我忽略了,但這是一般的想法]。這對我們非常有用。沒有開發人員需要擔心每個包含正確版本的個人機器,它允許一次檢出多個開發副本(例如:1.0,1.1,2.0等),它允許持續集成系統來打包依賴關係,並使用正確版本的Deps運行單元測試。

現在我們開始在一些基於python項目的谷歌應用程序引擎上工作,我們希望像上面這樣。我們希望讓開發人員能夠立即檢查他們需要的所有內容,並確保每個人都使用相同的依賴關係。我們可以繼續使用這個確切的結構,但是對於一個純粹的python項目來說它似乎很重。

本來我想的是這樣的:

- trunk 
    - gae_apps 
    - gae_sdk [svn:external to the latest stable GAE code] 
    - deps 
     - nose 
     - nosegae 
     - pylint 
    - app1 
     - templates 
     - tests 
     - deps 
     - webapp2 
     - console 

我遇到的問題是,所有的Python項目,我想使用(鼻,nosegae等),建議使用easy_install下載和安裝他們。儘管如此,這將它們安裝到主系統目錄中。我真正想要的是將代碼安裝到每個包的特定目錄中。 (注意:我打算在main.py中添加一些代碼,以便將所有軟件包以正確的順序添加到sys.path中)。有沒有辦法做到這一點?這是一個好主意嗎?

那裏有什麼最佳實踐來跟蹤純python應用程序中的依賴關係以支持與大型團隊的開發?

+0

注:我不認爲我可以使用virtualenv。第一個原因是它不適用於nosegae。 (請參閱:http://code.google.com/p/nose-gae/issues/detail?id = 11),其次是我認爲它打破了我的目標,因此開發團隊可以簡單地檢查存儲庫,並擁有一切,然後需要運行。 (即我不認爲你可以將Virtualenv提交給VCS)。請告訴我,如果我錯了。 :) – Allen 2010-09-12 13:46:29

回答

1

您可以使用virtualenv + pip。藉助virtualenv,您可以爲您的應用程序創建自定義環境,其中所有軟件包都是在本地使用pip(easy_install替換)在環境中安裝的,而不是系統範圍的。然後,您可以生成一個依賴關係列表,供他們自動安裝。

+0

我想過這樣做,但我沒有看到一種方法來獲取安裝到版本控制目錄中的依賴關係。實際上,我想要的是從項目檢出代碼中的共享目錄(或多個目錄)中提取的virtualenv。 (換句話說,我不希望開發人員不得不在本地機器上安裝任何東西,只需查看存儲庫並去) – Allen 2010-09-11 16:08:50

+0

經過深入研究,我嘗試使用'pip -E .../deps鼻子「來安裝軟件包。我曾經在網上看過一些說這應該起作用的參考,但它沒有。我認爲pip必須以標準或virtualenv爲目標,並且不能簡單地定位到我想要放置包的目錄。我仍在四處尋找解決辦法。 – Allen 2010-09-12 13:44:08

0

我一直在試圖找出在Python項目中使用Ivy和Maven與Java項目一起使用自動化依賴解決方案的最佳方法。

從我所知道的來說,Python沒有像Maven那樣工作得很好,但zc.buildout似乎非常接近。它使用與pip/distribute相同的傳統distutils setup.py script,但爲您構建項目提供了更大的靈活性。它不需要用virtualenv搞亂,但仍然提供了一個獨立的構建環境。

然後您應該set up up a local Pypi instance並將其用作所有Python依賴項的存儲庫。

如果你的依賴都是純Python,那麼這應該工作得很好。如果你對本地代碼有依賴性,那麼你可能會遇到問題。有buildout recipes幫助使這成爲可能,你可以輕鬆地創建自己的定製。

有每個開發者設置下載緩存財產〜/ .buildout/default.cfg中是必不可少的,如果你在互聯網上拉動的依賴。

0

我使用zc.buildout和最初爲Tipfy編寫的食譜:https://github.com/runway7/terminal舉例buildout.cfg

  • 安裝zc.buildout - pip install zc.buildout

  • 創建一個空的項目目錄中buildout.cfg,並且還從例如複製versions.cfg。自定義GAE版本buildout.cfg

  • 運行buildout並修復給定的錯誤。 (基本上只是創建結構目錄。)

  • 只需添加任何依賴eggs部分buildout.cfg讓它爲您管理它們。

對我很好用。