1 个不稳定版本
0.3.0 | 2024年4月19日 |
---|
#487 in 嵌入式开发
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.rs
在 std
下运行,即使对于 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