解析器无法在货物发布中选择依赖版本

问题描述 投票:0回答:1

虽然导入

termimad 0.25.4
的程序可以编译,但似乎无法用
cargo publish
发布,因为选择了两个版本的
crossterm
导入。

termimad 0.25.4
在其 Cargo.toml 中声明这些进口

[package] edition = "2021" resolver = "1" [dependencies] coolor = { version="0.6.1", features=["crossterm"] } crossterm = "=0.23.2"

coolor 0.6.1

 在其 Cargo.toml
中导入
crossterm

[dependencies] crossterm = { optional=true, version=">=0.23.2" }
所以在我看来,termimad 应该使用 

crossterm 0.23.2

,而酷用户可以使用从 
0.23.2
 开始的任何版本。

解析器不会只为 termimad 选择

crossterm 0.23.2

 吗?如何解决这个问题?


附录:导入 termimad 0.25.4 并失败的程序的 Cargo.toml

cargo publish

:

[package] name = "dysk" version = "2.8.2" authors = ["dystroy <[email protected]>"] edition = "2018" keywords = ["linux", "filesystem", "fs", "lfs", "disk"] license = "MIT" categories = ["filesystem", "command-line-utilities"] description = "give information on mounted filesystems" repository = "https://github.com/Canop/dysk" homepage = "https://dystroy.org/dysk" documentation = "https://dystroy.org/dysk" readme = "README.md" rust-version = "1.70" exclude = ["website", "dysk*.zip"] build = "build.rs" resolver = "1" [dependencies] dysk-cli = { version = "2.8.2", path = "cli" } # beware: version is also in build dependencies [build-dependencies] clap = { version = "4.4", features = ["derive", "cargo"] } clap_complete = "4.4" clap_mangen = "0.2.12" dysk-cli = { version = "2.8.2", path = "cli" } serde = { version = "1.0", features = ["derive"] } toml = "0.7" [profile.release] strip = true
    
rust rust-cargo
1个回答
0
投票
问题

如果不限制,cargo 倾向于使用最新版本的依赖项。

crossterm

的语义版本被表述为
>=0.23.2
,这意味着使用最新的,如果最新的是
0.23.2
或任何大于它的值,目前是0.27.0。

如果我们尝试将其限制在父板条箱上;就像将

crossterm = "=0.23.2"

 设置为 
termimad
 一样,直观上我们可能期望解析器会选择一个常见的可能版本来防止重复,但事实并非如此,除非它们是 
SemVer-Compatible

由于

crossterm

coolor
中的
termimad
的两个指定版本都是
SemVer-In兼容,那么解析器将解析2个不同的板条箱,[email protected]
[email protected]
,这将导致
termimad
coolor之间的冲突
crossterm
 的基础上。


参考

这种情况在cargo book中被描述为

意外的依赖重复参考

引用参考文献:

解析器算法可能会收敛到一个包含两个 当一个依赖项就足够时,复制一个依赖项。例如:

# Package A [dependencies] rand = "0.7" # Package B [dependencies] rand = ">=0.6"
在这个例子中,Cargo 可能会构建 rand 箱的两个副本,甚至
尽管 0.7.3 版本的单个副本就可以满足所有要求。

这是因为解析器的算法倾向于构建最新的 B 包的 rand 可用版本,当时为 0.8.5 这篇文章与 A 包的规范不兼容。 解析器的算法当前不尝试“重复数据删除” 在这种情况下.


解决方案

构建:手动或使用cargo.lock

更新
cargo update -p [email protected] --precise 0.23.2
将使事物彼此兼容并防止重复,但这不是发布案例的解决方案。每个用户都需要管理板条箱不希望发生的事情。

发布:更新版本要求,考虑到cargo book中的建议,有关此问题的一些主题:

...

    避免过于宽泛的版本要求。例如,
  • >=2.0.0
     可以拉入任何 >SemVer 不兼容的版本,例如版本 
    5.0.0
    ,这可能会导致将来的 > 构建损坏。
  • 尽可能避免版本要求过于狭窄。例如,如果您指定了像
  • bar="~1.3"
     这样的波形符要求,而另一个包指定了 
    bar="1.4"
     的要求,则即使次要版本应该兼容,这也将无法解决。
  • 尝试使依赖项版本与您的库所需的实际最低版本保持最新。例如,如果您的要求>
  • bar="1.0.12"
    ,
    然后在未来的版本中,您开始使用 
    1.1.0
     >“bar”版本中添加的新功能,将您的依赖项要求更新为 
    bar="1.1.0"
...

© www.soinside.com 2019 - 2024. All rights reserved.