1

在我们公司,我们有一个非常好的系统设置,用于跟踪我们当前桌面应用程序开发 (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 项目(nose、nosegae 等)都建议使用easy_install来下载和安装它们。不过,这会将它们安装到主系统目录中。我真正想要的是将代码安装到每个包的特定目录中。(注意:我打算在 main.py 中放置一些代码,以便将 deps 中的所有包正确添加到 sys.path 中)。有没有办法做到这一点?这甚至是个好主意吗?

跟踪纯 Python 应用程序中的依赖项以支持大型团队开发的最佳实践是什么?

4

3 回答 3

1

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

于 2010-09-11T14:48:38.197 回答
0

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

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

  • 在一个空的项目目录中创建buildout.cfg,并versions.cfg从示例中复制 。自定义 GAE 版本buildout.cfg

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

  • 只需将任何依赖项添加到eggs部分,buildout.cfg让它为您管理它们。

对我很有用。

于 2012-11-23T19:41:28.240 回答
0

在将 Ivy 和 Maven 与 Java 项目一起使用后,我也一直在尝试找出在 Python 项目中获得自动依赖解析的最佳方法。

据我所知,Python 中没有什么比 Maven 更有效,但zc.buildout似乎非常接近。它使用与 pip/distribute 相同的传统distutils setup.py 脚本,但在构建项目方面提供了更大的灵活性。它不需要搞乱virtualenv,但仍然提供隔离的构建环境。

然后,您应该设置一个本地 Pypi 实例并将其用作所有 Python 依赖项的存储库。

如果您的依赖项都是纯 Python,那么这应该可以很好地工作。如果您对本机代码有依赖关系,那么您可能会遇到问题。有一些扩展配方可以帮助实现这一点,您可以轻松创建自己的自定义配方。

如果您要通过 Internet 拉取依赖项,让每个开发人员在~/.buildout/default.cfg中设置下载缓存属性是必不可少的。

于 2011-10-18T07:55:16.570 回答