#cargo-subcommand #cargo #subcommand #cargo-check #cargo-metadata #env-var #out-dir

app cargo-outdir

一个 cargo 子命令,用于从构建脚本中获取 $OUT_DIR 环境变量

1 个不稳定版本

0.1.0 2022年1月7日

#559 in Cargo 插件

MIT/Apache

30KB
547

cargo-outdir crates.io

一个 cargo 子命令,用于从构建脚本中获取 $OUT_DIR 变量

这对于检查自动生成的代码输出非常有用,例如 bindgenparol

这可以看作是对 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-rustrust-analyzer都难以支持。

由于编译器最近的变化,这将为所有具有的包始终输出正确的$OUT_DIR变量

然而,最近对cargo check的更改使得这成为可能。仍然是这样的:)

依赖项

~2.5–3.5MB
~66K SLoC