# Cargo 缓存和 target 目录有什么区别？Rust 开发者该删哪个

> 了解 Rust 项目 target 构建产物与 Cargo 依赖缓存的区别、哪些可以安全删除，以及 .cargo 目录中哪些内容绝对不应当作缓存清理

磁盘空间不足时，通常应该先清理不再活跃项目的 `target` 目录。这里保存的是单个 Rust workspace 的构建产物，之后重新编译即可生成。只有在 Cargo 的共享依赖缓存确实很大、已经损坏，或者近期不需要离线开发时，才考虑清理它；代价是后续需要重新下载或解压依赖。

不要直接删除整个 `.cargo` 目录。这里还可能包含 Cargo 配置、registry 凭据，以及通过 `cargo install` 安装的命令行工具，它们都不是可以随手删除的缓存。

> 本文路径与命令于 2026 年 8 月 12 日在 macOS 15.7.7、Cargo 1.84.0 和 rustc 1.84.0 环境验证。Cargo 支持自定义 Home 和构建目录，执行清理前请以自己机器上的实际路径为准。

## 简单结论：先清 target，再考虑 Cargo 缓存

Cargo 会保存两类性质不同、但都可以重新生成的数据：

- workspace 中的 `target` 目录，保存这个项目的编译结果；
- Cargo Home（通常为 `~/.cargo`），保存共享下载、解压后的依赖源码、Git 依赖、配置、凭据和已安装工具。

区别在于恢复成本。删除 `target` 主要损失编译时间；删除依赖缓存还可能需要网络和重新编译。因此，对大多数开发者来说，废弃项目的 `target` 是更合适的第一清理目标。

<table>
<thead>
  <tr>
    <th>
      路径
    </th>
    
    <th>
      包含内容
    </th>
    
    <th>
      是否可以删除
    </th>
    
    <th>
      删除后的影响
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        project/target
      </code>
    </td>
    
    <td>
      Debug、Release、增量编译、文档和不同目标平台的构建产物
    </td>
    
    <td>
      可以，先停止构建
    </td>
    
    <td>
      项目需要重新编译
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ~/.cargo/registry/cache
      </code>
    </td>
    
    <td>
      已下载的 crate 压缩包
    </td>
    
    <td>
      通常可以，但要确保能够联网
    </td>
    
    <td>
      Cargo 会重新下载缺失的 crate
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ~/.cargo/registry/src
      </code>
    </td>
    
    <td>
      从 registry 解压出的依赖源码
    </td>
    
    <td>
      通常可以，但要确保能够联网
    </td>
    
    <td>
      Cargo 会重新解压或下载
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ~/.cargo/git/db
      </code>
      
       和 <code>
        git/checkouts
      </code>
    </td>
    
    <td>
      Git 依赖仓库及其 checkout
    </td>
    
    <td>
      通常可以，但要确保能够联网
    </td>
    
    <td>
      Cargo 会重新拉取和 checkout
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ~/.cargo/bin
      </code>
    </td>
    
    <td>
      通过 <code>
        cargo install
      </code>
      
       安装的工具
    </td>
    
    <td>
      不可以当作缓存删除
    </td>
    
    <td>
      已安装命令会消失
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        config.toml
      </code>
      
       和 <code>
        credentials.toml
      </code>
    </td>
    
    <td>
      Cargo 设置和 registry 凭据
    </td>
    
    <td>
      不可以
    </td>
    
    <td>
      构建、registry、代理或登录可能失效
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        Cargo.toml
      </code>
      
      、<code>
        Cargo.lock
      </code>
      
      、<code>
        src
      </code>
    </td>
    
    <td>
      项目定义、依赖锁定和源代码
    </td>
    
    <td>
      不可以
    </td>
    
    <td>
      会直接破坏项目
    </td>
  </tr>
</tbody>
</table>

Windows 的默认 Cargo Home 通常是 `%USERPROFILE%\.cargo`。如果设置了 `CARGO_HOME`，无论使用哪个系统，都应以该环境变量指向的位置为准。

## target 目录为什么会越来越大？

