# 实时开发

通过微信云托管 VSCode 插件,可以实现实时开发,即代码变动时,不需要重新构建和启动容器,即可查看变动后的效果。

# 使用教程

Step 1:安装插件

点击 安装链接 或者通过 VSCode 搜索 “Weixin Cloudbase”,安装微信云托管 VSCode 插件。

Step 2:检查容器

打开项目,检查微信云托管容器是否存在。

Step 3:选择 Live Coding

右键点击需要调试的容器,选择 Live Coding,将自动生成 Dockerfile.development 和 docker-compose.yml 2 个文件并启动容器。

Step 4:访问服务

启动容器后,将提示访问地址,点击即可访问服务。

Step 5:停止服务

开发任务结束后,可右键点击运行中的容器,选择 Stop,即可停止服务。

通过实时开发能力,代码改动不再需要重新构建镜像和启动容器,一键保存即可查看改动后的效果,高效又便捷。

# 开发模式的 Dockerfile

实时开发使用项目目录下的 Dockerfile.development 作为开发期间的容器的 Dockerfile

大多数情况下,插件将根据项目的 Dockerfile 自动生成本文件,不需要手动编写。

开发模式的 Dockerfile 与正式模式的 Dockerfile 的区别在于:

  • 单阶段构建
  • 将编译命令转换为启动命令,如 Spring Boot 模板的 mvn package 会转换为 spring-boot:run
  • 拉取实时开发的工具套件,安装到 /usr/bin
  • 通过实时开发工具套件启动用户程序,在代码发生更改时,自动重启进程。

参考示例如下:

FROM ccr.ccs.tencentyun.com/weixincloud/wxcloud-livecoding-toolkit:latest AS toolkit # 拉取实时开发套件(nodemon)
FROM node:12-slim # 运行时容器
COPY --from=toolkit nodemon /usr/bin/nodemon # 复制套件到容器
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . ./

CMD [ "nodemon", "-x", "node index.js", "-w", "/usr/src/app", "-e", "java, js, mjs, json, ts, cs, py, go" ] # 使用 nodemon 启动应用

# 开发模式的 docker-compose.yml

实时开发将使用项目目录下的 docker-compose.yml 将当前目录映射到容器中。

大多数情况下,插件将根据项目的 Dockerfile 自动生成本文件,不需要手动编写。

可以参考如下的 docker-compose.yml 结构,按需修改:

version: '3'
services:
  app:
    build: 
      context: . # 构建上下文
      dockerfile: Dockerfile.development
    volumes:
      - .:/app # 需要映射的目录(即代码目录)
      - /app/node_modules # 映射 node_modules 目录,如果有构建产物与代码目录同级,需要单独映射避免无法运行
    ports:
      - 27081:80 # 监听端口,主机端口:容器端口
    container_name: wxcloud_wxcloudrun-express # 容器名称
    labels: # 容器标签,一般不需改动
      - wxPort=27082
      - hostPort=27081
      - wxcloud=wxcloudrun-express
      - role=container
    environment:
      # 使用本地调试 MySQL 时,需要填入如下环境变量,并启动 MySQL 代理服务
      - MYSQL_USERNAME=
      - MYSQL_PASSWORD=
      - MYSQL_ADDRESS=
networks:
  default:
    external:
      name: wxcb0 # 容器网络打通,一般不需改动

# 注意事项与 FAQ

# 兼容性

实时开发目前兼容如下的模板:

  • NodeJS 官方模板(Express,Koa)
  • Java 官方模板(Spring Boot)
  • PHP 官方模板(ThinkPHP,Laravel)
  • Python 官方模板(Django,Flask)
  • .NET 官方模板(ASP.NET Core)

部分语言框架的依赖不支持动态加载形式,会报如下类似的错误,遇到这种情况属于依赖自身问题,请先用其他的开发模式。

Dynamic loading not supported

# 容器配置文件

首次使用实时开发时,会自动识别项目内是否已存在 Dockerfile.developmentdocker-compose.yml 文件,如果存在,则不会生成新的文件。如需重新生成,可以删除这两个配置文件后重新启动实时开发。

实时开发也支持 VPC 网络打通和微信开发者工具本地调试,使用方式与普通启动一致。

# Windows 下实时开发不生效的问题

受限于 Docker 在 Windows 下的文件系统实现,非 Edge 版本的 Docker Desktop 无法接收文件修改事件。可以启用 --legacy-watch 参数让实时开发套件使用传统的文件监控机制,但会占用更多的 CPU 资源。

# Dockerfile.development
CMD [ "nodemon", "--legacy-watch", ...] # 增加 --legacy-watch 参数