Rust 开发中编译输出文件大的解决方案

813 阅读3分钟

我的电脑只有256G的硬盘,所以剩下的硬盘空间不太多,Rust 编译出来的文件很大,一个项目恶心到5G 多。我查看Rust占用硬盘达到了150多G。所以一直想怎么优化,或者删除编译资源。我分为三种情况,

  1. 编译的时候输出变小
  2. 运行结束输出清理
  3. 整个存放 Rust 的文件夹进行清理
编译的时候输出变小的 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.编译优化的运行结束,再清理

#!/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.不拥有编译优化,运行结束后清理

#!/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 结束,已执行清理。"

还是需要跟上面一样增加权限和别名。例如:

alias brc="~/Soft/VSCode/build_run_clean.sh" 
或者 
alias rc="~/Soft/VSCode/run_clean.sh"

这样才可以工程文件下使用brc或rc命令,运行结束或者 ctrl+c 中断都可以清理输出。

对整个存放所有Rust的工程文件夹进行清理

#!/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 编译输出真的太恶心的了,希望对你有所帮助。