Cargo 默认把构建输出写入 workspace 的 `target` 目录。Debug 和 Release profile 使用不同的子目录；增加编译目标后，不同 target triple 也会保存各自的产物。增量编译还会保留中间数据，以缩短后续构建时间。

如果一个 workspace 同时构建桌面程序、WebAssembly、多个架构或多套 feature，累计占用远高于源代码大小很正常。Cargo 官方将这些内容视为可以重新生成的构建数据，但删除仍有明确代价：下一次构建会从冷缓存开始。

本文实测的 MangoDisk 仓库中，`target` 占用了 27 GB。同一台 Mac 上，Cargo registry 压缩包缓存为 189 MB，解压源码为 1.9 GB，Git 数据库为 17 MB。这只是当前机器的实际结果，不代表每个人都能释放同样空间；它说明了为什么应该先测量，而不是默认全局 Cargo 缓存最大。

## 清理前先确认真实路径和大小

在 macOS 或 Linux 的 Rust workspace 中，可以先执行这些只读命令：

```bash
cargo_home="${CARGO_HOME:-$HOME/.cargo}"

du -sh target 2>/dev/null
du -sh "$cargo_home/registry/cache" "$cargo_home/registry/src" \
  "$cargo_home/git/db" "$cargo_home/git/checkouts" 2>/dev/null
```

Cargo 也可能使用自定义 target 目录。下面的命令会输出 workspace 元数据，其中包含实际的 `target_directory`：

```bash
cargo metadata --no-deps --format-version 1
```

在 PowerShell 中，可以分别检查当前项目和默认 Cargo Home：

```powershell
$CargoHome = if ($env:CARGO_HOME) { $env:CARGO_HOME } else { Join-Path $HOME ".cargo" }

Get-ChildItem .\target -Recurse -File -Force -ErrorAction SilentlyContinue |
  Measure-Object Length -Sum
Get-ChildItem "$CargoHome\registry\cache" -Recurse -File -Force -ErrorAction SilentlyContinue |
  Measure-Object Length -Sum
```

PowerShell 结果以字节为单位。更重要的是，检查过程能让你在删除前再次确认路径。

## 如何安全清理项目 target 目录

先停止 `cargo build`、测试、正在编译的 rust-analyzer 任务，以及从该 workspace 启动的程序。然后预览 Cargo 准备删除的内容：

```bash
cargo clean --dry-run -v
```

确认范围无误后，清理当前 workspace 的完整 target 目录：

```bash
cargo clean
```

如果还想保留有用的构建数据，可以缩小清理范围：

```bash
# 只删除 Release profile 的构建产物
cargo clean --release

# 只删除生成的文档
cargo clean --doc

# 只删除 workspace 中一个 package 的构建产物
cargo clean -p your-package-name
```

`cargo clean` 会遵循 Cargo 配置中的 target 目录。对使用自定义 `target-dir` 的 workspace 来说，这比手动假设目录一定是 `./target` 更稳妥。

清理后目录重新出现是正常现象。下一次构建会创建它；由于增量编译数据已经删除，第一次完整编译通常会明显变慢。

## 什么情况下应该清理 Cargo 共享缓存？

以下情况适合考虑清理：

- 实测缓存占用已经大到值得处理；
- 下载的压缩包或 Git 依赖已经损坏；
- 旧工具链和项目留下了近期不会再用的依赖；
- 现在必须释放空间，而且之后有可靠网络可以恢复依赖。

准备乘飞机、需要离线工作或内部 registry 可能不可用时，不建议清理。动手前还应确认团队是否使用了自定义 registry、vendored dependencies 或非默认 `CARGO_HOME`。

Cargo Home 官方文档把 registry 和 Git 相关内容描述为可通过重新解压、checkout 或下载恢复的缓存。如果决定手动删除，请先退出 Cargo 相关进程，设置准确的 Cargo Home，并最后检查一次：

```bash
cargo_home="${CARGO_HOME:-$HOME/.cargo}"
du -sh "$cargo_home/registry/cache" "$cargo_home/registry/src" \
  "$cargo_home/git/db" "$cargo_home/git/checkouts" 2>/dev/null
```

