在我们公司,我们有一个非常好的系统设置,用于跟踪我们当前桌面应用程序开发(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应用程序中的依赖关系,以支持大型团队的开发?
答案 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
运行buildout
并修复给定的错误。 (基本上只是创建结构目录。)
只需将所有依赖项添加到eggs
的{{1}}部分,即可让它为您管理。
非常适合我。