选择开始方式
一个 Archyl 项目保存着您软件的 C4 模型:系统、容器、组件和代码,以及它们之间的关系。填充它的方式有四种。这些方式可以组合使用,选择其中任何一种都不会把您绑定住。
| 方式 | 最适合 | 您需要 | 第一个模型 |
|---|---|---|---|
| 在应用中绘制 | 您正在探索,或系统尚未构建 | 浏览器 | 上下文图只需几分钟 |
| 用 AI 发现 | 代码已存在,您想快速得到初稿 | 已连接的仓库,且套餐包含 AI 发现 | 几分钟,然后评审 |
| 以代码编写 | 您希望在拉取请求中评审模型并随代码进行版本管理,或者不想把代码发送给 AI | archyl CLI 和文本编辑器 |
取决于编写文件所需的时间 |
| 导入 | 您已在使用 Structurizr、LikeC4、IcePanel 或 Backstage 建模 | 从该工具导出的文件 | 不到一分钟 |
无论选择哪种方式,后续步骤都一样:连接您的编程代理,并让模型与代码保持同步。
在应用中绘制
从仪表板创建项目,然后在画布上添加系统、容器和关系。快速入门指南会一步步带您完成。
对于尚不存在的系统,或要在写代码之前勾勒上下文,绘制是合适的起点。您之后可以切换到代码:archyl dsl pull 会把您绘制的内容写入 archyl.yaml。
用 AI 发现
AI 发现会读取已连接的仓库,并提出系统、容器、组件、关系和技术。在您批准之前,任何内容都不会进入模型。
在应用中: 在 项目设置 › Git 集成 中连接仓库(参见 Git 集成),启动一次发现,然后评审它找到的内容。
在终端中,在仓库根目录下:
archyl login
archyl init --new
init --new 会创建项目,根据 git remote 连接仓库,在您查看时运行发现,打开评审,绘制结果,并提议连接您的编程代理。常用参数:--name、--team、--branch、用于自托管 remote 的 --provider(github_enterprise、gitlab_private、gitea),以及接受全部默认值的 --yes。参见 CLI 指南。
发现能处理 monorepo:它识别 apps/、packages/、services/ 和 libs/,并把每个服务映射为一个容器。
以代码编写
在仓库根目录的 archyl.yaml 中描述架构并推送。文件格式见架构即代码。
archyl login
archyl init --new --no-discover # create the project and link this repository, no AI
$EDITOR archyl.yaml # describe the architecture
archyl dsl diff # what a push would create or change
archyl dsl push # import it
archyl diagram # look at the result
一个最小的文件:
version: "1.0"
systems:
- name: Shop
containers:
- name: Storefront
type: web_app
technologies: [React]
- name: Orders API
type: api
technologies: [Go]
- name: Orders DB
type: database
technologies: [PostgreSQL]
- name: Stripe
external: true
relationships:
- from: Storefront
to: Orders API
label: Places orders
type: calls
- from: Orders API
to: Orders DB
type: reads_from
- from: Orders API
to: Stripe
label: Charges cards
type: calls
元素按名称匹配。推送会创建新内容、更新变更的内容,并且从不删除:仅存在于 Archyl 中的元素会保留,archyl dsl diff 将其列为 "only in Archyl"。
您的编程代理可以写出第一版:运行 archyl setup,然后让它按照 schema 在 archyl.yaml 中描述该仓库。评审这个文件仍然是您的事。
要让文件和模型保持同步,请提交 archyl.yaml,然后用 GitHub Action 从 CI 推送,或使用 项目设置 › 架构即代码 中的 立即同步。两者不一致时,archyl dsl diff --exit-code 会让 CI 作业失败。
从其他工具导入
在项目列表中点击 导入项目 并选择格式:Archyl YAML、Structurizr DSL、LikeC4、IcePanel JSON 或 Backstage JSON。拆分为多个 !include 文件的 Structurizr 工作区可以打包成 zip 上传。详情以及各格式在何处保存项目名称,见导入项目。
Monorepo 演练
下面是在 monorepo 上不使用 AI 发现、从头到尾走一遍代码方式:
shop/
├── apps/
│ ├── storefront/
│ └── admin/
├── services/
│ ├── orders/
│ └── payments/
└── packages/
└── ui/
1. 创建项目并关联仓库。 在 monorepo 的根目录下:
archyl init --new --no-discover --name "Shop" --team platform
这会写入 .archyl.json,把仓库关联到项目。请提交它:它不包含任何密钥。
2. 建模一个系统,每个可部署单元一个容器。 应用和服务成为容器。像 packages/ui 这样的共享包通常不单独作为容器:可以把它描述为使用它的容器的组件,或者省略。
3. 用文件夹名称为每个容器命名。 这样 archyl brief、where、check、impact 和 Guard 钩子才能判断变更的文件属于哪个元素:当路径中的某个文件夹与元素同名时,该文件就属于这个元素。比较时忽略大小写、空格和标点,以及 API、Service 或 Worker 这样的结尾词,因此 Orders Service 匹配 services/orders/…,Payments API 匹配 services/payments/…。
4. 选择单个文件或多个文件。 根目录下的单个 archyl.yaml 最简单。对于大型 monorepo,可以让每个服务在代码旁有自己的文件,并从根目录 include,这样每个团队只编辑自己的部分:
# archyl.yaml
version: "1.0"
include:
- apps/storefront/archyl.yaml
- services/orders/archyl.yaml
- services/payments/archyl.yaml
systems:
- name: Shop
description: The online shop
- name: Stripe
external: true
# services/payments/archyl.yaml
containers:
- name: Payments API
parent_system: Shop
type: api
technologies: [Go]
relationships:
- from: Payments API
to: Stripe
label: Charges cards
type: calls
include 路径相对于声明它的文件,关系可以指向任意文件中的元素。规则见 Include。
5. 推送并检查。
archyl dsl diff
archyl dsl push
archyl where services/payments/internal/charge.go # should name Payments API
archyl diagram "Payments API" # the container and its neighbours
如果 where 报告某个文件未匹配,请用文件夹名称重命名容器,然后再次推送。
6. 保持更新。 提交 archyl.yaml 和被 include 的文件。在发生变更时从 CI 推送,或使用 立即同步,它也会从仓库获取被 include 的文件。
然后投入使用
模型建立之后:
- 连接您的编程代理: 使用
archyl setup(Claude Code、Cursor、VS Code、Codex)或从仪表板连接。之后它们在修改代码之前会调用plan、brief和 harness。 - 对照模型检查变更: 在 CI 中使用
archyl check和archyl review。参见 CLI 指南。 - 帮助新成员和代理上手: 使用
archyl tour,它会引导走一遍最先要了解的部分,并列出要读的文件。archyl tour --markdown > ONBOARDING.md可将其写成文档。 - 探索模型: 使用
archyl map、archyl diagram <element>或应用中的画布。
组合使用
- 先发现,再以代码管理: 运行一次发现并批准,然后运行
archyl dsl pull,此后提交archyl.yaml。 - 先以代码编写,再发现: 发现只提出模型中尚没有的内容,因此可以补全您写好的容器下的组件。像其他发现一样评审它。
- 在应用中绘制并从代码推送: 两者编辑的是同一个模型。推送会更新文件所描述的内容,其余部分保持不动。