すべてのプロジェクトでビルドアウトを使用することに決める前に、このトピックについて静かに少し調査しました(数週間の価値があります)。
Buildoutに加えてDistUtilsとEasyInstall!
これらすべてのツールを比較するための1つの場所を作成することの難しさは、それらがすべて同じツールチェーンの一部であり、予測可能で信頼性が高く柔軟なツールセットを作成するために一緒に使用されることです。
たとえば、easy_installは、distutilsパッケージをpypi(cheeseshop)からシステムのPythonのsite-packagesディレクトリにインストールするために使用されます。これにより、システム/グローバルsys.pathへのパッケージのインストールが大幅に簡素化されます。
easy_installは、すべてのプロジェクトで一貫性のあるパッケージに非常に便利です。しかし、プロジェクトが依存しないパッケージをインストールするために、システムのeasy_installを使用することを好むことがわかりました。たとえば、github-cliはすべてのプロジェクトで使用します。これにより、コマンドラインからプロジェクトのGithubの問題を操作できるようになります。私はこれをプロジェクトで使用しますが、これは便宜上のものであり、プロジェクト自体はこのパッケージに依存していません。
プロジェクトの依存関係を管理するために、私はビルドアウトを使用します。Buildoutを使用すると、プロジェクトが依存しているパッケージのバージョンを具体的に示すことができます。ビルドアウトは宣言型であるため、pip-requirements.txtよりもビルドアウトの方が好きです。pipを使用してパッケージをインストールし、開発の最後にrequirements.txtファイルを生成します。一方、Buildoutでは、パッケージeggをプロジェクトに追加する前にbuildout.cfgを変更します。これにより、プロジェクトに追加するパッケージを意識する必要があります。
さて、 virtualenvの問題があります。virtualenvの最も公表されている機能の1つは、明らかに--no-site-packagesオプションです。私はビルドアウトを使用しているので、そのオプションが特に役立つとは思いませんでした。Buildoutはsys.pathを管理し、含めるように指示したパッケージのみを含めます。また、システムPythonのサイトパッケージにすべてが含まれていますが、プロジェクトで使用するものがないため、競合が発生することはありません。
また、システムのパッケージングシステムを使用してインストールするパッケージもあるため、-no-site-packagesは開発プロセスを妨げるだけであることがわかりました。通常、コンパイルする必要のあるCライブラリがあるものはすべて、システムのパッケージングシステムを介してインストールします。
プロジェクトのfabfile.pyに、システムのパッケージマネージャーを介してインストールするシステムパッケージの存在をテストするためのテスト関数を含めます。
要約すると、これらのツールの使用方法は次のとおりです。
システムのパッケージマネージャー(apt-get、yam、port、fink ...)
これらのいずれかを使用して、このシステムに必要なPythonバージョンをインストールします。また、cライブラリを含むlxmlのようなパッケージをインストールするためにも使用します。
easy_install
私はすべてのプロジェクトで使用するpypiからパッケージをインストールするために使用しますが、プロジェクトはこれらのパッケージに依存していません。
プロジェクトの依存関係を管理するために使用するビルドアウト。
私の経験では、このワークフローは非常に柔軟で、移植性があり、操作が簡単です。