在项目VCS中保持Python GAE依赖关系的最佳实践

时间:2010-09-11 14:39:38

标签: python google-app-engine easy-install

在我们公司,我们有一个非常好的系统设置,用于跟踪我们当前桌面应用程序开发(C ++ / python)的版本控制中的外部包依赖项。我们开始开发一些只有python的Web应用程序正在寻找最佳实践的建议,当只涉及python代码并且它来自easy_install'able包时。

对于我们的桌面应用,我们有类似的内容:

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项目(鼻子,鼻子等)都建议使用easy_install来下载和安装它们。这会将它们安装到主系统目录中。我真正想要的是将代码安装到每个包的特定目录中。 (注意:我计划在main.py中添加一些代码,这些代码会将所有的软件包正确地添加到sys.path中)。有没有办法做到这一点?这甚至是个好主意吗?

有哪些最佳实践可以跟踪纯python应用程序中的依赖关系,以支持大型团队的开发?

3 个答案:

答案 0 :(得分:1)

您可以使用virtualenv + pip。使用virtualenv,您可以为您的应用程序创建自定义环境,其中所有软件包都在本地安装pip(easy_install替换)在环境中,而不是在系统范围内。然后,您可以生成一个依赖项列表,以便自动安装它们。

答案 1 :(得分:0)

我一直在努力弄清楚在Python项目中使用Ivy和Maven以及Java项目时,在Python项目中获得自动依赖项解析的最佳方法是什么。

据我所知,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 中设置 download-cache 属性是必不可少的,如果您在互联网上提取依赖关系。

答案 2 :(得分:0)

我将zc.buildout与最初为Tipfy编写的食谱一起使用:查看https://github.com/runway7/terminal以获取示例buildout.cfg

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

  • 在空项目目录中创建buildout.cfg,并从示例中复制versions.cfg。在buildout.cfg

  • 中自定义GAE版本
  • 运行buildout并修复给定的错误。 (基本上只是创建结构目录。)

  • 只需将所有依赖项添加到eggs的{​​{1}}部分,即可让它为您管理。

非常适合我。