2010-02-10 49 views
38

只是好奇人們是如何使用的virtualenvDjango和VIRTUALENV開發/部署的最佳實踐

  • 更具體部署結合自己的Django項目,你如何保持你的開發機正確同步的你生產的virtualenv的?

我使用git for scm,但是我沒有在git repo中使用virtualenv - 我應該使用pip凍結還是使用凍結輸出在服務器上重新創建環境? (如果你這樣做,請你描述的步驟 - 我發現在解凍過程中很少好的文檔 - 有點像pip install -r freeze_output.txt可能嗎?)

回答

21

我只是在使用pip,Fabric和git來設置類似的東西。流程基本上是這樣的,並從中大量借用this script

  1. 在我們的源代碼樹中,我們維護一個requirements.txt文件。我們將手動維護。
  2. 當我們做一個新版本時,Fabric腳本根據我們傳遞它的任何樹形創建一個存檔。
  3. Fabric將找到我們正在部署的內容的SHA,使用git log -1 --format=format:%h TREEISH。這給了我們SHA_OF_THE_RELEASE
  4. Fabric將得到我們需求文件的最後一個SHA,其中git log -1 --format=format:%h SHA_OF_THE_RELEASE requirements.txt。這就產生了散列的短版本,比如1d02afc,它是這個特定版本的文件的SHA。
  5. Fabric腳本將查看我們的virtualenvs存儲在遠程主機上的目錄。
    1. 如果沒有一個名爲1d02afc目錄,新的virtualenv創建和設置與pip install -E /path/to/venv/1d02afc -r /path/to/requirements.txt
    2. 如果有現有path/to/venv/1d02afc,什麼都不做

的小魔術其中一部分是傳遞任何你想要的東西,然後讓它做包裝(來自Fabric)。通過使用git archive my-branch,git archive 1d02afc或其他任何東西,我保證會在我的遠程機器上安裝正確的軟件包。

我走了這條路線,因爲如果軟件包在發行版之間沒有改變,我真的不想有額外的virtuenvs浮動。我也不喜歡在自己的源代碼樹中擁有我所依賴的實際軟件包的想法。

+0

鏈接被破壞+( – 2013-01-08 16:03:50

4

我用這個bootstrap.py:http://github.com/ccnmtl/ccnmtldjango/blob/master/ccnmtldjango/template/bootstrap.py

其預計被稱爲'要求'的目錄看起來像這樣:http://github.com/ccnmtl/ccnmtldjango/tree/master/ccnmtldjango/template/requirements/

有一個apps.txt,一個libs.txt(其中apps.txt包括 - 我只是想保持Django的應用程序與其他python模塊分開)和一個包含實際tarball的src目錄。

當運行./bootstrap.py時,它會創建virtualenv(如果它存在,則擦除前一個),然後將requirements/apps.txt中的所有內容安裝到它中。否則,我不會將任何東西安裝到virtualenv中。如果我想包含一個新的庫,我將tarball放入requirements/src /中,在其中一個文本文件中添加一行並重新運行./bootstrap.py。

bootstrap.py和需求被檢入版本控制(也是pip.py的一個副本,所以我甚至不必在任何地方安裝系統)。 virtualenv本身不是。我推送到生產環境的腳本在每次推送時都會在生產服務器上運行./bootstrap.py。 (bootstrap.py也需要一定的時間來確保它堅持Python 2.5,因爲這就是我們在生產服務器上所擁有的(Ubuntu Hardy),而我的開發機器(Ubuntu Karmic)默認爲Python 2.6,如果你不小心的話)

+1

此答案中的鏈接已損壞。請你能糾正嗎? – Kev 2011-11-07 18:20:48

+1

鏈接已更新。謝謝。 – thraxil 2011-11-10 15:31:13