使用 VS Code Remote Container 搭建 Mesop 内部开发环境
【免费下载链接】mesopRapidly build AI apps in Python项目地址: https://gitcode.com/GitHub_Trending/me/mesop
VS Code Remote Container(远程容器)是 Mesop 仓库推荐的内部开发(contributor 级开发)快速上手方式:只要本机安装了 VS Code 与 Docker Desktop,即可一键拉起一个完全配置好的开发工作区,免去手工排查依赖安装问题的烦恼,直接开始开发与调试 Mesop 本身。读完本文,你将掌握从 Fork 克隆仓库、共享 Git 凭据、在容器内打开项目、等待初始化脚本完成,到启动./scripts/cli.sh开发服务器并在http://localhost:32123预览全部 demo 的完整流程,同时理解背后.devcontainer/devcontainer.json、docker-compose.yml、Dockerfile与scripts/devcontainer_setup.sh的配置原理。
前置条件:安装 VS Code 与 Docker
Remote Container 方案的本质是:容器负责运行代码,VS Code 负责编辑与调试。因此需要先在本机安装两样东西:
- VS Code:作为开发界面,通过 Dev Containers 扩展与容器通信;
- Docker Desktop:安装后自带 Docker Engine 与 Docker Compose,用于构建并运行容器(Linux 用户也可使用其他 Docker 引擎)。
注意:Remote Containers 会构建一个完整的 Mesop 开发环境,因而对 Docker 与 VS Code 的版本有一定要求;Docker Desktop 需处于运行状态,且需允许其分配足够的内存/磁盘给容器。
Fork 并克隆 Mesop 仓库
在使用远程容器前,首先要把 Mesop 仓库复制到自己的账号下并克隆到本地:
- 在 Mesop 仓库页面点击Fork创建自己的副本;
- 将 Fork 后的仓库
git clone到本地目录; - 遵循标准的 GitHub Fork 协作流程(添加 upstream、创建功能分支、提交 Pull Request 等)。
重要建议:不要在本地开发目录与远程容器中复用同一个文件夹。远程容器使用 bind mount 将宿主目录挂载进容器(见 docker-compose.yml 中的- .:/workspaces/mesop),如果本地同时用另一套工具链开发同一份代码,容易产生文件冲突或状态错乱。正确做法是为 Remote Container 单独克隆一份仓库副本,例如mesop-dev这样的独立目录。
将 Git 凭据共享给容器
容器内默认以普通用户mesop-dev运行(见 Dockerfile 中的USER mesop-dev),它需要读写 GitHub 凭据才能执行git pull、git push。Dev Containers 扩展提供了几种凭据共享方式:
- HTTPS 克隆:使用 GitHub CLI 或 Git Credential Manager 在宿主机缓存凭据,Dev Containers 会自动将其转发进容器;
- SSH 克隆:宿主机上的
ssh-agent会被自动转发到远程容器,你只需在宿主机执行ssh-add添加为 GitHub 配置的 SSH 私钥即可。
容器内以mesop-dev用户运行,且该用户被授予免密sudo(见 Dockerfile 中的echo mesop-dev ALL=(root) NOPASSWD:ALL),因此即便在初始化脚本里需要 root 权限操作(如sudo chown),也不会中断流程。
在容器中打开文件夹
启动流程非常简单:
- 打开 VS Code;
- 按
Cmd/Ctrl + Shift + P打开命令面板; - 选择Dev Containers: Open Folder in Container...(如果命令不可见,请先安装 "Dev Containers" 扩展);
- 选中刚才克隆的 Mesop 仓库目录。
VS Code 会读取仓库根目录的 .devcontainer/devcontainer.json,自动完成:构建镜像 → 启动容器 → 将仓库挂载到/workspaces/mesop→ 安装扩展 → 执行初始化脚本。整个过程会新建一个"远程容器"工作区。
devcontainer.json 做了什么
从 .devcontainer/devcontainer.json 可以看到这套环境的完整定义:
dockerComposeFile+service:复用仓库根目录的 docker-compose.yml,以mesop服务作为开发容器;workspaceFolder:工作区固定为/workspaces/mesop;postCreateCommand:容器创建后执行bash scripts/devcontainer_setup.sh,这是环境初始化的核心(下文详解);customizations.vscode:自动安装 4 个扩展 ——esbenp.prettier-vscode(TypeScript 格式化)、ms-python.python+ms-python.vscode-pylance(Python 语言服务)、charliermarsh.ruff(Python lint/format),并预设编辑器设置:files.autoSave: "onFocusChange"、editor.formatOnSave: true,同时把bazel-bin等构建产物目录加入search.exclude避免搜索结果污染,并为python.analysis.extraPaths添加./bazel-bin以便 Pylance 识别由 Bazel 生成的 Python 模块。
docker-compose.yml 的关键设计
docker-compose.yml 中除挂载工作目录外,有两个值得注意的点:
node_modules存放在命名卷(named volume)中,而不是 bind mount,既提升 I/O 性能,又避免覆盖宿主机器上安装的 node_modules;- 端口映射
'32123:32123',把容器内 Mesop 开发服务器端口暴露到宿主机,这正是后文http://localhost:32123可访问的原因; vscode_extensions卷单独存放.vscode-server/extensions,保证容器重建后扩展缓存不丢失。
而 Dockerfile 则基于python:3.10.15-bullseye,预装了curl、tmux、vim、sudo等通用工具,以及 Playwright 运行所需的libnss3等系统库(用于 E2E 测试),并通过 nvm 安装 Node.js 18.19.1、全局安装yarn、@bazel/bazelisk与@bazel/ibazel(后者是 Mesop 热重载开发服务器所用工具)。
等待 postCreateCommand 完成
容器创建后,VS Code 会执行 .devcontainer/devcontainer.json 中配置的postCreateCommand,即 scripts/devcontainer_setup.sh。在它跑完之前,工作区不可用,需要耐心等待。
初始化脚本到底做了什么
scripts/devcontainer_setup.sh 是一个多步骤引导脚本,逐一完成:
- 修正 node_modules 权限:由于 Docker 卷初始属主是 root,先执行
sudo chown mesop-dev:mesop-dev node_modules,让开发用户可写; - 更新第三方 Python 依赖:
bazel run //build_defs:pip_requirements.update,同步build_defs/requirements.txt对应的锁定版本; - 构建 CLI 虚拟环境:
bazel run //mesop/cli:cli.venv生成.cli.venv并激活,这是运行 Mesop CLI 所用的 Python 环境; - 安装锁定依赖:
pip install -r build_defs/requirements_lock.txt,让 VS Code 的 Python 解释器能识别全部第三方依赖; - 生成 proto 模块:执行
./scripts/setup_proto_py_modules.sh,为mesop/components/*.proto生成可导入的 Python 模块,保证 IDE 与运行时都能解析ui.proto等协议文件; - 安装并启用 pre-commit:
pip install pre-commit==3.7.1后执行pre-commit install,把仓库的 Git 钩子接入提交流程; - 安装 Playwright 浏览器:
yarn playwright install,为 E2E 测试下载对应浏览器二进制。
由于其中包含
bazel run构建步骤,首次执行耗时较长属正常现象;初始化完成后,状态栏会提示容器就绪。
启动 Mesop 开发服务器
初始化完成后,在 VS Code 内置终端中运行:
./scripts/cli.shscripts/cli.sh 内部做了两件事:先通过lsof -t -i:32123 | xargs kill清理占用 32123 端口的旧进程(保证热重载重启干净),再执行ibazel run //mesop/cli:editor_cli -- --path="mesop/mesop/example_index.py" --reload_demo_modules。这里的关键点:
ibazel(Bazel 的 watch 模式)会监听源码变化并自动重新构建、重启服务,实现热重载开发循环;--path=mesop/mesop/example_index.py指向 mesop/example_index.py,该文件集中导入全部 demo 与组件 e2e 页面,是热重载可用的"最低公共祖先"模块;--reload_demo_modules开启 demo 模块的热重载。
启动过程中会出现一些警告信息(例如 Bazel 首次构建的输出、端口占用提示等),忽略它们即可。当终端出现服务器就绪提示时,说明 Mesop 服务已成功监听。
补充:若需要以生产模式运行(无热重载),仓库还提供了 scripts/cli_prod.sh,其差异在于使用
bazel run //mesop/cli -- --path=mesop/mesop/example_index.py --prod。日常迭代开发请使用./scripts/cli.sh。
查看 Mesop demo
./scripts/cli.sh启动成功后,在宿主机浏览器打开:
http://localhost:32123即可访问 Mesop 的全部示例 demo(按钮、图表、聊天、日期选择、表格等一应俱全),并验证热重载效果:修改任意 demo 源码,页面会自动刷新。至此,一套完整的 Mesop 内部开发环境搭建完成,你可以在此基础上阅读源码、编写新组件或提交 PR。
常见问题与排查思路
- 端口无法访问:确认
docker-compose.yml中32123:32123映射存在,且./scripts/cli.sh输出的就绪信息已出现; - 容器内 git 操作失败:按上文重新配置 HTTPS 凭据缓存或 SSH agent 转发;
- Pylance 报模块找不到:确认 scripts/devcontainer_setup.sh 已完整执行,
bazel-bin已生成且被加入python.analysis.extraPaths; - node_modules 权限错误:重新执行
sudo chown mesop-dev:mesop-dev node_modules后重跑初始化脚本; - 首次构建过慢:属 Bazel 冷启动正常现象,后续增量构建会明显加快。
参考文件
- 本文核心流程来自 docs/internal/vs-code-remote-container.md
- 容器配置:.devcontainer/devcontainer.json、docker-compose.yml、Dockerfile
- 初始化脚本:scripts/devcontainer_setup.sh
- 启动脚本:scripts/cli.sh、scripts/cli_prod.sh
- Demo 入口:mesop/example_index.py
【免费下载链接】mesopRapidly build AI apps in Python项目地址: https://gitcode.com/GitHub_Trending/me/mesop
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考