开发环境搭建这件事,几乎每个工程师都经历过反复折腾:装依赖、配路径、调版本,换台机器又从头来一遍。Canonical 刚推出的 Workshop 想把这个问题压缩到一条命令里——基于 Snap 打包,用 YAML 描述环境,跑完就能写代码,配置文件还能随身带走。
Workshop 做了什么
Workshop 的核心思路很简单:把开发环境当成一个可复现的制品来管理。
传统做法里,开发环境散落在各处——本机的 .bashrc、Dockerfile、散装的 apt 包、手动编译的第三方库。换一台机器,你得重新拼装这些碎片。Workshop 把这些碎片收拢到一个 Snap 包里,再用一份 YAML 文件声明你需要什么。执行一条命令,Snap 拉包、YAML 配环境、该装的该配的一气呵成。
关键特性:
- 单命令启动:
workshop start(或类似命令)即可进入一个完整环境,不需要手动安装依赖链。 - YAML 可移植:生成的配置文件可以直接拷到另一台机器,跑同一条命令,环境一模一样。
- 与部署管道对齐:开发环境和 CI/CD 用的同一份描述,减少了"本地能跑、CI 挂掉"的经典问题。
实际跑起来:命令与配置
下面用一个 Python Web 项目做演示,展示从零到可运行环境的完整流程。
安装 Workshop
Workshop 本身通过 Snap 发行,安装一步到位:
# 安装 Workshop(需要 Snap 支持,Ubuntu 原生可用)
sudo snap install workshop
如果你用的是非 Ubuntu 发行版,先确认 Snap 已安装:
sudo apt install snapd(Debian/Ubuntu)或参考 snapcraft.io 的安装指引。
初始化一个开发环境
在一个新项目目录里执行初始化:
# 创建项目目录并进入
mkdir my-flask-app && cd my-flask-app
# Workshop 初始化,生成环境描述文件
workshop init
init 会在当前目录生成一份 workshop.yaml,这是整个环境的蓝图。你可以直接编辑它来声明依赖和工具链。
编写 workshop.yaml
以下是一份适配 Python Flask 项目的 YAML 示例,你可以按自己项目修改:
# workshop.yaml - 开发环境描述文件
name: my-flask-app
base: core22 # 基于 Ubuntu 22.04 Snap 基座
environment:
python: "3.11"
packages:
- flask
- flask-cors
- gunicorn
- pytest
system-packages:
- libpq-dev # PostgreSQL 客户端头文件,psycopg2 编译需要
env-vars:
FLASK_APP: "app.py"
FLASK_ENV: "development"
DATABASE_URL: "postgresql://localhost/devdb"
services:
postgres:
snap: postgresql14
ports: ["5432:5432"]
tools:
- git
- curl
- jq
字段说明:
| 字段 | 作用 |
|---|---|
base |
Snap 基座版本,决定底层系统库 |
environment.python |
指定 Python 版本,Workshop 会拉对应 Snap |
packages |
pip 安装的 Python 包列表 |
system-packages |
apt 层级的系统库(在 Snap 容器内安装) |
services |
需要随环境启动的服务(如数据库) |
tools |
常用开发工具 |
一条命令启动
# 读取 workshop.yaml,拉取 Snap、安装依赖、启动服务
workshop start
执行后你会看到进度输出:拉 Snap 基座 → 安装 Python → pip install → 启动 PostgreSQL → 设置环境变量。完成后直接进入开发 shell:
# 验证环境是否就绪
python -c "import flask; print(flask.__version__)"
# 输出类似: 3.0.0
# 数据库是否在跑
pg_isready -h localhost -p 5432
# 输出: accepting connections
把环境搬到另一台机器
只需要拷贝两个东西:workshop.yaml 和项目源码:
# 在新机器上(同样需要 snap install workshop)
git clone <your-repo> && cd my-flask-app
workshop start
# 环境与原机器完全一致
CI 管道里也一样——把 workshop.yaml 放进仓库,CI runner 上装好 Snap 和 Workshop,流水线就能复现开发环境:
# GitHub Actions 示例片段
jobs:
test:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- run: sudo snap install workshop
- run: workshop start
- run: pytest
需要注意的边界
Workshop 不是万能方案,几个现实问题要提前想清楚:
Snap 的限制。Snap 包运行在受限沙箱里,某些需要深度系统访问的工具(如需要 /usr/lib 下特定共享库的编译器插件)可能遇到权限或路径问题。如果你的项目依赖这类工具,先在 Workshop 里测试一遍再全面切换。
网络与存储性能。Snap 的首次拉取和安装需要网络,国内环境下 Snap Store 的访问速度可能不稳定,可以考虑配置 Snap Store 镜像或代理。
团队适配成本。YAML 描述文件需要团队成员共同维护。如果有人习惯直接在本机装包而不改 workshop.yaml,环境一致性就会慢慢崩掉。建议把 workshop.yaml 的变更纳入 PR 流程,和代码一起审。
与 Docker 的取舍。Workshop 更轻量——不需要守护进程、不需要构建镜像层,适合"快速进 shell 写代码"的场景。但如果你需要更细粒度的文件系统隔离或多容器编排,Docker Compose 仍然更成熟。两者不是互斥的:Workshop 管开发环境,Docker 管服务编排,可以混用。
上手检查清单
决定试用 Workshop 前,跑一遍这个清单:
- ✅ 团队主要开发机是否为 Ubuntu 或已安装 Snap?——非 Snap 环境需要额外适配。
- ✅ 项目依赖是否能在 Snap 沙箱内正常运行?——先
workshop start手动验证。 - ✅ 是否有 CI 管道需要环境对齐?——如果有,Workshop 的 YAML 复用是最大卖点。
- ✅
workshop.yaml是否纳入了版本控制?——这是环境一致性的根基。 - ✅ 是否有需要深度系统访问的工具链?——如果有,评估 Snap 限制的影响。
Workshop 解决的是一个真实痛点:开发环境从"手工拼装"变成"声明式拉起"。它不替代 Docker 或 Nix,但在 Snap 生态里提供了一个足够轻的入口。如果你已经在 Ubuntu 上开发,花十分钟装上试一轮,感受一下"一条命令进环境"的效率差异,再决定是否在团队里铺开。