大模型应用
为项目添加 devcontainer 隔离开发环境(含…
当需要给项目新增 devcontainer 支持、配置沙箱化 Claude Code 工作区或隔离开发环境时,按项目语言生成 .devcontainer 配置。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
为项目添加 devcontainer 隔特定
解决思路
- 按流程执行:用户请求 devcontainer -> 1. 项目侦察 -> 2. 检测语言 -> 3. 生成配置 -> 4. 写入 .devcontainer/ -> 完成。
- 阶段 1:推断项目名称,按顺序使用第一个匹配项:package.json 的 name 字段;pyproject.toml 的 project.name;Cargo.toml 的 package.name;go.mod 的模块路径(取 / 后的最后一段);否则使用目录名。
- 将项目名称转换为 slug:转小写,把空格/下划线替换为连字符。
- 检测语言栈:Python 检测 pyproject.toml、*.py;Node/TypeScript 检测 package.json、tsconfig.json;Rust 检测 Cargo.toml;Go 检测 go.mod、go.sum。
- 多语言项目:配置所有检测到的语言,优先级顺序为 Python(主语言,使用 Dockerfile 安装 uv + Python)、Node/TypeScript(使用 devcontainer feature)、Rust(使用 devcontainer feature)、Go(使用 devcontainer feature)。
- 多语言 postCreateCommand:串联所有 setup 命令,例如 `uv run /opt/post_install.py && uv sync && npm ci`。
- 多语言 extensions 和 settings:合并所有检测到语言的扩展与设置。
- 阶段 2:从 resources/ 目录的基础模板开始,替换 {{PROJECT_NAME}} 为人类可读名称(如 'My Project'),替换 {{PROJECT_SLUG}} 为用于卷名的 slug(如 'my-project'),然后应用语言特定修改。
- 基础模板包含:Claude Code 及 marketplace 插件(anthropics/skills、trailofbits/skills、trailofbits/skills-curated)。
- 基础模板包含:通过 bubblewrap 和 socat 实现沙箱化。
- 基础模板包含:通过 uv 安装 Python 3.13(快速二进制下载)。
- 基础模板包含:通过 fnm(Fast Node Manager)安装 Node 22。
- 基础模板包含:ast-grep 用于基于 AST 的代码搜索。
- 基础模板包含:网络隔离工具(iptables、ipset)并带 NET_ADMIN capability。
- 基础模板包含:安全挂载,将 .devcontainer/ 以只读方式挂载,防止容器逃逸。
- 基础模板包含:通过 remoteEnv 转发 CLAUDE_CODE_OAUTH_TOKEN 和 ANTHROPIC_API_KEY。
- 基础模板包含:现代 CLI 工具:ripgrep、fd、fzf、tmux、git-delta。
- Python 项目:检测 pyproject.toml、requirements.txt、setup.py 或 *.py 文件。
- Python 项目:基础 Dockerfile 已通过 uv 包含 Python 3.13;如果需要从 pyproject.toml 检测到不同版本,修改为 `RUN uv python install <version> --default`。
- Python 项目:向 customizations.vscode.extensions 添加 `ms-python.python`、`ms-python.vscode-pylance`、`charliermarsh.ruff`。
- Python 项目:向 customizations.vscode.settings 添加 `python.defaultInterpreterPath: .venv/bin/python`,`[python]`:`editor.defaultFormatter: charliermarsh.ruff`,`editor.codeActionsOnSave.source.organizeImports: explicit`。
- Python 项目:如果存在 pyproject.toml,postCreateCommand 串联命令:`rm -rf .venv && uv sync && uv run /opt/post_install.py`。
- Node/TypeScript 项目:检测 package.json 或 tsconfig.json。
- Node/TypeScript 项目:不需要 Dockerfile additions,因为基础模板已通过 fnm 包含 Node 22。
- Node/TypeScript 项目:向 customizations.vscode.extensions 添加 `dbaeumer.vscode-eslint`、`esbenp.prettier-vscode`。
- Node/TypeScript 项目:向 customizations.vscode.settings 添加 `editor.defaultFormatter: esbenp.prettier-vscode`,`editor.codeActionsOnSave.source.fixAll.eslint: explicit`。
- Node/TypeScript 项目:postCreateCommand 根据 lockfile 检测包管理器并与基础命令串联:pnpm-lock.yaml → `uv run /opt/post_install.py && pnpm install --frozen-lockfile`。
- Node/TypeScript 项目:yarn.lock → `uv run /opt/post_install.py && yarn install --frozen-lockfile`。
- Node/TypeScript 项目:package-lock.json → `uv run /opt/post_install.py && npm ci`。
- Node/TypeScript 项目:无 lockfile → `uv run /opt/post_install.py && npm install`。
- Rust 项目:检测 Cargo.toml。
- Rust 项目:添加 feature `ghcr.io/devcontainers/features/rust:1: {}`。
- Rust 项目:向 customizations.vscode.extensions 添加 `rust-lang.rust-analyzer`、`tamasfe.even-better-toml`。
- Rust 项目:向 customizations.vscode.settings 添加 `[rust]`:`editor.defaultFormatter: rust-lang.rust-analyzer`。
- Rust 项目:如果存在 Cargo.lock,postCreateCommand 使用锁定构建:`uv run /opt/post_install.py && cargo build --locked`;如果无 lockfile,使用:`uv run /opt/post_install.py && cargo build`。
- Go 项目:检测 go.mod。
- Go 项目:添加 feature `ghcr.io/devcontainers/features/go:1: {version: latest}`。
- Go 项目:向 customizations.vscode.extensions 添加 `golang.go`。
- Go 项目:向 customizations.vscode.settings 添加 `[go]`:`editor.defaultFormatter: golang.go` 和 `go.useLanguageServer: true`。
- Go 项目:postCreateCommand 使用:`uv run /opt/post_install.py && go mod download`。
- 参考材料:查看 references/dockerfile-best-practices.md(层优化、多阶段构建、架构支持)。
- 参考材料:查看 references/features-vs-dockerfile.md(何时使用 devcontainer features 与自定义 Dockerfile)。
- 添加持久卷:在 devcontainer.json 的 mounts 中新增挂载的模式为 `source={{PROJECT_SLUG}}-<purpose>-${devcontainerId},target=<container-path>,type=volume`。
- 添加持久卷:常见挂载:Rust 使用 `source={{PROJECT_SLUG}}-cargo-${devcontainerId},target=/home/vscode/.cargo,type=volume`;Go 使用 `source={{PROJECT_SLUG}}-go-${devcontainerId},target=/home/vscode/go,type=volume`。
- 输出文件:在项目的 .devcontainer/ 目录生成 1. Dockerfile(容器构建说明);2. devcontainer.json(VS Code/devcontainer 配置);3. post_install.py(创建后设置脚本);4. .zshrc(shell 配置);5. install.sh(管理 devcontainer 的 CLI 辅助脚本,devc 命令)。
- 验证清单:向用户展示文件前,确认所有 {{PROJECT_NAME}} 占位符已替换为人类可读名称。
- 验证清单:确认所有 {{PROJECT_SLUG}} 占位符已替换为 slugified 名称。
- 验证清单:确认 devcontainer.json 的 JSON 语法有效(无尾随逗号,嵌套正确)。
- 验证清单:确认为所有检测到的语言添加了语言特定扩展。
- 验证清单:确认 postCreateCommand 包含所有必需的 setup 命令(用 && 串联)。
- 生成后告知用户 1:启动方式:'Open in VS Code and select Reopen in Container'。
- 生成后告知用户 2:替代方式:`devcontainer up --workspace-folder .`。
- 生成后告知用户 3:CLI helper:运行 `.devcontainer/install.sh self-install` 将 devc 命令加入 PATH。
适用边界 · 注意事项
- 用户已有 devcontainer 配置,只需要修改。
- 用户询问一般 Docker 或容器问题。
- 用户想部署生产容器(此技能仅用于开发)。