2010-09-11 58 views
1

在我们公司,我们有一个非常好的系统设置,用于跟踪我们当前桌面应用程序开发(C++/python)版本控制中的外部程序包依赖关系。我们正在开发一些python只有web应用程序正在寻找最佳实践的建议,因为只涉及python代码,它来自easy_install可用包。在项目VCS中保持Python GAE依赖关系的最佳实践

对于我们的桌面应用程序,我们有这样的事情:

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项目,我想使用(鼻,nosegae等),建议使用easy_install下载和安装他们。尽管如此,这将它们安装到主系统目录中。我真正想要的是将代码安装到每个包的特定目录中。 (注意:我打算在main.py中添加一些代码,以便将所有软件包以正确的顺序添加到sys.path中)。有没有办法做到这一点?这是一个好主意吗?

那里有什么最佳实践来跟踪纯python应用程序中的依赖关系以支持与大型团队的开发?

+0

注:我不认为我可以使用virtualenv。第一个原因是它不适用于nosegae。 (请参阅:http://code.google.com/p/nose-gae/issues/detail?id = 11),其次是我认为它打破了我的目标,因此开发团队可以简单地检查存储库,并拥有一切,然后需要运行。 (即我不认为你可以将Virtualenv提交给VCS)。请告诉我,如果我错了。 :) – Allen 2010-09-12 13:46:29

回答

1

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

+0

我想过这样做,但我没有看到一种方法来获取安装到版本控制目录中的依赖关系。实际上,我想要的是从项目检出代码中的共享目录(或多个目录)中提取的virtualenv。 (换句话说,我不希望开发人员不得不在本地机器上安装任何东西,只需查看存储库并去) – Allen 2010-09-11 16:08:50

+0

经过深入研究,我尝试使用'pip -E .../deps鼻子“来安装软件包。我曾经在网上看过一些说这应该起作用的参考,但它没有。我认为pip必须以标准或virtualenv为目标,并且不能简单地定位到我想要放置包的目录。我仍在四处寻找解决办法。 – Allen 2010-09-12 13:44:08

0

我一直在试图找出在Python项目中使用Ivy和Maven与Java项目一起使用自动化依赖解决方案的最佳方法。

从我所知道的来说,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中是必不可少的,如果你在互联网上拉动的依赖。

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让它为您管理它们。

对我很好用。