Django 1.7 + Django CMS - 从我的仓库中删除迁移文件或在仓库中包含 virtualenv?

Posted

技术标签:

【中文标题】Django 1.7 + Django CMS - 从我的仓库中删除迁移文件或在仓库中包含 virtualenv?【英文标题】:Django 1.7 + Django CMS - drop migration files from my repo or include virtualenv in repo? 【发布时间】:2015-02-24 23:33:36 【问题描述】:

我正在使用 git 对 Django 1.7 + Django CMS 3.0.6 项目进行版本控制。

在构建各种应用程序等的过程中,我最终得到了很多迁移文件。迁移文件目前包含在我的 git 存储库中。

到目前为止,我一直在尝试避免将虚拟 env 文件直接包含在我的 repo 中,因为它看起来相当混乱和多余。相反,到目前为止,我一直在 repo 中包含一个 pip 需求文件,并在需要时使用它来重新创建虚拟环境。

但是,我最近发现选择在 repo 中包含迁移文件似乎也需要在 repo 中包含所有虚拟 env 文件。我这样说是因为在将我的项目部署到生产服务器并尝试通过 python manage.py 运行任何 db 命令(syncdb、makemigrations 或 migrate)时,我得到了错误:

KeyError: u"Migration image_gallery.0001_initial dependencies reference nonexistent parent node (u'cms', u'0004_auto_20141108_1256')"

而在我的本地计算机上不会发生此类错误,即使在删除数据库之后也是如此。

我跟踪了这​​个错误的根源,因为我本地机器上的虚拟环境引用了“0004_auto_20141108_1256”(在 django-cms 包内 - 似乎一些 cms 迁移信息直接记录在虚拟环境中目录本身),而生产环境没有 - 因为生产 venv 是通过 pip 要求文件创建的。 因此,两个虚拟环境并不完全匹配,即使所有第三方库都相同。目前我没有在我的 git repo 中包含 venv。

所以在我看来,我有两个选择:

1. include the virtual env in my git repo
2. drop the migration files from git

哪个选项更好,为什么 - 或者还有第三种更好的方法吗?

#1 的缺点是不必要的臃肿。选项 #2 的缺点是丢失了迁移历史记录,这是一个可能想要保留的东西。

【问题讨论】:

【参考方案1】:

问题出在我的 django settings.py 文件中:

MIGRATION_MODULES = 
    'cms': 'cms.migrations_django',
    'menus': 'menus.migrations_django',
    'djangocms_file': 'djangocms_file.migrations_django',
    ...

我不得不介绍上述内容以使 django-cms 3.0.6 与 django 1.7 一起使用,这是因为 django 1.7 中的迁移不再使用 South 完成,因为 django 1.7 现在拥有自己的迁移系统,而cms 3.0.6。仍然希望迁移默认由 South 管理。

但是,上述配置的效果是将迁移存储在上述路径中,在我的例子中,这些路径直接指向虚拟环境。因此迁移信息被存储在虚拟环境目录中,导致部署到生产环境中出现问题。

为了解决这个问题,我修改了我的项目目录结构以包含一个名为“migrations”的文件夹:

myproject/manage.py
myproject/migrations/
myproject/myproject/
...

并将配置修改为:

MIGRATION_MODULES = 
    'cms': 'migrations.cms.migrations_django',
    'menus': 'migrations.menus.migrations_django',
    'djangocms_file': 'migrations.djangocms_file.migrations_django',
    ...

这具有现在将所有迁移文件存储在 django 项目本身(以及 git repo 的扩展)中的效果。由于迁移信息不再位于虚拟 env 目录中,因此不再有任何理由考虑将虚拟 env 包含在 repo 中的相当不吸引人的可能性。

【讨论】:

【参考方案2】:

你永远不会提交虚拟环境,它违背了目的;您只需向 git 添加不必要的内容。

相反,冻结需求并提交文件:

pip freeze > requirements.txt

在服务器上安装包:

pip install -r requirements.txt

【讨论】:

我目前正在使用这种方法 - 但是,正如我的问题所述,生成的虚拟环境与我的本地环境不同,因为在我的本地计算机上执行的迁移实际上会修改虚拟环境中的文件本身(在 django-cms 中,这是特定于 django cms 的吗?)以需求文件未捕获的方式。因此,当尝试在生产中设置全新安装时,由于虚拟环境中的这种差异,我在尝试设置数据库时遇到错误(有关更多详细信息,请参阅问题)。 对不起,应该读了两遍,写了一个:)。我查看了 github 上的项目,似乎其他人也有类似的问题。 v3.0.7 中似乎有一个修复程序。我没有使用过 django-cms,所以我不能评论它是否能解决你的问题。 github.com/divio/django-cms/issues/3572 Pran:看看我的回答,希望它会帮助解决这个问题。在我的情况下,问题并不是 django-cms 的问题,而是配置问题(尽管我怀疑我在网上找到的一些配置 cms 的建议可能导致了我的问题)。

以上是关于Django 1.7 + Django CMS - 从我的仓库中删除迁移文件或在仓库中包含 virtualenv?的主要内容,如果未能解决你的问题,请参考以下文章

django-cms 和 jQuery

Django 1.7 vs Django1.6 vs Django 1.5 [关闭]

无法导入名称六 Django-CMS

Django CMS 教程

Django 1.7 中的 Django-migrations 检测模型更改,但不会在迁移时应用它们

Django-CMS - 当我指定模型时,管理员的 CMS 部分消失