每课本地开发环境说明

前言

  • 概括的来讲,在进行本地开发时应该尽量使用 Docker 以保证操作系统等环境因素不会造成与线上环境表现的不一致。

  • 不要使用 Flask 自带的 HTTP Server,因为它的表现和线上环境非常不一样(比如它会完全忽略@uwsgidecorators.postfork 装饰器,导致各种线程、log handler 等无法初始化)。如果觉得每次使用 Docker 打包镜像太耗时,可以在本机运行 uwsgi(uwsgi --ini deploy/uwsgi-local.ini)。反例:已发现 everyclass-auth 在 Mac 上通过 uwsgi 运行会出现线程有关的问题,只能在 Docker 容器中运行。

本地开发环境的搭建

以下以 everyclass-server 为例,讲述本地开发环境的搭建。在开始前,请确保安装了 Docker Desktop。

  • 首先我们需要新建一个本地使用的配置文件来覆盖默认的配置文件。在[包名]/config文件夹中新建 development.py。如对于 everyclass-server,应该在everyclass/server/config中新建development.py,内容格式如下:
    from everyclass.server.config.default import Config
    
    
    class DevelopmentConfig(Config):
        DEBUG = False
        SECRET_KEY = 'development key'
        [其他配置项]
    
    对于布尔类型、字符串类型的配置项,DevelopmentConfig 会完全覆盖 Config (默认配置文件)中的内容;对于字典类型的配置项,DevelopmentConfig 只会增量覆盖 Config 中的 key。关于配置文件覆盖的方式,具体可以参考 config/__init__.py
    另外需要注意的是,因为之后服务在容器中运行,如果需要连接本地的数据库等服务,host 应该设置为能在容器内连接到宿主机的值(在 Windows 和 Mac 中为host.docker.internal,要求 Docker 版本大于18.03)。
    MONGODB = {
        'host': 'host.docker.internal',
        'port': 27017
    }
    
  • 在启动某个服务前,请先确保它的上游服务已经启动。如对于everyclass-server,你可能需要确保 everyclass-api-server 和 everyclass-auth 已经在本地启动(如果有的话,当然也可以使用其他主机上运行的服务),并且在development.py中指定:
    API_SERVER_BASE_URL = 'http://host.docker.internal:5002'
    AUTH_BASE_URL = 'http://host.docker.internal:5003'
  • 然后我们生成本地使用的 Docker 镜像文件。在项目文件夹中运行:sh deploy/local-build.sh
  • 最后启动运行。在项目文件夹中运行:sh deploy/local-run.sh