## 概述

预生成为存储库、分支和 `devcontainer.json` 配置文件的特定组合组装 codespace 的主要组件。 它提供了一种快速创建新 codespace 的方法。 特别是对于复杂和/或大型的存储库，你可以使用预生成更快地创建新 codespace。

如果当前为存储库创建 codespace 的时间超过 2 分钟，则使用预生成可能会更好。 这是因为，使用预生成，会在创建 codespace 之前下载、安装和应用任何源代码、编辑器扩展、项目依赖项、命令和配置。

默认情况下，每当将更改推送到存储库时，GitHub Codespaces 都会使用 GitHub Actions 自动更新预生成。

当预生成可用于存储库的特定分支、特定开发容器配置文件和你所在的区域时，你会在创建 codespace 时在计算机类型选项列表中看到“<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-zap" aria-label="zap" role="img"><path d="M9.504.43a1.516 1.516 0 0 1 2.437 1.713L10.415 5.5h2.123c1.57 0 2.346 1.909 1.22 3.004l-7.34 7.142a1.249 1.249 0 0 1-.871.354h-.302a1.25 1.25 0 0 1-1.157-1.723L5.633 10.5H3.462c-1.57 0-2.346-1.909-1.22-3.004L9.503.429Zm1.047 1.074L3.286 8.571A.25.25 0 0 0 3.462 9H6.75a.75.75 0 0 1 .694 1.034l-1.713 4.188 6.982-6.793A.25.25 0 0 0 12.538 7H9.25a.75.75 0 0 1-.683-1.06l2.008-4.418.003-.006a.036.036 0 0 0-.004-.009l-.006-.006-.008-.001c-.003 0-.006.002-.009.004Z"></path></svg> Prebuild ready”标签。 如果仍在创建预生成，你将看到“<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-history" aria-label="history" role="img"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg> Prebuild in progress”标签。 有关详细信息，请参阅“[为存储库创建 codespace](/zh/codespaces/developing-in-a-codespace/creating-a-codespace-for-a-repository#creating-a-codespace-for-a-repository)”。

![可用计算机类型的列表的屏幕截图：2 核、4 核、8 核、16 核和 32 核，全部标记为“预生成就绪”。](/assets/images/help/codespaces/choose-custom-machine-type.png)

根据“你的 codespace”页面上的模板创建 codespace 时，GitHub 可能会自动使用预生成来加快创建时间。 有关模板的详细信息，请参阅 [通过模板创建 codespace](/zh/codespaces/developing-in-a-codespace/creating-a-codespace-from-a-template)。

> \[!NOTE]
> 创建的每个预生成都会占用存储空间，这会产生可计费的费用，或对于个人 GitHub 帐户拥有的存储库，这将使用该帐户每月包含的存储空间的一部分。 有关详细信息，请参阅“[GitHub Codespaces 计费](/zh/billing/concepts/product-billing/github-codespaces)”。

## 预生成过程

要创建预生成，请设置预生成配置。 保存配置时，将运行 GitHub Actions 工作流以创建每个所需的预生成；每个预生成一个工作流。 每当需要更新配置的预生成时，也会运行工作流。 在计划时间间隔、推送到已启用预生成的存储库时或更改开发容器配置时可能会发生这种情况。 有关详细信息，请参阅“[配置预生成](/zh/codespaces/prebuilding-your-codespaces/configuring-prebuilds#configuring-prebuilds)”。

运行预生成配置工作流时，GitHub 会创建临时 codespace，从而执行直到 `devcontainer.json` 文件中的任何 `onCreateCommand` 和 `updateContentCommand` 命令（含）的设置操作。 在创建预生成期间不会运行任何 `postCreateCommand` 命令。 有关使用这些命令的详细信息，请参阅 VS Code 文档中的 [`devcontainer.json` 参考](https://code.visualstudio.com/docs/remote/devcontainerjson-reference#_devcontainerjson-properties)。 然后创建并存储生成的容器的快照。

与其他 GitHub Actions 工作流一样，运行预生成配置工作流会占用帐户中包含的一些 GitHub Actions 分钟（如果有），或者会产生 GitHub Actions 分钟的费用。 存储 codespace 预生成的计费方式与存储活动或已停止的 codespace 相同。 有关详细信息，请参阅“[GitHub Codespaces 计费](/zh/billing/managing-billing-for-your-products/managing-billing-for-github-codespaces/about-billing-for-github-codespaces)”。

从预生成创建 codespace 时，GitHub 从存储下载现有容器快照，并将其部署到全新的虚拟机上，从而完成开发容器配置中指定的剩余命令。 由于已执行许多操作（例如克隆存储库），因此从预生成创建 codespace 可能比在没有预生成的情况下创建 codespace 要快得多。 存储库很大和/或 `onCreateCommand` 命令的运行时间很长时会出现这种情况。

## 关于将更改推送到已启用预生成的分支

默认情况下，每次推送到有预生成配置的分支，都会运行一个 GitHub 托管的 GitHub Actions 工作流来更新预生成。 预生成工作流有一个并发限制，即，对于一个给定的预生成配置，一次只能运行一个工作流，除非进行的更改影响到相关存储库的开发容器配置。 有关详细信息，请参阅“[开发容器简介](/zh/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)”。 如果运行已在进行中，则最近排队的工作流运行将在当前运行完成后运行。

将预生成设置为在每次推送时更新，意味着如果存储库中存在非常频繁的推送，预生成更新将至少与运行预生成工作流所需的频率一样频繁。 也就是说，如果工作流运行通常需要一个小时才能完成且运行成功，那么大约每小时会为存储库创建一次预生成，如果分支上有更改开发容器配置的推送，则创建预生成会更频繁。

例如，假设针对有预生成配置的分支连续进行 5 次推送。 在这种情况下：

* 在第一次推送中会启动工作流运行，以更新预生成。

* 如果余下的 4 次推送不会影响开发容器配置，这些工作流运行将以“挂起”状态排队。

  如果余下 4 次推送中的任何一次更改了开发容器配置，服务将不会跳过该推送，并将立即运行预生成创建工作流，运行成功后将相应地更新预生成。

* 首次运行完成后，将取消第 2、3 和 4 次推送的工作流运行，最后排队的工作流（第 5 次推送）将运行并更新预生成。