如何在新项目中 develop/include Django 自定义可重用应用程序?有一些指南吗?

How to develop/include a Django custom reusable app in a new project? Are there some guidelines?

以下 tutorial on Django reusable apps 一切正常。但是我对开发和打包Django应用程序的过程有一些疑问。

1 - 在本教程中,首先在项目中开发应用程序。然后,它被复制粘贴到另一个文件夹中进行打包,然后通过 pip 再次包含在项目中。这是开发 Django 应用程序的方式吗?例如,如果我必须包含新功能或修复错误,我是否应该在项目中进行更改,然后将它们复制粘贴到项目外的包文件夹中?

2 - 假设 1 不是开发应用程序的唯一方法,我开始使用以下结构为我的应用程序创建包文件夹:

django-myApp
|--myApp
|  |--models
|     |--file1.py
|     |--file2.py
|--setup.py
|--README.rst

在 运行 宁 python3 setup.py sdist 并使用 pip3 install --user myApp.tar.gz 安装后,我可以从新的 Django 项目 shell 成功导入我的应用程序。但是当我 运行 python3 manage.py 迁移时,不会创建 myApp 模型的表。我猜这是因为 myApp 包中没有迁移文件夹,据我所知,创建迁移的唯一方法是在项目中 运行ning makemigrations 。或者我错过了一些基本的东西吗?我可以在项目中没有应用程序的情况下生成初始迁移模块吗?

3 - 最后,最主要的问题是:在开发一个app的时候,是不是一定要先启动一个项目,把app文件夹拷贝出来打包,再通过安装重新include,然后在package文件夹下继续开发?

提前感谢您的任何评论或指导。

P.D.: 抱歉我的英语不好,评论也很受欢迎

编辑 1:

举例说明我的疑惑:教程结束后,App源代码在项目外,假设我需要更改模型。我可以在 App 文件夹中更改它们,发布新版本(例如 0.2)并安装它。现在,如何为这些更改生成迁移?我应该总是有一个测试项目吗?

  1. 当您打包应用程序时,是因为您认为值得在多个项目中使用它并且它本身具有一定的价值。您可以按照指南保持您的应用程序处于良好状态(最小功能工作)后可重复使用和打包。 好的,您已经准备好您的应用程序,它可以执行您想要的操作,那么现在您想将它与您的项目分开吗?按照您链接的教程获取有关文件夹结构的指南,并将其上传到存储库。也添加一些测试,它们是必须的。 您现在可以使用几种方法将其恢复到您的项目中。

    • 打包并通过 pip(或直接从存储库)从 tar.gz 安装它
    • 将您的存储库克隆为 submodule
    • 在您的项目中保留一个副本并在存储库中手动更新更改

我不是第三个的粉丝。第二种选择有其注意事项,但它可以工作。我当然更喜欢第一个。

围绕您的新应用程序创建一个测试项目,并使用它来开发它的新功能(只需满足最低要求即可对其进行测试),更新您的存储库,最后通过 pip 更新项目中的应用程序。您的应用现在不依赖于您的项目,所以不要将您的应用绑定到它。

  1. 你把它添加到你的 INSTALLED_APPS 了吗?如果你这样做了,请检查你的 models.py 是否可以访问...尝试使用 django shell。尝试创建迁移模块,看看它是否有效,反正不会花很长时间。

  2. 最终答案:不,您的应用程序现在是一个独立的项目,您可以像处理任何其他项目一样继续在存储库上开发,然后像处理任何其他项目一样进行更新发布新版本的其他应用程序。你根本不需要(也不应该)触摸你的 virtualenv 的文件夹。

这些是在您的应用程序中更新的步骤:

  • 您发现了一个严重的错误或想到了一些不错的功能
  • 您添加了测试来覆盖它
  • 您更新了代码以增强您的应用程序
  • 您重复最后几个步骤,直到您的应用再次稳定
  • 如果你的应用程序在 Pypi 中,你发布一个新包并从那里更新它,否则你从存储库更新它。

这显然比在您的项目中开发应用程序需要更长的时间,但这样做有助于确保良好的质量,并且不会给您的项目带来问题。

此外,开发期间的一个良好工作流程是 link 将可重用应用程序放入您的 Django 项目中。要轻松实现此 pip install-e, --editable option, which in turn derives from the setuptools Development mode.

可重复使用的应用程序:

django-myApp
|--myApp
|  |--models
|     |--file1.py
|     |--file2.py
|--setup.py
|--README.rst

Django 设置:

my-django-project
|--my_django_project
|  |--settings.py
|  |--urls.py
|  |--wsgi.py
|  |--...
|--manage.py

激活 virtualenv 后,您现在可以 link 通过 运行ning 将您的可重用应用程序添加到项目中:

(myvenv) $ pip install --editable /path/to/django-myApp

现在,您在 django-myApp 中所做的每项更改都会自动反映在 my-django-project 中,而无需先 build/package 可重复使用的应用程序。

这在许多用例中变得很方便。例如。想象一下开发与 Python 2.xPython 3.x 兼容的应用程序。使用 linking,您可以将应用程序安装到两个(或更多)不同的 Django 设置和 运行 您的测试中。

我在开发这个库时 运行 遇到了类似的情况 (django-nsync)。

我 "solved" 通过创建一个 makemigrations.py 脚本来解决这个问题,该脚本设置了一个最小的 Django 设置以包含 'app' 然后调用 makemigrations 命令.

脚本如下所示:

def make_migrations():
    from django.core.management import call_command
    call_command('makemigrations', '<YOUR APP NAME>')


if __name__ == '__main__':
    import sys
    # I need to add the 'src' folder to PYTHON PATH
    sys.path.append('./src/')

    try:
        from django.conf import settings

        settings.configure(
            INSTALLED_APPS=[
                '<ANY APPS YOUR APP DEPENDS ON>',
                '<YOUR APP NAME>',
            ],
        )

        import django
        django.setup()

    except ImportError:
        import traceback
        traceback.print_exc()
        raise ImportError('To fix this error, sort out the imports')

    make_migrations()

此脚本不需要单独的项目来创建迁移。

注意: 我试图将它连接到 setup.py 中,这样每当你尝试构建(或更重要的是发布)库时,它都会检查迁移是最新的/在源代码管理中。但是,我放弃了,因为:

  1. 希望我不必为 NSync 库做太多工作。
  2. 它很快变得混乱(比如检查迁移文件夹中有多少文件,然后 运行 迁移,然后再次检查,然后删除文件?还是保留它们?我应该在发布时强制执行此操作吗?我应该像 bumpversion 一样检查 Git 吗?等等....)