如何确定我所在的 Rust crate 版本号?

3

有没有一种稳健的方式,也许是在cargo CLI中,来获取crate的版本?

我可以在Cargo.toml上使用grep,但我正在寻找一些不会在6个月内失效的东西。

有更好的方法吗?


1
你需要这个干什么?你尝试过 cargo tree --depth 0 吗? - PitaJ
1
你只需要一个数字(或者字符串,因为数字不能有多个句点)还是能接受一点额外的数据? cargo pkgid 命令会返回 files:///Users/sus/code/project#0.1.0 - Samathingamajig
1
还有 cargo metadata,但它冗长且不适用于当前工作区中的包。 - kmdreko
1
如果您需要在 build.rs 脚本或嵌入式应用程序中使用,可以使用 CARGO_PKG_VERSION 环境变量。 - kmdreko
@Samathingamajig,你应该将其发布为答案,因为它是最直接的,并且需要进行微小的修剪(例如可以使用“cut -d“#”-f2”来完成)。 - kmdreko
2个回答

5
通常获取包或工作区的元数据的方法是通过 cargo metadata 命令,它会生成一个包含工作区包、依赖项、目标等信息的 JSON 输出。但这种方式非常冗长。
如果你不在工作区中,则可以简单地获取第一个包的版本(排除依赖项,使用 jq 进行解析):
> cargo metadata --format-version=1 --no-deps | jq '.packages[0].version'
"0.1.0"

如果你处于一个工作区中,那么就会有多个包(即使排除了依赖项),并且它们似乎是按字母顺序排列的。你需要知道包的名称:

> cargo metadata --format-version=1 --no-deps | jq '.packages[] | select(.name == "PACKAGE_NAME") | .version'
"0.1.0"

1
在使用 jq 时,您可能还想使用 --raw-output 来删除版本号周围的引号。如果由于某种原因无法提取版本号,设置 --exit-status 失败也是一个好主意。另请参阅 jq 手册 - Marcono1234

3
最简单的答案是:
cargo pkgid

这将输出:
files:///Users/sus/code/project#0.1.0

如果你只想要版本部分,你可以将其导入cut(或在你选择的编程语言中自行处理)。
cargo pkgid | cut -d "#" -f2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接