• 如何在Rust二进制文件中添加版本信息?
  • 发布于 2个月前
  • 174 热度
    0 评论
我们想在Rust二进制文件中添加版本信息,像这样:
Version:标记项目的版本,如v0.1.0。
Commit:标记提交的哈希值,如:78848d8b84b60c9592d41970a9db99a37e8d2e9e
Date:标记它构建的日期,如2023-10-14T06:00:20Z

如何添加这些信息?让我们想一下。简单地说,我们可以将这些信息作为静态变量写在配置文件中。
static version: String = "v0.1.0";
static commit: String = "78848d8b84b60c9592d41970a9db99a37e8d2e9e";
static date: String = "2023-10-14T06:00:20Z";
当然,这是可行的。但这有点愚蠢,每次当我们做一个新的版本时都需要手动更新配置。我们能在运行building时生成它吗?然后我们只需要创建一个新标签,编译器就会自动处理这些信息。听起来不错。但是,怎么做呢?

Cargo支持build脚本,在根目录下创建build.rs文件,它可以为Cargo构建进度做一些集成。Rust宏env!在编译时将某些环境变量导出到程序中。
let version = env!("CARGO_PKG_VERSION");
也许我们可以用这两个功能来实现我们想要的,让我们试一试。

首先是version,从Cargo.toml中读取版本信息:
// src/main.rs
// 堆代码 duidaima.com
static VERSION: &'static str = env!("CARGO_PKG_VERSION");

fn main() {
    println!("Hello, world!");
    println!("version: {}", VERSION);
}

编译和运行它:
Hello, world!
version: 0.1.0
接下来,让我们尝试使用build.rs去设置更多的信息。在项目根目录下创建build.rs文件,写入如下代码:
// build.rs
fn main() {
    println!("cargo:rustc-env=GIT_VERSION={}", "v0.1.0");
    println!("cargo:rustc-env=GIT_COMMIT={}", "78848d8b84b60c9592d41970a9db99a37e8d2e9e");
    println!("cargo:rustc-env=GIT_DATE={}", "2023-10-14T06:00:20Z");
}
在src/main.rs中使用这些环境变量:
static VERSION: &'static str = env!("GIT_VERSION");
static COMMIT: &'static str = env!("GIT_COMMIT");
static DATE: &'static str = env!("GIT_DATE");

fn main() {
    println!("Hello, world!");
    println!("version: {}", VERSION);
    println!("commit: {}", COMMIT);
    println!("date: {}", DATE);
}
编译和运行它:
Hello, world!
version: v0.1.0
commit: 78848d8b84b60c9592d41970a9db99a37e8d2e9e
date: 2023-02-19T20:20:20Z
接下来,让我们尝试使用build.rs读取git信息。

首先,让我们创建一个新的git标签:
git tag -a v0.1.2 -m 'new version'
然后,编写build.rs:
// build.rs
// 堆代码 duidaima.com
use chrono::{DateTime, Utc};
use std::process::Command;

fn main() {
    let output = Command::new("git")
        .args(["describe", "--tags", "--abbrev=0"])
        .output()
        .unwrap();
    let git_tag = String::from_utf8(output.stdout).unwrap();
    println!("cargo:rustc-env=GIT_VERSION={}", git_tag);

    let output = Command::new("git")
        .args(["rev-parse", "HEAD"])
        .output()
        .unwrap();
    let git_commit = String::from_utf8(output.stdout).unwrap();
    println!("cargo:rustc-env=GIT_COMMIT={}", git_commit);

    let now: DateTime<Utc> = Utc::now();
    let build_date = now.to_rfc3339();
    println!("cargo:rustc-env=GIT_DATE={}", build_date);
}
我们需要chrono格式化日期,所以,我们需要把它添加到Cargo.toml:
[build-dependencies]
chrono = "0.4.23"
编译和运行它:
Hello, world!
version: 
commit: HEAD
date: 2023-10-14T06:00:50.180122+00:00
这正是我们想要的!

用户评论