原生工作区(推荐)
为每个子目录创建单独的蓝图。每个工作区都有各自的 initialize、maintenance 和 Knowledge 部分,工作目录也会自动设置为对应的子目录。
Subshells
在单个蓝图中使用
(cd dir && command) 在子目录内运行命令。对于只包含少量软件包的小型 monorepo,这种方式更简单。原生工作区
推荐用于大多数 monorepo。 原生工作区会为每个子目录分别提供独立的蓝图,并隔离各自的设置、Knowledge 和工作目录。随着软件包数量增加,相比 subshell,这种方式更清晰,也更易于维护。
cd 或 subshell。
根蓝图
创建工作区
- 前往 Settings > Environment > Blueprints
- 点击相应的代码仓库
- 点击 Add workspace
- 输入子目录路径 (例如
packages/frontend) - 为该工作区编写蓝图
示例
- 根目录
- packages/frontend
- packages/backend
knowledge 条目都限定在对应的子目录内。当 Devin 在 packages/frontend 中工作时,它看到的是前端的 lint/test/dev 命令,而不是后端的命令。
何时使用原生工作区
- 子目录使用不同的语言或软件包管理器
- 每个软件包都需要各自的知识条目 (lint、测试、构建命令)
- 你希望采用隔离的配置——某个工作区的蓝图出问题时,不会阻塞其他工作区
- 软件包数量不断增加,单个蓝图变得难以管理
subshell
(cd ... && ...) 会创建一个 subshell。subshell 退出后,工作目录会重置为仓库根目录,以便执行下一步。
为什么 subshell 很重要
- 正确(使用 subshell)
- 错误(未使用 subshell)
packages/ 子目录。何时使用 subshells
- monorepo 中只有少量软件包,且设置较为简单
- 所有软件包都使用相同的语言和包管理器
- 你不需要为每个软件包单独创建 知识条目
适用于 monorepo 的 知识条目
示例
Turborepo / Nx 工作区
多个 JDK 版本
最佳实践
复杂 monorepo 优先使用原生工作区
复杂 monorepo 优先使用原生工作区
当每个子目录都有自己的语言、软件包管理器或构建流程时,原生工作区可以让每个蓝图保持聚焦和独立。subshells 仅适用于只有少量软件包的简单场景。
目录切换始终使用 subshells
目录切换始终使用 subshells
使用 subshell 方法时,请将
cd 命令放在括号中:(cd dir && command)。这样可防止某一步的目录切换影响后续步骤。将共享工具放在组织级蓝图中
将共享工具放在组织级蓝图中
跨多个代码仓库使用的语言运行时和软件包管理器应放在组织级蓝图中。这样可以避免重复,并让代码仓库蓝图专注于项目特定的设置。
按依赖关系排列 maintenance 步骤
按依赖关系排列 maintenance 步骤
如果软件包 A 依赖先构建软件包 B,请在
maintenance 中先列出 B 的构建步骤,再列出 A 的安装步骤。蓝图步骤会按列出顺序依次运行。添加结构知识条目
添加结构知识条目
创建一个名为
structure 的知识条目,将目录映射到其对应的语言和工具,这有助于 Devin 理解代码库结构。请注明每个子目录使用的软件包管理器,以及任何跨软件包依赖。为每个软件包分别使用知识条目
为每个软件包分别使用知识条目
不要只创建一个很大的知识条目,而应为每个软件包分别创建独立条目 (例如
frontend、backend、ml-pipeline) 。使用原生工作区时,每个工作区都会内置自己的知识部分。让 maintenance 保持增量更新
让 maintenance 保持增量更新
使用
pnpm install (而不是 pnpm install --force) 以及 uv sync (而不是 rm -rf .venv && uv sync) 。在定期重建期间,增量命令执行得更快。
