![](http://image.uc.cn/s/wemedia/s/upload/2024/a3093fa34d97e99a7168e8c4d4dc6201.jpg)
在 Rust 編程語言中,target 目錄是由 Cargo(Rust 的包管理和構建工具)自動生成的。它主要用于存放構建輸出的産物文件和相關的編譯期産生的中間文件等。但是 target 目錄往往會非常大,即使一個簡單的 hello world 程序,就已經達到 9 MB 了。
![](http://image.uc.cn/s/wemedia/s/upload/2024/c0504582c7d38b0f0d9aaaab622acbb3.jpg)
可能一個比較簡單的項目,會達到 1 GB 多。甚至有些網友調侃——如果電腦硬盤太小,可能學不了 Rust。
0x01 指定 target 目錄另外當電腦中的 Rust 項目太多時,無法管理 target 目錄。其實我們可以指定所有項目統一的 target 目錄。下面將以 Windows 操作系統爲例演示。
首先在 C:\Users\用戶名\.cargo\ 目錄下,找到 config.toml 文件。如果在該目錄下沒有 config.toml 文件,則需要創建該文件。如下圖所示:
![](http://image.uc.cn/s/wemedia/s/upload/2024/f93800a7d9d567274dcc7f127923a62d.jpg)
注意:config 文件也有可能沒有擴展名,如 config,又或者是其它擴展名,如 config.txt,配置文件的擴展名不重要,重要的是文件名稱必須是 config。
在文件中添加下面的配置信息:
[build]target-dir = "D:/my-target"上面的配置是指定所有項目的統一 target 目錄爲 D:/my-target。如下圖:
![](http://image.uc.cn/s/wemedia/s/upload/2024/7de70f0d56fcf8bb9eb6390711f66df4.jpg)
我們再次編譯項目,查看項目根目錄和 D:/my-target 目錄,如下圖:
![](http://image.uc.cn/s/wemedia/s/upload/2024/d1638adbf0bd13147ed5968dc95e281e.jpg)
可以看到,在項目的工程目錄已經沒有 target 目錄,真正的 target 目錄已經被我們指定爲 D:/my-target 目錄了。
0x02 target 目錄有什麽下面是一個簡單項目的 target 目錄,讓我們看下它會包含什麽呢?
![](http://image.uc.cn/s/wemedia/s/upload/2024/05492b11d79ec143c1d32a538f7acdaf.jpg)
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 目錄可以帶來顯著的構建效率提升,但也需要考慮潛在的版本沖突問題,這個需要根據實際的項目來取舍。