虽然导入
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
吗?如何解决这个问题?
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
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
的基础上。
解析器算法可能会收敛到一个包含两个 当一个依赖项就足够时,复制一个依赖项。例如:
# 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"
。