在對所有項目使用buildout之前,我已經對這個主題(幾個星期的價值)進行了一些研究,並做了一些研究。
DistUtils和EasyInstall除了構建!
創建一個地方來比較所有這些工具的困難在於它們都是同一個工具鏈的一部分,並且一起用來創建可預測,可靠和靈活的工具集。
例如,easy_install用於將pypi(cheeseshop)中的distutils軟件包安裝到您的系統Python站點包目錄中。這極大地簡化了軟件包到系統/全局sys.path的安裝。
easy_install對於所有項目都一致的軟件包非常方便。但是,我發現我更喜歡使用系統的easy_install來安裝項目不依賴的軟件包。例如,github-cli我用於每個項目,因爲它允許我從命令行與項目的Github問題進行交互。我將這與項目一起使用,但這是爲了方便,項目本身並不依賴於此包。我使用構建。 Buildout允許你明確指出你的項目依賴於什麼版本的軟件包。我更喜歡通過pip-requirements.txt構建,因爲buildout是聲明性的。使用pip,您可以安裝軟件包,並在開發結束時生成requirements.txt文件。另一方面,通過構建,可以在將包egg添加到項目之前修改buildout.cfg。這迫使我意識到我要添加到項目中的包。
現在,有一個問題virtualenv。 virtualenv最廣爲人知的特性之一顯然是- 無站點包選項。我沒有發現這個選項特別有用,因爲我使用buildout。構建管理sys.path,只包含我要求包含的包。它還包括系統Python站點包中的所有內容,但由於我沒有任何項目中使用的東西,因此我從來沒有發生衝突。
此外,我發現--no-site-packages只會阻礙我的開發過程,因爲我使用我的系統的包裝系統安裝了一些軟件包。通常,任何有C庫的東西都需要編譯,我通過系統的打包系統進行安裝。
在項目的fabfile.py我包含測試函數來測試我通過系統的包管理器安裝的系統包的存在。
總之,這裏是我如何使用這些工具:
系統的軟件包管理器(apt-get的,山藥,港口,芬克...) 我用其中的一個安裝Python版本的我需要在這個系統上。我還使用它來安裝包含c庫的包,如lxml。
easy_install 我用來從所有項目上使用pypi安裝軟件包,但項目不依賴於這些軟件包。
擴建 我用來管理項目的依賴關係。
根據我的經驗,這個工作流程非常靈活,便於攜帶並且易於使用。
部署層似乎比當今典型的包更復雜。雞蛋,容易這個和虛擬的......很抱歉,但我更喜歡將.py文件複製到sys.path中。至少這樣我可以看到發生了什麼,並且不會出現莫名的部署和導入錯誤。 – bobince 2009-12-29 23:36:36
沒有人提到過'distutils2'與'distutils'和'bento' ... – Brendan 2011-03-20 13:05:05
我寫的這個答案會回覆部分問題:http://stackoverflow.com/a/6522905/821378 – 2012-02-11 03:42:03