跳到主要内容
AI教程

使用 devvm 为每个项目创建隔离的开发虚拟机

了解如何安装 devvm,创建一个自动检测工具链的隔离虚拟机,在沙箱中运行代码代理,自定义其环境,并通过使用单独的仓库克隆来保护工作树。

使用 devvm 为每个项目创建隔离的开发虚拟机

什么是 devvm?

devvm 会为每个项目文件夹创建一个隔离的虚拟机。虚拟机包含项目所需的工具链,并提供一个沙箱环境,让你或编码代理可以在其中工作,而无需直接将代理安装到主机上。

每个虚拟机都通过 Lima运行。默认情况下,devvm 只挂载选定的项目文件夹,并在虚拟机中以主机上的相同路径提供该文件夹。再次在该文件夹中运行 devvm,会重新打开同一个虚拟机。

主要功能

  • 每个项目对应一个虚拟机:每个项目文件夹都有自己的隔离环境。
  • 自动检测工具链:devvm 会检查项目文件,以确定所需的工具链。例如,包含 package.json 的项目会获得 Node.js 工具。
  • 支持编码代理:Claude Code、Codex、opencode 和 pi 可以在虚拟机中运行,并使用各自的设置、技能和 MCP 服务器。
  • 受控网络:新虚拟机默认使用允许列表网络层级,只能访问获准的主机。
  • 主机端密钥:GitHub 和 Claude Code 等凭据会保留在主机上,并跨所有网络层级使用。
  • 可复用镜像:虚拟机从基础镜像复制而来,工具链则在各虚拟机之间以只读方式共享。完成初始设置后,新虚拟机可以在几秒内启动。
  • 可选层:内置层包括 docker、nix 和 desktop。你也可以创建自己的层。
  • 克隆模式:虚拟机可以在自己的 Git 克隆中工作,而不是挂载主机工作树。

系统要求

devvm 支持 macOS 13 或更高版本,以及 arm64 或 x86_64 Linux。它要求 Lima 2.2 或更高版本,并满足相关的 Lima 要求。该项目已在 Apple 芯片 Mac 以及使用 arm64 和 x86_64 的 Linux 系统上完成测试,但尚未在 Intel Mac 上测试。

安装 devvm

使用 Homebrew 在 macOS 上安装

Homebrew 公式会安装 devvm 和 Lima:

brew trust --formula devvmhq/tap/devvm
brew install devvmhq/tap/devvm

在 Linux 上安装

运行官方安装脚本:

curl -fsSL https://github.com/devvmhq/devvm/releases/latest/download/install.sh | bash

该脚本也适用于 macOS。在安装 Lima、QEMU 或访问 /dev/kvm 之前,它会请求确认。

每个版本都使用 devvm minisign 密钥 RWSjzFsn7ETaijKJ2y7F4DtZobXmyv+LmdclJwZP/KmAkLUwOCzWF/2b 签名。如果你想在运行脚本前验证下载内容,请参阅安装脚本验证指南。

检查安装

安装后,运行诊断命令:

devvm doctor

该命令会检查 devvm 在你的计算机上所需的内容,并说明如何获取缺少的组件。如需了解所有要求和安装程序选项,请参阅完整的安装指南。

创建第一个项目虚拟机

  1. 打开项目文件夹。在终端中切换到包含项目的目录。
  2. 运行 devvm。查看建议的虚拟机配置并确认。
  3. 在虚拟机中工作。devvm 会打开一个 shell,其提示符以 (devvm) 开头。
cd ~/some-project
devvm

devvm 会检测项目文件所请求的工具链。在创建虚拟机之前,你还可以自定义其工具链、编码代理、层、网络层级和大小。

首次运行时,系统会询问几个问题,用于设置新虚拟机和基础镜像的默认值。这些选项包括默认虚拟机大小、编码代理以及可选的基础镜像附加组件。基础镜像只需构建一次,耗时几分钟;之后的项目虚拟机通常可以在几秒内启动。

重新打开同一个虚拟机

返回项目文件夹并运行相同的命令:

cd ~/some-project
devvm

由于每个项目文件夹都会保留自己的虚拟机,devvm 会重新打开现有环境,而不是创建一个无关的虚拟机。

运行编码代理

虚拟机 shell 打开后,从其中启动受支持的代理。例如,使用以下命令运行 Claude Code:

claude

这样可以让编码代理留在沙箱中,而无需将其安装到主机上。devvm 会将受支持代理的设置和登录信息存储在自己的存储中。

登录 Claude Code

首次启动 Claude Code 前,请从虚拟机中发起登录:

devvm agent login claude

登录信息会保留在你的计算机上。详情请参阅 Claude Code 登录指南。

导入现有代理配置

如果你已经在主机上使用受支持的编码代理,devvm 可以将其现有配置复制到自己的存储中:

devvm agent import

此功能用于迁移现有本地代理所使用的设置。支持的集成包括 Claude Code、Codex、opencode 和 pi。

使用克隆模式保护工作树

在默认模式下,主机编辑器和虚拟机共享挂载的项目文件。因此,在虚拟机中进行的更改会出现在同一个工作树中。

如需更强的隔离,请使用 --clone 启动 devvm。这样,虚拟机会获得自己的仓库克隆,从而阻止其中的进程接触主机工作树或其 .git 目录。

devvm --clone

在虚拟机内提交工作后,通过 devvm 远程仓库在主机上获取这些提交:

git fetch devvm

获取的分支将以 devvm/main 等名称显示。合并前请检查差异:

git log -p main..devvm/main

通过这种工作流,只有在你明确执行获取操作后,虚拟机中的工作才会进入你的仓库。完整流程请参阅使用克隆进行工作。

高级配置提示

谨慎选择工具链

自动检测可以提供一个实用的起点,但在创建虚拟机前,请检查建议的设置。如果检测到的选择不符合你的预期环境,可以在创建流程中自定义工具链。工具链文档列出了受支持的选项。

添加环境层

如果项目需要相应能力,请使用内置的 docker、nix 或 desktop 层。要开始定义自定义层,请使用:

devvm layer new

自定义镜像前,请查看环境层文档。

检查网络访问

新建虚拟机默认使用允许列表网络层级。请尽可能缩小可访问主机的范围,尤其是在运行自主编码代理时。其他网络层级请参阅网络安全指南。

了解沙箱边界

虚拟机可以降低风险,但无法消除所有安全漏洞。请了解虚拟机能够访问的内容,避免暴露不必要的资源,并在接受生成的更改前进行检查。在让虚拟机处理重要项目之前,请阅读安全使用。

查阅 CLI 参考

如需了解本教程之外的命令、标志和参数,请使用官方CLI 参考。更全面的使用文档还介绍了端口、虚拟机规格、虚拟机之间的链接、SSH、编辑器、镜像和故障排除。

结语

devvm 为每个项目提供独立的开发环境,是一种实用的隔离方式。安装它,使用 devvm doctor 验证主机,在项目目录中运行 devvm,然后在生成的 shell 中启动编码代理。对于敏感工作,请结合受限网络和 devvm --clone,并在合并之前检查获取的更改。