# Cargo 快取和 target 資料夾有什麼不同？Rust 開發者該刪哪個

> 了解 Rust 專案 target 建置成果與 Cargo 相依套件快取的差異、哪些可以安全刪除，以及 .cargo 裡哪些內容不該當成快取清理

需要騰出磁碟空間時，通常應該先清理已經不再使用的專案 `target` 資料夾。這裡存放的是個別 Rust workspace 的建置成果，之後重新編譯就能產生。只有在 Cargo 共用快取確實很大、內容損壞，或近期不需要離線開發時，才考慮清理相依套件快取；清掉之後，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 相依套件的 repository 與 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、Proxy 或登入可能失效
    </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 repository 的 `target` 佔了 27 GB。同一台 Mac 的 Cargo registry 壓縮檔快取為 189 MB、解壓縮後的原始碼為 1.9 GB，Cargo Git 資料庫則是 17 MB。這只是這台電腦的實測結果，不代表每個人都能釋放相同空間；重點是應該先量測，而不是預設全域快取一定最大。

## 清理前先確認實際路徑與容量

在 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 metadata，其中包含實際的 `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 相依套件已損壞；
- 舊 toolchain 與專案留下近期不會再用的套件；
- 現在必須騰出空間，而且之後有穩定網路能夠復原。

搭飛機前、需要離線工作，或公司內部 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 登入 token；
- `.cargo/config.toml`：這裡可能定義 registry、alias、網路設定與編譯目標行為；
- 專案裡的 `Cargo.toml`、`Cargo.lock`、`build.rs` 或 `src`；
- vendored dependencies 或團隊維護的離線 mirror，除非負責人已有復原計畫。

如果不確定某個資料夾是否只是快取，就停在檢查步驟。位於 `.cargo` 底下，不代表它可以隨意刪除。

## 使用 MangoDisk 檢查 Rust 建置成果

[MangoDisk 深度清理](/tw/docs/features/deep-clean)可以辨識 Rust 專案的 `target` 資料夾，以及各平台對應的 Cargo 快取位置。規則不會把整個 `.cargo` 當成清理目標，專案建置成果也不會預設勾選。

掃描會在本機完成。你可以先查看路徑與實際容量，再決定是否刪除；當多個 workspace 都有自己的 `target` 時特別實用。完整的確認與清理記錄流程可參考 [MangoDisk 安全指南](/tw/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](/tw/blog/how-to-clear-xcode-derived-data-safely)
- [我為什麼開發 MangoDisk](/tw/blog/why-i-built-mangodisk)

想先看清楚 Rust 建置成果與 Cargo 快取，再決定要不要刪除？可以[下載 MangoDisk](/tw/)，直接在本機檢查掃描結果。

如果你也用 Codex 做專案，工作目錄裡可能還留著好幾份套件和建置檔案。這篇 [Codex 空間清理指南](/tw/blog/codex-disk-usage)說明如何先找出大資料夾，再整理支援清理的檔案，保留程式碼與對話紀錄。

也有使用 Node.js？可以看看[npm 下載快取怎麼清](/tw/blog/clean-npm-cache)，它和各個專案的相依套件需要分開處理。
