#semver #git #git-version #build-script #no-std

no-std build git-tags-semver

从注释的git标签中提取SemVer版本信息的工具

1 个不稳定版本

0.3.0 2024年4月19日

#487 in 嵌入式开发

OLFL-1.3

24KB
238 代码行

git-tags-semver

从注释的git标签中提取SemVer版本信息的工具 此包允许从格式为"vX.Y.Z"的注释git标签中提取SemVer版本信息。它用于build.rs构建脚本中。有关使用详细信息,请参阅API文档。

此crate旨在调用并解析git describe命令。假设该仓库使用格式为"vX.Y.Z"或"vX.Y.Z-rc"的注释git标签。例如,1.0.0发布候选分支的第一个提交应该标记为"v1.0.0-rc",实际的1.0.0发布应该标记为"v1.0.0"。此信息需要在编译时提取,因此需要在build.rs中完成。由于build.rs是在crate所在的目录中运行的,因此您的项目本身应包含该build.rs,即它不应在git子模块或项目的依赖项中完成。以下build.rs将版本信息写入当前OUT_DIR目录中的version.rs,该目录是构建脚本"所有输出和中间工件应放置的文件夹"

use std::env;
use std::fs;
use std::path::Path;
use std::process::Command;

fn main() {
    // Tell Cargo that if the given file changes, to rerun this build script (adjust the path
    // to the .git directory accordingly if required, e.g. when the crate is in a workspace)
    println!("cargo:rerun-if-changed=.git/index");
    println!("cargo:rerun-if-changed=.git/HEAD");
    println!("cargo:rerun-if-changed=.git/logs/HEAD");
    println!("cargo:rerun-if-changed=build.rs");

    // Extract the version information and generate the corresponding code
    let out = git_tags_semver::generate_version_file().unwrap();

    // Write the generated version information code to version.rs in the OUT_DIR directory
    let out_dir = env::var_os("OUT_DIR").unwrap();
    let dest_path = Path::new(&out_dir).join("version.rs");
    fs::write(&dest_path, &out).unwrap();

    // Touch build.rs to force recompilation on every workspace build. This may be desirable
    // because it ensures that the information is guaranteed to be up-to-date. On the other
    // hand, it may slow down your development process a tiny little bit because it enforces
    // a rebuild all the time. For example, your crate will be rebuilt before each `cargo run`
    // which does not happen normally (if the crate was built before, it can normally be run
    // immediately).
    Command::new("touch")
        .args(&["build.rs"])
        .output()
        .expect("Could not touch build.rs!");

}

之后,<OUT_DIR>/version.rs包含一个pub const GitVersion<'static>。具体来说,该文件看起来像这样

pub const VERSION: git_tags_semver::GitVersion<'static> = git_tags_semver::GitVersion {
    semver: Some(git_tags_semver::SemanticVersion {
        major: 1,
        minor: 0,
        patch: 0,
        rc: false,
        commits: 0
    }),
    hash: [
        0x12,
        0x34,
        0xab,
        0xcd,
    ],
    dirty: false,
    git_string: "v1.0.0-00-g1234abcd"
};

要在您的应用程序中使用它,您可以像这样包含生成的代码

include!(concat!(env!("OUT_DIR"), "/version.rs"));

fn main() {
    println!("{:?}", VERSION);
}

Cargo.toml / 功能门

此工具特别设计用于在 no_std 环境中使用,例如裸机固件。因此,它通常是 no_std(类型定义),但在提取和将版本信息写入中间文件时,需要标准库(并且 build.rsstd 下运行,即使对于 no_std 包)。因此,需要在 "build" 功能中启用标准库的使用,以便在 build.rs 中启用所需的部分。所以,对于一个 no_std 包,您需要将其作为依赖项添加两次,您的 Cargo.toml 中的相应部分可能如下所示

[dependencies]
git-tags-semver = { version = "1.0.0" }

[build-dependencies]
git-tags-semver = { version = "1.0.0", features = ["build"] }

请注意,这还需要为您的项目使用 功能解析器版本 2,这是 自 Rust 2021 版本以来的默认版本,或者可以在您的 Cargo.toml 中指定(如果使用工作空间,必须在顶层/工作空间 Cargo.toml 中执行此操作)。

许可证

开放物流基金会许可证版本 1.3,2023 年 1 月
请参阅顶层目录中的 LICENSE 文件。

联系方式

弗劳恩霍夫 IML 嵌入式 Rust 团队 - [email protected]

依赖项

~0–495KB