1 个不稳定版本
0.1.0 | 2022年1月7日 |
---|
#559 in Cargo 插件
30KB
547 行
cargo-outdir
一个 cargo 子命令,用于从构建脚本中获取 $OUT_DIR
变量。
这对于检查自动生成的代码输出非常有用,例如 bindgen 或 parol。
这可以看作是对 cargo metadata
的扩展,但它要求 cargo check
成功。
如果 cargo check
成功,则此命令也会成功(并给出相同的输出)。
由于 cargo check
最近的变化,此 不会使缓存的输出无效,因此,只有在需要时才会重新运行构建脚本 :)
这是对 rust-lang/cargo#7546 的有效解决方案
示例
$cargo out
假设你的当前包名为 current-crate
,这将输出类似的内容
current-crate /Users/techcable/git/current-crate/target/debug/build/current-crate-82e5bb1cb82b68a7/out
或者,要省略名称,可以使用 --no-names
。这在 shell 脚本中很有用,例如 $(cargo out --no-names)
此命令适用于任何包名(只要它有一个 build.rs
文件)。
$cargo out syn indexmap
syn /Users/techcable/git/current-crate/target/debug/build/syn-2bbc24a01fc81726/out
indexmap /Users/techcable/git/current-crate/target/debug/build/indexmap-376e9f234cf30ee8/out
这些将按照命令行上指定的顺序输出,由换行符分隔。
如果包没有出目录(out dir),输出将正好是 "",退出代码将是 2
。
您可能还想考虑使用json输出。
$cargo out --json --全部
{
"syn": "/Users/techcable/git/current-crate/target/debug/build/syn-2bbc24a01fc81726/out",
"indexmap": "/Users/techcable/git/current-crate/target/debug/build/indexmap-376e9f234cf30ee8/out",
"libc:0.1.12": null,
"libc:0.2.109": "/Users/techcable/git/current-crate/target/debug/build/libc-1c95e0902b980b08/out",
// other_crates here
}
如果包没有$OUT_DIR(因为它们没有构建脚本),则指定键的值将是null。
这可以与jq一起用于脚本中的简单处理:)
如果有多个包具有相同的名称,则将添加版本。更准确地说,json键将是用于区分它们的所需最小cargo pkgid
。这实际上是非常难做到的:)
工作原理
这会运行cargo check --message-format=json
并仅提取必要的信息。
从历史上看,这一直是IDE的问题,intellij-rust和rust-analyzer都难以支持。
由于编译器最近的变化,这将为所有具有的包始终输出正确的$OUT_DIR
变量。
然而,最近对cargo check
的更改使得这成为可能。仍然是这样的:)
依赖项
~2.5–3.5MB
~66K SLoC