Django:[virtualenv+pip]和[在svn中手动携带包]哪种方法更好



我有一个django项目,它使用了很多第三方应用程序,所以我想从两种方法中选择一种来管理我的情况:

  1. 我可以使用[virtualenv+pip]pip freeze作为需求文件来管理我的项目依赖关系。

    我不必担心应用程序,但我不能用我的代码将其提交给svn

  2. 我可以在我的svn结构中有一个lib文件夹,让我的应用程序放在那里,并将其添加到sys.path
这样,我的依赖项可以提交到svn,但我必须管理sys.path

我应该走哪条路?

每种方法的优点和缺点是什么?

更新:

方法1缺点:难以使用appengine。

到目前为止,这是一个尚未回答的问题(至少对我来说)。最近对此进行了一些讨论:-

https://plus.google.com/u/0/104537541227697934010/posts/a4kJ9e1UUqE

Ian Bicking在评论中这样说:-

我确实认为我们可以做一些将这两个系统结合起来的事情。我例如,早些时候发布了一个处理这个问题的方法(我想我应该清理并重新发布)。您可以在类似于Python中的方法,同时仍然使用我们必须管理的工具那些图书馆。你可以这么做,但根本不清楚如何这样做,人们往往会依赖于重新安装软件包之类的东西在部署时。

http://tarekziade.wordpress.com/2012/02/10/defining-a-wsgi-app-deployment-standard/

第一种方法似乎是python开发人员中最常见的方法。当我刚开始在Django中进行开发时,感觉有点奇怪,因为在进行PHP时,将第三方lib检查到项目repo中是很常见的,但正如Ian Bicking在链接的帖子中所说,PHP风格的部署忽略了诸如不可移植库之类的东西。你不想把mysqldb或PIL之类的东西打包到你的项目中,而这些东西最好由Pip或distribute之类的工具来处理。

所以这就是我目前使用的。

所有项目都将在项目根目录下有virtualenv目录。我们将其命名为.env,并在vcs中忽略它。dev在开始进行开发时所做的第一件事就是初始化这个virtualenv并安装requirements.txt文件中指定的所有需求。我更喜欢在项目目录中使用virtualenv,这样对开发人员来说是显而易见的,而不是在其他地方使用它,比如$HOME/.virtualenv,然后使用source $HOME/virtualenv/project_name/bin/activate来激活环境。相反,开发人员通过直接从项目根目录调用env可执行文件来与virtualenv交互,例如:-

.env/bin/python
.env/bin/python manage.py runserver

要进行部署,我们有一个结构脚本,它将首先将我们的项目目录和.env目录一起导出到tarball中,然后将tarball复制到实时服务器,解开它的部署目录,并执行一些其他任务,如重新启动服务器等。当我们在实时服务器上解开tarball时,结构脚本确保再次运行virtualenv,以便修复CCD_ 6中的所有shebang路径。这意味着我们不必在实时服务器上重新安装依赖项。部署的结构工作流将看起来像:-

fab create_release:1.1 # create release-1.1.tar.gz
fab deploy:1.1 # copy release-1.1.tar.gz to live server and do the deployment tasks
fab deploy:1.1,reset_env=1 # same as above but recreate virtualenv and re-install all dependencies
fab deploy:1.1,update_pkg=1 # only reinstall deps but do not destroy previous virtualenv like above

我们也不使用setup.py将项目src安装到virtualenv中,而是将其路径添加到sys.path中。因此,当在mod_wsgi下部署时,我们必须在vhost-config中为mod_wsgi指定2个路径,类似于:-

WSGIDaemonProcess project1 user=joe group=joe processes=1 threads=25 python-path=/path/to/project1/.env/lib/python2.6/site-packages:/path/to/project1/src

简而言之:

  1. 我们仍然使用pip+virtualenv来管理依赖关系
  2. 部署时我们不必重新安装需求
  3. 我们必须稍微维护一下进入sys.path的路径

Virtualenv和pip非常适合在一台机器上处理多个django项目。但是,如果您只有一个正在编辑的项目,则没有必要使用virtualenv。

最新更新