天天看點

【Rust 小技巧】指定 target 輸出目錄

作者:不秃頭程式員
【Rust 小技巧】指定 target 輸出目錄

在 Rust 程式設計語言中,target 目錄是由 Cargo(Rust 的包管理和建構工具)自動生成的。它主要用于存放建構輸出的産物檔案和相關的編譯期産生的中間檔案等。但是 target 目錄往往會非常大,即使一個簡單的 hello world 程式,就已經達到 9 MB 了。

【Rust 小技巧】指定 target 輸出目錄

可能一個比較簡單的項目,會達到 1 GB 多。甚至有些網友調侃——如果電腦硬碟太小,可能學不了 Rust。

0x01 指定 target 目錄

另外當電腦中的 Rust 項目太多時,無法管理 target 目錄。其實我們可以指定所有項目統一的 target 目錄。下面将以 Windows 作業系統為例示範。

首先在 C:\Users\使用者名\.cargo\ 目錄下,找到 config.toml 檔案。如果在該目錄下沒有 config.toml 檔案,則需要建立該檔案。如下圖所示:

【Rust 小技巧】指定 target 輸出目錄

注意:config 檔案也有可能沒有擴充名,如 config,又或者是其它擴充名,如 config.txt,配置檔案的擴充名不重要,重要的是檔案名稱必須是 config。

在檔案中添加下面的配置資訊:

[build]
target-dir = "D:/my-target"           

上面的配置是指定所有項目的統一 target 目錄為 D:/my-target。如下圖:

【Rust 小技巧】指定 target 輸出目錄

我們再次編譯項目,檢視項目根目錄和 D:/my-target 目錄,如下圖:

【Rust 小技巧】指定 target 輸出目錄

可以看到,在項目的工程目錄已經沒有 target 目錄,真正的 target 目錄已經被我們指定為 D:/my-target 目錄了。

0x02 target 目錄有什麼

下面是一個簡單項目的 target 目錄,讓我們看下它會包含什麼呢?

【Rust 小技巧】指定 target 輸出目錄

target 目錄包含以下幾個子目錄和檔案:

target/debug:

  • 存儲調試模式下建構的可執行檔案和庫檔案。
  • 包含中間編譯産物,如對象檔案(.o 檔案)和生成的二進制檔案。

target/release:

  • 存儲釋出模式下建構的可執行檔案和庫檔案。
  • 與調試模式相比,釋出模式進行了優化,生成的二進制檔案通常更小且運作速度更快。

target/doc:

  • 存放項目文檔(通常是通過 cargo doc 指令生成的 HTML 文檔)。

target/.fingerprint:

  • 存儲建構的指紋檔案,用于跟蹤哪些檔案已經被編譯以及是否需要重新編譯。

target/package:

  • 存放項目打包後的檔案,通常用于 cargo publish 指令釋出到 crates.io 倉庫。

其他臨時檔案和目錄:

  • 包括建構緩存、生成的彙編代碼等。

0x03 指定 target 目錄的優缺點

統一存放 target 檔案既有優點也有缺點:

優點

緩存複用:

如果多個項目使用相同的依賴庫,通過指定一個共享的 target 目錄,可以複用編譯緩存,減少重複編譯的時間,大幅提升建構效率。

管理友善:

通過将編譯輸出集中到一個特定目錄,可以更友善地管理和清理編譯輸出檔案。當 Rust 項目過多時,我們可以随時清理 target 檔案。

缺點

多個項目共享同一個 target 目錄可能會因為不同的依賴版本而産生沖突,當遇到沖突時需要及時清理 target 目錄。

0x04 小結

總體上講,指定 target 目錄可以帶來顯著的建構效率提升,但也需要考慮潛在的版本沖突問題,這個需要根據實際的項目來取舍。