我如何让 Cargo 显示哪些文件导致重建?
How do I make Cargo show what files are causing a rebuild?
我正在使用 cargo
、maturin
和 pytest
构建混合 Python/Rust 项目。在开发过程中,我经常循环执行命令:
$ cargo test -p mypkg --release
$ maturin develop --release
$ python -m pytest --failed-first my_pkg
似乎 cargo 和 maturin 在没有理由的情况下正在编译依赖项。经过一些实验,我发现如果我 运行
cargo ...
maturin ...
cargo ...
maturin ...
cargo
和 maturin
的第二个 运行 将重新编译依赖项,即使我没有手动更改任何源文件。
我没有一个小例子来重现这个,所以我试图用完整的系统来调试它。为此,我想知道 cargo and/or maturin 认为哪些文件已过时。一旦我知道了,完整的解决方案可能就很明显了。
但是,似乎没有我可以传递给我该信息的标志。 cargo -vv test ...
会生成大量关于正在编译什么以及如何编译的输出,而不是为什么。 maturin
似乎甚至没有可用的 -v
标志。
我找到了 cargo-outdated
,但这似乎与依赖版本有关。
我有两个 Rust 包,每个包有 5-10 个直接依赖项和大约 100 个总依赖项。
如何找出哪些文件导致 cargo
/maturin
重建依赖关系?
您可以要求 Cargo 输出与 fingerprints 相关的日志记录信息。对于 Cargo 1.56.0,合适的环境变量是 CARGO_LOG=cargo::core::compiler::fingerprint=info
.
举个例子:
% CARGO_LOG=cargo::core::compiler::fingerprint=info cargo build
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
% touch src/main.rs
% CARGO_LOG=cargo::core::compiler::fingerprint=info cargo build
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] stale: changed "/private/tmp/xxx/src/main.rs"
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] (vs) "/private/tmp/xxx/target/debug/.fingerprint/xxx-3af563e7d679143a/dep-bin-xxx"
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] FileTime { seconds: 1638295984, nanos: 344057437 } != FileTime { seconds: 1638296033, nanos: 750100000 }
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] fingerprint error for xxx v0.1.0 (/private/tmp/xxx)/Build/TargetInner { name: "xxx", doc: true, ..: with_path("/private/tmp/xxx/src/main.rs", Edition2021) }
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] err: current filesystem status shows we're outdated
这是下一位用户针对我的特定问题的解决方案。
有效。它产生了很多输出
[2021-11-30T18:29:06Z INFO cargo::core::compiler::fingerprint] err: RUSTFLAGS has changed: previously [], now ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
我很确定 maturin
在构建要由 python 导入的库时添加了这些标志。
有一次,我看到了一种修改 Cargo.toml
以在使用 cargo
构建时添加这些内容的方法。
我的解决方案更简单:我 运行 cargo
测试
cargo test -p mypkg # no --release
以便 cargo
构建和测试调试代码,maturin
/pytest
构建和测试发布代码。标志不一致,但并不重要。如果 maturin
更改了它添加的标志,我不需要更新我的标志。
这确实意味着当依赖项发生变化时,我会构建它们两次,但这比每个周期都构建两次要好得多。
我正在使用 cargo
、maturin
和 pytest
构建混合 Python/Rust 项目。在开发过程中,我经常循环执行命令:
$ cargo test -p mypkg --release
$ maturin develop --release
$ python -m pytest --failed-first my_pkg
似乎 cargo 和 maturin 在没有理由的情况下正在编译依赖项。经过一些实验,我发现如果我 运行
cargo ...
maturin ...
cargo ...
maturin ...
cargo
和 maturin
的第二个 运行 将重新编译依赖项,即使我没有手动更改任何源文件。
我没有一个小例子来重现这个,所以我试图用完整的系统来调试它。为此,我想知道 cargo and/or maturin 认为哪些文件已过时。一旦我知道了,完整的解决方案可能就很明显了。
但是,似乎没有我可以传递给我该信息的标志。 cargo -vv test ...
会生成大量关于正在编译什么以及如何编译的输出,而不是为什么。 maturin
似乎甚至没有可用的 -v
标志。
我找到了 cargo-outdated
,但这似乎与依赖版本有关。
我有两个 Rust 包,每个包有 5-10 个直接依赖项和大约 100 个总依赖项。
如何找出哪些文件导致 cargo
/maturin
重建依赖关系?
您可以要求 Cargo 输出与 fingerprints 相关的日志记录信息。对于 Cargo 1.56.0,合适的环境变量是 CARGO_LOG=cargo::core::compiler::fingerprint=info
.
举个例子:
% CARGO_LOG=cargo::core::compiler::fingerprint=info cargo build
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
% touch src/main.rs
% CARGO_LOG=cargo::core::compiler::fingerprint=info cargo build
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] stale: changed "/private/tmp/xxx/src/main.rs"
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] (vs) "/private/tmp/xxx/target/debug/.fingerprint/xxx-3af563e7d679143a/dep-bin-xxx"
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] FileTime { seconds: 1638295984, nanos: 344057437 } != FileTime { seconds: 1638296033, nanos: 750100000 }
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] fingerprint error for xxx v0.1.0 (/private/tmp/xxx)/Build/TargetInner { name: "xxx", doc: true, ..: with_path("/private/tmp/xxx/src/main.rs", Edition2021) }
[2021-11-30T18:13:54Z INFO cargo::core::compiler::fingerprint] err: current filesystem status shows we're outdated
这是下一位用户针对我的特定问题的解决方案。
[2021-11-30T18:29:06Z INFO cargo::core::compiler::fingerprint] err: RUSTFLAGS has changed: previously [], now ["-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup"]
我很确定 maturin
在构建要由 python 导入的库时添加了这些标志。
有一次,我看到了一种修改 Cargo.toml
以在使用 cargo
构建时添加这些内容的方法。
我的解决方案更简单:我 运行 cargo
测试
cargo test -p mypkg # no --release
以便 cargo
构建和测试调试代码,maturin
/pytest
构建和测试发布代码。标志不一致,但并不重要。如果 maturin
更改了它添加的标志,我不需要更新我的标志。
这确实意味着当依赖项发生变化时,我会构建它们两次,但这比每个周期都构建两次要好得多。