然后只删除自己明确选中的缓存子目录：

```bash
rm -rf "$cargo_home/registry/cache" "$cargo_home/registry/src" \
  "$cargo_home/git/db" "$cargo_home/git/checkouts"
```

该命令不会经过废纸篓，绝对不要把它简化成 `rm -rf ~/.cargo`。清理后，下一次联网构建可能会重新下载和解压依赖。

Windows 用户可以使用文件资源管理器，查看并删除 `%CARGO_HOME%` 或 `%USERPROFILE%\.cargo` 下对应的缓存子目录。可视化确认能降低误选 `bin`、配置或凭据文件的风险。

## 哪些内容绝对不能当作 Cargo 缓存删除？

不要把这些内容列为清理目标：

- `.cargo/bin`：这里保存 `cargo-audit`、`cargo-edit` 等已安装命令；
- `.cargo/credentials.toml`：这里可能保存 registry 登录令牌；
- `.cargo/config.toml`：这里可能定义 registry、alias、网络设置和编译目标行为；
- 项目中的 `Cargo.toml`、`Cargo.lock`、`build.rs` 或 `src`；
- vendored dependencies 或团队维护的离线镜像，除非负责人已经制定恢复方案。

如果不能确认某个目录是否只是缓存，就停在查看步骤。内容位于 `.cargo` 下面，并不等于可以随意删除。

## 使用 MangoDisk 检查 Rust 构建产物

[MangoDisk 深度清理](/zh/docs/features/deep-clean)可以识别 Rust 项目的 `target` 目录，以及不同平台对应的 Cargo 缓存位置。规则不会把整个 `.cargo` 作为清理目标，项目构建产物也不会默认选中。

扫描在本地完成。你可以先查看路径和实际大小，再决定是否删除；当多个 workspace 各自保存了 `target` 时尤其方便。完整确认和清理历史流程可以查看 [MangoDisk 安全指南](/zh/docs/safety)。

## 常见问题

### Rust 项目的 target 目录可以安全删除吗？

可以，前提是它确实是 Cargo 配置的构建输出目录，而且当前没有构建任务。这里保存的是可重新生成的产物，不是项目源代码；删除后需要接受一次更慢的完整编译。

### cargo clean 会清理 Cargo 下载缓存吗？

不会。`cargo clean` 删除的是 target 目录中的构建产物，不会清空 Cargo Home 中的 registry 或 Git 依赖缓存。

### 可以删除 Cargo.lock 来省空间或修复依赖吗？

不可以。`Cargo.lock` 很小，用于记录已经解析的依赖版本。删除它不是磁盘清理，还可能让 Cargo 选择不同的依赖版本。

### 为什么 Cargo 缓存和 target 又出现了？

这是正常现象。项目构建时，Cargo 会重新生成构建产物并恢复缺失的依赖。清理只是删除旧的可再生数据，不会关闭缓存机制。

## 资料来源与延伸阅读

- [Cargo Book：Build Cache](https://doc.rust-lang.org/stable/cargo/reference/build-cache.html)
- [Cargo Book：cargo clean](https://doc.rust-lang.org/cargo/commands/cargo-clean.html)
- [Cargo Book：Cargo Home](https://doc.rust-lang.org/cargo/guide/cargo-home.html)
- [如何安全清理 Xcode Derived Data](/zh/blog/how-to-clear-xcode-derived-data-safely)
- [我为什么开发 MangoDisk](/zh/blog/why-i-built-mangodisk)

希望先直观看清 Rust 构建产物和 Cargo 缓存再决定是否删除？可以[下载 MangoDisk](/zh/)，在本地检查扫描结果。

如果你也用 Codex 做项目，工作目录里可能还留着多份依赖和构建文件。可以看看[Codex 占用空间太大，哪些文件值得清理？](/zh/blog/codex-disk-usage)，先找到大目录，再处理支持清理的项目文件，保留代码和聊天记录。

也在使用 Node.js？可以看看[npm 下载缓存怎么清理](/zh/blog/clean-npm-cache)，它和各个项目里的依赖目录需要分开处理。
