我的电脑只有256G的硬盘,所以剩下的硬盘空间不太多,Rust 编译出来的文件很大,一个项目恶心到5G 多。我查看Rust占用硬盘达到了150多G。所以一直想怎么优化,或者删除编译资源。我分为三种情况,
- 编译的时候输出变小
- 运行结束输出清理
- 整个存放 Rust 的文件夹进行清理
编译的时候输出变小的 shell 代码
shell代码解读复制代码#!/bin/bash # 检查是否安装了 Rust if ! command -v cargo &> /dev/null; then echo "Cargo 未安装,请安装 Rust 工具链。" exit 1 fi # 设置优化标志以减小 debug 构建的大小 export RUSTFLAGS="-C opt-level=1" # 开始编译 echo "开始编译..." cargo build # 检查编译是否成功 if [ $? -ne 0 ]; then echo "编译失败,请检查错误信息。" exit 1 fi # 获取二进制文件路径 binary_path=$(cargo metadata --format-version=1 --no-deps | jq -r ''.target_directory'')/debug/$(cargo metadata --format-version=1 --no-deps | jq -r ''.packages[0].targets[] | select(.kind[0]=="bin") | .name'') if [ ! -f "$binary_path" ]; then echo "无法找到编译后的二进制文件。" exit 1 fi # 显示二进制文件大小 echo "编译完成。二进制文件大小:" du -h "$binary_path" # 运行调试版本 echo "运行调试版本..." "$binary_path"
- 把上面的 shell 制作成一个文件best_build.shell
- 然后进行 chmod +x best_build.sh
- 再在.zshrc 或者 bash 中 添加别名 alias bb="~/Soft/VSCode/best_build.sh"
这样就可以工程中运行bb命令优化编译输出,大概能减少一半以上的输出文件。
运行结束输出清理的代码
1.编译优化的运行结束,再清理
bash代码解读复制代码#!/bin/bash # 处理清理操作的函数 cleanup() { echo "执行 cargo clean..." cargo clean echo "清理完成。" } # 捕获 INT 信号(Ctrl+C)和 EXIT 事件 trap cleanup INT EXIT # 编译过程 echo "开始编译..." cargo build # 检查编译是否成功 if [ $? -ne 0 ]; then echo "编译失败,请检查错误信息。" exit 1 fi # 获取编译后的二进制文件路径 binary_path=$(cargo metadata --format-version=1 --no-deps | jq -r ''.target_directory'')/debug/$(cargo metadata --format-version=1 --no-deps | jq -r ''.packages[0].targets[] | select(.kind[0]=="bin") | .name'') if [ ! -f "$binary_path" ]; then echo "无法找到编译后的二进制文件。" exit 1 fi # 显示二进制文件大小 echo "编译完成。二进制文件大小:" du -h "$binary_path" # 运行调试版本 echo "运行调试版本..." "$binary_path" # 运行结束 echo "运行结束,已执行清理。"
2.不拥有编译优化,运行结束后清理
bash代码解读复制代码#!/bin/bash # 处理清理操作的函数 cleanup() { echo "执行 cargo clean..." cargo clean } # 捕获 INT 信号(Ctrl+C)和 EXIT 事件 trap cleanup INT EXIT # 正常执行 cargo run echo "执行 cargo run..." cargo run # 当 cargo run 执行完毕或被中断时,触发 cleanup echo "cargo run 结束,已执行清理。"
还是需要跟上面一样增加权限和别名。例如:
ini代码解读复制代码alias brc="~/Soft/VSCode/build_run_clean.sh" 或者 alias rc="~/Soft/VSCode/run_clean.sh"
这样才可以工程文件下使用brc或rc命令,运行结束或者 ctrl+c 中断都可以清理输出。
对整个存放所有Rust的工程文件夹进行清理
bash代码解读复制代码#!/bin/bash # 定义处理单个项目的函数 build_project() { local project_dir="$1" # 检查项目目录是否存在 if [ ! -d "$project_dir" ]; then echo "警告:项目目录 $project_dir 不存在,跳过清理。" return 1 fi # 进入项目目录 cd "$project_dir" || { echo "无法访问项目目录 $project_dir" return 1 } if [ -f "Cargo.toml" ]; then echo "当前$project_dir 异常" else echo "警告:项目目录 $project_dir 中没有 Cargo.toml 文件,跳过清理。" return 1 fi # 执行 cargo clean echo "正在 清理项目:$project_dir" cargo clean # 检查构建是否成功 if [ $? -ne 0 ]; then echo " 清理失败,请检查错误信息。" return 1 else echo "清理成功。" fi # 返回上一级目录 cd - > /dev/null } # 遍历当前目录及其所有后代子目录,查找包含 Cargo.toml 文件的目录 find . -type f -name "Cargo.toml" | while read -r cargo_toml_file; do # 获取包含 Cargo.toml 文件的目录 project_dir=$(dirname "$cargo_toml_file") # 检查 target 目录是否存在 if [ -d "$project_dir/target" ]; then # 清理项目 build_project "$project_dir" else echo "警告:项目目录 $project_dir 中没有 target 目录,跳过清理。" fi done
同样的增加权限和别名,例如: alias cca="~/Soft/VSCode/cargo_clean_all.sh" 这样就可以在存放所有 Rust 项目的工程文件夹目录下运行 cca 命令就可以清除所有工程的编译输出的了,我存放Rust 的文件夹从150G,直接变成了1.6G。 Rust 编译输出真的太恶心的了,希望对你有所帮助。