【问题标题】:Why does cargo use a specific dependency version?为什么 cargo 使用特定的依赖版本?
【发布时间】:2022-08-21 16:52:07
【问题描述】:

当尝试遵循pathfinder 库的说明时,即:

cd demo/native
cargo run --release

由于编译依赖项winit 0.19.3 版,我收到错误:

error[E0308]: mismatched types
   --> /Users/yairchu/.cargo/registry/src/github.com-1ecc6299db9ec823/winit-0.19.3/src/platform/macos/view.rs:209:9
    |
205 | extern fn has_marked_text(this: &Object, _sel: Sel) -> BOOL {
    |                                                        ---- expected `bool` because of return type
...
209 |         (marked_text.length() > 0) as i8
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found `i8`

如果我尝试通过更改Cargo.toml 将使用的版本更改为最新版本(这对我来说很好):

--- a/demo/native/Cargo.toml
+++ b/demo/native/Cargo.toml
@@ -43,7 +43,7 @@ rev = "f3df871ac8c3926fe9106d86a3e51e20aa50d3cc"

 [dependencies.winit]
-version = "<0.19.4" # 0.19.4 causes build errors https://github.com/rust-windowing/winit/pull/1105
+version = "0.27.2"

我仍然得到同样的错误!

有趣的是,我在 cargo 的输出中注意到了这一点:

   Compiling winit v0.19.3
   Compiling winit v0.27.2

它现在似乎正在构建我指定的版本和旧版本。

我迷路了。同样使用--verbose 也无助于阐明cargo 选择构建这种特定依赖关系的原因。

  • 是否在一个可执行文件中使用同一库的两个版本?
  • 我怎样才能知道为什么 cargo 选择构建这个库? (以便我可以将其更新为工作版本)

谢谢!锈菜鸟

【问题讨论】:

  • 另一个包可能是另一个包间接需要的
  • @mousetail 我们有什么方法可以找出它需要哪个包?
  • @yairchu cargo tree,特别是 -d,它在顶部列出了所有重复的包(具有不同版本),然后显示了它们的依赖树。
  • @Masklinn 这很有帮助! cargo tree 表明该库被另一个依赖项“surfman”使用。那么我的理解是否正确,可以同时使用多个版本的库?
  • “那么我的理解是正确的,可以同时使用多个版本的库吗?”是的,只要两者不互动就可以了。从 1.31 开始,通过重命名功能,您实际上可以使用不同的版本多次依赖同一个 crate。这可能很有用,例如您想使用一个版本的依赖项,但您自己的一个依赖项使用来自其他版本的类型。

标签: rust dependency-management rust-cargo


【解决方案1】:

如何找出 cargo 选择构建这个库的原因?

cargo tree 详细说明了每个子依赖是谁的依赖。

它是否在一个可执行文件中使用同一个库的两个版本?

这是。

您可以依赖同一个 crate 的不同版本。如果您想使用一个版本的依赖项,但您自己的一个依赖项使用另一个版本,这会很有用。

(感谢@Masklinn 在 cmets 中的答案!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多