# 持久化环境变量和临时文件

可以配置自定义环境变量，以便每次打开 codespace 时，它们都设置为相同的值。 还可以确保在 codespace 停止时不会删除临时文件。

## 设置永久性环境变量

可以通过多种方式设置持久化的自定义环境变量，具体取决于希望在哪些代码空间、存储库或用户中使用这些变量。

对于下面所列的设置自定义变量的所有方法，可以使用 `echo $VARNAME` 等语法访问 codespace 中的自定义变量。

### 对于单个 codespace

如果没有使用 Bash shell，则可以在 `~/.bashrc` 文件中或在等效配置文件中设置环境变量的值。 例如，添加语句 `VARNAME=value`。

将更改保存到此文件后，下次打开 codespace 时便会设置该值，你也可以使用 `source ~/.bashrc` 等命令立即设置该值。 如果停止并启动 codespace，变量将保持已设置状态。 但是，如果重新生成容器，主目录中文件的更改将重置，因此在重新生成过程中，`~/.bashrc` 文件中设置的变量不会保留。 有关详细信息，请参阅[防止自动删除临时文件](#preventing-temporary-files-from-being-automatically-deleted)。

### 对于存储库的所有 codespace

可以通过三种方式针对你为存储库创建的所有 codespace 设置永久性自定义环境变量：

* 可以编辑存储库的 `devcontainer.json` 配置文件。
* 可以使用自定义 Dockerfile。
* 可以使用开发环境机密。

#### 编辑存储库的 `devcontainer.json` 配置文件

编辑存储库的 `devcontainer.json` 配置文件，并使用 `remoteEnv` 属性设置环境变量值：

```json
{
  "remoteEnv": {
    "VARNAME": "value"
  }
}
```

请仅在确认可以接受将值以纯文本形式提交到存储库时才使用此方法。 对于敏感值（如访问令牌），请使用开发环境机密。

环境变量将在编辑器的远程服务器进程中设置，并将可用于该远程服务器进程的子进程，如终端和调试会话。 不过，该变量在容器中不会更广泛地可用。 如果不需要为启动时运行的其他后台进程设置环境变量，并且使用的是预制映像而没有或无需自定义 Dockerfile，那么此方法非常有用。

在将此更改推送到存储库后重新生成容器或创建新 codespace 时，此设置将生效。 有关将配置更改应用于 codespace 的详细信息，请参阅 [开发容器简介](/zh/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)。

#### 使用自定义 Dockerfile

如果使用自定义 Dockerfile，则可以通过添加 `ENV VARNAME=value` 在此设置环境变量。

如果已有 Dockerfile 并希望在容器范围级别设置变量，那么此方法非常有用。

在将此更改推送到存储库后重新生成容器或创建新 codespace 时，此设置将生效。 有关将配置更改应用于 codespace 的详细信息，请参阅 [开发容器简介](/zh/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)。

#### 使用开发环境中的机密信息

您可以使用开发环境密钥为为 GitHub Codespaces 存储库创建的代码空间设置自定义变量。 有关详细信息，请参阅“[管理 GitHub Codespaces 的账户专属的机密](/zh/codespaces/managing-your-codespaces/managing-your-account-specific-secrets-for-github-codespaces)”。

对于不希望以纯文本形式提交到存储库的环境变量值，应使用此方法。

此设置将在下次为此存储库创建 codespace 时或重启现有 codespace 时生效。

### 对于创建的所有 codespace

如果要为创建的所有 codespace 设置个性化环境变量，可以使用 `dotfiles` 存储库中的文件对此进行设置。 例如，在 `VARNAME=value` 文件中添加 `.bash_profile`。 在点文件中设置的环境变量对你而言是个人变量，且不针对任何其他人设置。 有关 Dotfiles 的更多信息，请参见 [个性化你帐户的 GitHub Codespaces](/zh/codespaces/setting-your-user-preferences/personalizing-github-codespaces-for-your-account#dotfiles)。

## 防止自动删除临时文件

创建 codespace 时，存储库将克隆到 codespace 的 `/workspaces` 目录中。 这是装载到容器中的永久性目录。 停止和启动 codespace 以及在 codespace 中重新生成容器时，将保留在此目录中所做的任何更改（包括编辑、添加或删除文件）。

在 `/workspaces` 目录外，codespace 包含 Linux 目录结构，该结构因用于生成 codespace 的开发容器映像而异。 可以添加文件或对 `/workspaces` 目录外部的文件进行更改。 例如，可以安装新程序，也可以在文件（如 `~/.bashrc`）中设置 shell 配置。 作为非根用户，你可能不会自动拥有对某些目录的写入访问权限，但大多数映像允许使用 `sudo` 命令对这些目录进行根访问。

在 `/workspaces` 外，除 `/tmp` 目录，codespace 中的目录都与容器的生命周期相关联。 这意味着在停止和启动 codespace 时，所做的任何更改都将保留，但在重新生成容器时则不会保留。 有关创建符号链接以在目录外部 `/workspaces` 保留数据的信息，请参阅 [在 codespace 中重新生成容器](/zh/codespaces/developing-in-a-codespace/rebuilding-the-container-in-a-codespace#persisting-data-over-a-rebuild)。

`/tmp` 目录是一个例外，因为它已装载到容器中，但不是永久性的。 因此，`/tmp` 目录的内容在重新生成时会保留，但每次 codespace 停止时都会被清除。 例如，如果 codespace 会话在处于非活动状态一段时间后超时，则会清除 `/tmp` 目录。 有关详细信息，请参阅“[设置 GitHub Codespaces 超时期限](/zh/codespaces/setting-your-user-preferences/setting-your-timeout-period-for-github-codespaces)”。

如果希望临时文件在下次启动 codespace 时可以使用，请不要将其保存在 `/tmp` 目录中。

## 其他阅读材料

* [在 codespace 中更改 shell](/zh/codespaces/customizing-your-codespace/changing-the-shell-in-a-codespace)