3

我正在使用cargo,maturinpytest构建一个混合的 Python/Rust 项目。在开发过程中,我经常循环使用以下命令:

$ cargo test -p mypkg --release
$ maturin develop --release
$ python -m pytest --failed-first my_pkg

似乎 cargo 和 maturin 在没有理由的情况下编译依赖项。经过一些实验,我发现如果我运行

  • cargo ...
  • maturin ...
  • cargo ...
  • maturin ...

第二次运行cargoandmaturin将重新编译依赖项,即使我没有手动更改任何源文件。

我没有一个小例子来重现这个,所以我试图用完整的系统来调试它。为此,我想知道 cargo 和/或 maturin 认为哪些文件已过时。一旦我知道这一点,完整的解决方案可能会很明显。

但是,似乎没有我可以传递的标志给我这些信息。 cargo -vv test ...产生很多关于它正在编译什么以及如何编译的输出,但不是为什么。 maturin甚至似乎没有-v可用的标志。

我找到cargo-outdated了,但这似乎与依赖版本有关。

我有两个 Rust 包,每个包有 5-10 个直接依赖项和大约 100 个总依赖项。

如何找出导致cargo/maturin重建依赖项的文件?

4

2 回答 2

5

您可以要求 Cargo 输出与指纹相关的日志信息。对于 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:16:05.493 回答
0

这是我为下一个用户解决的具体问题。

CARGO_LOG环境变量答案有效。它产生了大量的输出

[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更改它添加的标志,我不需要更新我的标志。

这确实意味着当依赖关系发生变化时,我会构建它们两次,但这比每个周期构建两次要好得多。

于 2021-12-03T21:14:11.607 回答