|
| 1 | +--- |
| 2 | +title: 多源文档 |
| 3 | +subtitle: 让多个团队从各自的仓库发布到同一个文档站点。 |
| 4 | +description: 了解如何设置多源文档,让独立团队使用 Fern 在共享域名下发布,并保持品牌一致。 |
| 5 | +sidebar-title: 多源文档 |
| 6 | +--- |
| 7 | + |
| 8 | +<Markdown src="/snippets/enterprise-plan.mdx" /> |
| 9 | + |
| 10 | +多源文档将单个文档站点发布到一个自定义域名,并拆分为多个子路径。每个子路径来自各自的仓库,因此团队可以独立发布更新,同时由共享的[全局主题](/learn/docs/customization/global-themes)保持站点品牌一致。 |
| 11 | + |
| 12 | +## 工作原理 |
| 13 | + |
| 14 | +每个仓库在其 `docs.yml` 中声明共享域名下的唯一基础路径。从该仓库运行 `fern generate --docs` 仅更新它对应的子路径——其他子路径保持不变。 |
| 15 | + |
| 16 | +要使其正常工作,需要三处配置: |
| 17 | + |
| 18 | +1. 在每个仓库 `docs.yml` 的实例上设置 **`multi-source: true`**,并使 `url` 和 `custom-domain` 以同一基础路径结尾。 |
| 19 | +2. **[全局主题](/learn/docs/customization/global-themes)** 存放在专用的控制仓库中,并按名称从每个源仓库的 `docs.yml` 中引用。 |
| 20 | +3. [Fern Dashboard](https://dashboard.buildwithfern.com) 中的**多仓库设置**控制该域名的默认路径以及搜索 / Ask AI 范围。 |
| 21 | + |
| 22 | +例如,NVIDIA 的文档拆分到多个独立仓库中,每个仓库都发布到 `docs.nvidia.com` 上各自的子路径: |
| 23 | + |
| 24 | +- [docs.nvidia.com/nvcf](https://docs.nvidia.com/nvcf) |
| 25 | +- [docs.nvidia.com/brev](https://docs.nvidia.com/brev) |
| 26 | +- [docs.nvidia.com/aiperf](https://docs.nvidia.com/aiperf) |
| 27 | +- [docs.nvidia.com/nemo/curator](https://docs.nvidia.com/nemo/curator) |
| 28 | + |
| 29 | +每个子路径独立发布,但终端用户看到的是一个统一的站点。 |
| 30 | + |
| 31 | +<Tip> |
| 32 | + 根域名 `docs.nvidia.com` 本身是 Fern 配置之外的独立站点——多源仅覆盖子路径。Fern 发布的着陆页是可选的([示例](#example-a-live-multi-source-site)),任意数量的子路径组合都可以,包括只有两个。 |
| 33 | +</Tip> |
| 34 | + |
| 35 | +## 设置多源文档 |
| 36 | + |
| 37 | +<Steps> |
| 38 | + |
| 39 | +<Step title="为全局主题创建一个控制仓库"> |
| 40 | + |
| 41 | +控制仓库是一个专门的 Fern 项目,用于存放您的全局主题——共享的 logo、颜色、字体、布局以及每个源仓库都会继承的站点级设置。在它的 `docs.yml` 中定义这些设置,然后导出并上传主题: |
| 42 | + |
| 43 | +```bash |
| 44 | +fern docs theme export |
| 45 | +fern docs theme upload --name my-org-theme |
| 46 | +``` |
| 47 | + |
| 48 | +完整的设置指南以及主题控制的字段列表,请参阅[全局主题](/learn/docs/customization/global-themes)。 |
| 49 | + |
| 50 | +</Step> |
| 51 | + |
| 52 | +<Step title="配置每个仓库"> |
| 53 | + |
| 54 | +每个子路径都有自己的仓库(通常由不同团队拥有),与第一步中的控制仓库相互独立。在每个仓库的 `docs.yml` 中: |
| 55 | + |
| 56 | +- 通过名称引用全局主题:`global-theme: my-org-theme`。 |
| 57 | +- 声明一个带 `multi-source: true` 的实例,并在共享域名上指定唯一的基础路径。该基础路径必须出现在 `url` 和 `custom-domain` 的末尾。 |
| 58 | + |
| 59 | +例如,下面是同一共享域名上的两个仓库——一个在 `/product-a`,一个在 `/product-b`: |
| 60 | + |
| 61 | +<Tabs> |
| 62 | +<Tab title="Product A 仓库"> |
| 63 | +```yaml docs.yml |
| 64 | +global-theme: my-org-theme |
| 65 | + |
| 66 | +instances: |
| 67 | + - url: example.docs.buildwithfern.com/product-a |
| 68 | + custom-domain: docs.example.com/product-a |
| 69 | + multi-source: true |
| 70 | +``` |
| 71 | +</Tab> |
| 72 | +<Tab title="Product B 仓库"> |
| 73 | +```yaml docs.yml |
| 74 | +global-theme: my-org-theme |
| 75 | + |
| 76 | +instances: |
| 77 | + - url: example.docs.buildwithfern.com/product-b |
| 78 | + custom-domain: docs.example.com/product-b |
| 79 | + multi-source: true |
| 80 | +``` |
| 81 | +</Tab> |
| 82 | +</Tabs> |
| 83 | +
|
| 84 | +</Step> |
| 85 | +
|
| 86 | +<Step title="从每个仓库发布"> |
| 87 | +
|
| 88 | +每个仓库独立发布: |
| 89 | +
|
| 90 | +```bash |
| 91 | +fern generate --docs |
| 92 | +``` |
| 93 | + |
| 94 | +只更新该仓库拥有的子路径。其他子路径不受影响。 |
| 95 | + |
| 96 | +</Step> |
| 97 | + |
| 98 | +<Step title="在 Dashboard 中配置域名设置"> |
| 99 | + |
| 100 | +打开 [Fern Dashboard](https://dashboard.buildwithfern.com) 并选择您的顶级域名(例如 `docs.example.com`)——这些设置作用于整个域名,而不是单个子路径。在 **Settings** 标签页中,找到 **Multi-repo settings** 卡片。 |
| 101 | + |
| 102 | +配置以下内容: |
| 103 | + |
| 104 | +- **Default path**(默认路径,*可选*)——设置用户访问域名根路径时被引导到哪里。当一个 Fern 管理的页面应作为根路径时设置此项。例如,如果您的主页位于 `/home` 子路径,则将默认路径设置为 `/home`,以便 `docs.example.com` 重定向到 `docs.example.com/home`。如果根路径不由 Fern 管理(如 NVIDIA 的 `docs.nvidia.com`,那是 Fern 配置之外的一个独立营销站点),请跳过此项。 |
| 105 | +- **Search / Ask AI behavior**——控制 [Ask Fern](/learn/docs/ai-features/ask-fern/overview) 和搜索在子路径之间的工作方式。提供两种模式: |
| 106 | + - **Hierarchical**(分层)——在 `/subpath` 下的搜索仅返回 `/subpath` 及其下的结果。当每个子路径覆盖不同的产品、用户期望范围受限的结果时使用。 |
| 107 | + - **Unified**(统一)——在任意子路径下的搜索都会返回所有子路径的结果。当各子路径属于同一产品的不同部分、用户希望获得跨范围的结果时使用。 |
| 108 | + |
| 109 | +<Frame> |
| 110 | + |
| 111 | +</Frame> |
| 112 | + |
| 113 | +</Step> |
| 114 | + |
| 115 | +</Steps> |
| 116 | + |
| 117 | +## 示例:一个真实的多源站点 |
| 118 | + |
| 119 | +<Tip> |
| 120 | +浏览实时站点 [multi-source.docs.buildwithfern.com](https://multi-source.docs.buildwithfern.com),源代码位于 [fern-api/docs-examples/multi-source](https://github.com/fern-api/docs-examples/tree/main/multi-source)。 |
| 121 | +</Tip> |
| 122 | + |
| 123 | +这是与 NVIDIA 设置不同的另一种形态:根路径是一个 Fern 管理的主页,下面是各团队的子路径。该示例在一个共享域名上使用六个独立的 `fern/` 项目——`/` 上的主页、带两个嵌套子项的 `/seeds` 团队中心,以及独立的 `/greenhouses` 和 `/nursery` 团队: |
| 124 | + |
| 125 | +<Files> |
| 126 | + <Folder name="multi-source.docs.buildwithfern.com" defaultOpen> |
| 127 | + <File name="/" comment="主页" /> |
| 128 | + <Folder name="/seeds" defaultOpen comment="Seeds 团队中心"> |
| 129 | + <File name="/seeds/sunflower" comment="Sunflower 子团队" /> |
| 130 | + <File name="/seeds/tomato" comment="Tomato 子团队" /> |
| 131 | + </Folder> |
| 132 | + <File name="/greenhouses" comment="Greenhouses 团队" /> |
| 133 | + <File name="/nursery" comment="Nursery 团队" /> |
| 134 | + </Folder> |
| 135 | +</Files> |
| 136 | + |
| 137 | +<Note> |
| 138 | +单位是每个子路径一个 `fern/` 文件夹,而不是每个子路径一个仓库。每个子路径一个仓库(通常每个团队一个)的布局是最常见的形式,但在单个仓库中放置多个 `fern/` 文件夹也可以。 |
| 139 | +</Note> |
| 140 | + |
| 141 | +这六个项目都共享 `global-theme: plantstore-theme` 并设置了 `multi-source: true`——它们仅在基础路径上有所不同。子路径本身可以包含嵌套子路径:`/seeds/sunflower` 和 `/seeds/tomato` 是位于 `/seeds` 之下的独立发布的项目。 |
| 142 | + |
| 143 | +该示例使用 Fern 的预览域名(`*.docs.buildwithfern.com`),因此未设置 `custom-domain`。生产部署通常会为每个实例添加 `custom-domain: docs.example.com/...`。 |
| 144 | + |
| 145 | +<Tabs> |
| 146 | +<Tab title="主页"> |
| 147 | +```yaml homepage/fern/docs.yml |
| 148 | +global-theme: plantstore-theme |
| 149 | + |
| 150 | +instances: |
| 151 | + - url: multi-source.docs.buildwithfern.com |
| 152 | + multi-source: true |
| 153 | + |
| 154 | +navigation: |
| 155 | + - page: Home |
| 156 | + path: ./pages/home.mdx |
| 157 | +``` |
| 158 | +
|
| 159 | +主页 `home.mdx` 可以使用卡片将用户引导到每个团队的文档: |
| 160 | + |
| 161 | +```jsx home.mdx |
| 162 | +<CardGroup> |
| 163 | + <Card title="Seeds" icon="fa-regular fa-seedling" href="/seeds"> |
| 164 | + 一个带嵌套子项的中心,子项位于 `/seeds/sunflower` 和 `/seeds/tomato`。 |
| 165 | + </Card> |
| 166 | + <Card title="Greenhouses" icon="fa-regular fa-warehouse" href="/greenhouses"> |
| 167 | + 气候控制和监测。 |
| 168 | + </Card> |
| 169 | + <Card title="Nursery" icon="fa-regular fa-leaf" href="/nursery"> |
| 170 | + 植物养护与繁殖。 |
| 171 | + </Card> |
| 172 | +</CardGroup> |
| 173 | +``` |
| 174 | +</Tab> |
| 175 | +<Tab title="Seeds(中心)"> |
| 176 | +```yaml seeds/fern/docs.yml |
| 177 | +global-theme: plantstore-theme |
| 178 | + |
| 179 | +instances: |
| 180 | + - url: multi-source.docs.buildwithfern.com/seeds |
| 181 | + multi-source: true |
| 182 | + |
| 183 | +navigation: |
| 184 | + - section: Getting started |
| 185 | + contents: |
| 186 | + - page: Overview |
| 187 | + path: ./pages/overview.mdx |
| 188 | +``` |
| 189 | +</Tab> |
| 190 | +<Tab title="Sunflower(嵌套)"> |
| 191 | +```yaml seeds-sunflower/fern/docs.yml |
| 192 | +global-theme: plantstore-theme |
| 193 | + |
| 194 | +instances: |
| 195 | + - url: multi-source.docs.buildwithfern.com/seeds/sunflower |
| 196 | + multi-source: true |
| 197 | + |
| 198 | +navigation: |
| 199 | + - section: Getting started |
| 200 | + contents: |
| 201 | + - page: Overview |
| 202 | + path: ./pages/overview.mdx |
| 203 | +``` |
| 204 | +</Tab> |
| 205 | +<Tab title="Greenhouses"> |
| 206 | +```yaml greenhouses/fern/docs.yml |
| 207 | +global-theme: plantstore-theme |
| 208 | + |
| 209 | +instances: |
| 210 | + - url: multi-source.docs.buildwithfern.com/greenhouses |
| 211 | + multi-source: true |
| 212 | + |
| 213 | +navigation: |
| 214 | + - section: Getting started |
| 215 | + contents: |
| 216 | + - page: Overview |
| 217 | + path: ./pages/overview.mdx |
| 218 | +``` |
| 219 | +</Tab> |
| 220 | +</Tabs> |
| 221 | +
|
| 222 | +## 属性 |
| 223 | +
|
| 224 | +<ParamField path="instances.multi-source" type="boolean" required={false} default={false}> |
| 225 | + 设为 `true` 时,CLI 使用基础路径感知的发布方式,让多个仓库可以共存于同一个自定义域名下。启用此项时,`url` 和 `custom-domain` 必须共享相同的基础路径。 |
| 226 | +</ParamField> |
| 227 | + |
| 228 | +<ParamField path="global-theme" type="string" required={false}> |
| 229 | + 要应用的[全局主题](/learn/docs/customization/global-themes)的名称。CLI 在发布时从 Fern 的注册表中获取该主题,并将其品牌字段合并到本地 `docs.yml` 中。完整字段列表请参阅[主题控制的内容](/learn/docs/customization/global-themes#what-the-theme-controls)。 |
| 230 | +</ParamField> |
0 commit comments