在决定为我的所有项目使用 buildout 之前,我已经对这个主题进行了一些安静的研究(值得几周)。
除了 Buildout 之外,还有 DistUtils 和 EasyInstall!
创建一个地方来比较所有这些工具的困难在于,它们都是同一工具链的一部分,并且一起用于创建可预测、可靠和灵活的工具集。
例如,easy_install 用于将 distutils 包从 pypi(cheeseshop) 安装到系统 Python 的 site-packages 目录。这大大简化了将软件包安装到系统/全局 sys.path 的过程。
easy_install 对于所有项目都一致的包非常方便。但是,我发现我更喜欢使用系统的 easy_install 来安装项目不依赖的包。例如,我在每个项目中都使用github-cli,因为它允许我从命令行与项目的 Github 问题进行交互。我在项目中使用它,但这是为了方便,项目本身不依赖于这个包。
为了管理项目的依赖关系,我使用buildout。Buildout 允许您明确指出您的项目所依赖的包的版本。我更喜欢 buildout 而不是 pip-requirements.txt 因为 buildout 是声明性的。使用 pip,您可以安装软件包,并在开发结束时生成 requirements.txt 文件。另一方面,使用 Buildout,您可以在将包 egg 添加到项目之前修改 buildout.cfg。这迫使我意识到我要添加到项目中的包。
现在,有一个virtualenv的问题。virtualenv 最广为人知的特性之一显然是--no-site-packages选项。我还没有发现该选项特别有用,因为我使用的是 buildout。Buildout 管理 sys.path 并且只包含我要求它包含的包。它还包括系统 Python 的站点包中的所有内容,但由于我没有在项目中使用的任何内容,因此我从来没有冲突。
另外,我发现 --no-site-packages 只会阻碍我的开发过程,因为我使用系统的打包系统安装了一些包。通常,任何具有需要编译的 C 库的东西,我都会通过系统的打包系统进行安装。
在项目的fabfile.py 中,我包含了测试函数来测试我通过系统的包管理器安装的系统包的存在。
总之,这是我使用这些工具的方式:
System's Package Manager(apt-get, yam, port, fink ...)
我使用其中之一在这个系统上安装我需要的 python 版本。我还使用它来安装包含 c 库的lxml等软件包。
easy_install
我用来安装我在所有项目中使用的 pypi 包,但项目不依赖于这些包。
buildout
我用来管理项目的依赖关系。
根据我的经验,这个工作流程非常灵活、便携且易于使用。