我的工作区是这样的:
workspace
|--other_crate <== existing crate relying on tokio
|-- Cargo.toml
|--my_crate <== this is a new crate called using "cargo new --lib"
|-- Cargo.toml
|--Cargo.lock
|--Cargo.toml
我想从Cargo中添加这个依赖项。锁进我的新板条箱:
[[package]]
name = "tokio"
version = "1.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d0183f6f6001549ab68f8c7585093bb732beefbcf6d23a10b9b95c73a1dd49"
dependencies = [
...
]
我希望my_crate总是依赖于相同的tokio版本作为other_crate,什么是最好的方法来做到这一点?我猜是货物。Lock是解决这个问题的解决方案,但是关于如何做到这一点的文档并不多。换句话说,在my_crate/Cargo.toml:
中是否有这样的解决方案?...
[dependencies]
tokio = {// refer to Cargo.lock's tokio entry and use it}
...
目前,我只是手动查找货物。锁定条目并手动复制版本。然而,如果我有N个箱子依赖于相同的条目,确保有版本一致性(无论何时Cargo。锁需要更新)将是繁重的工作…
我觉得这里有一些误解。
首先,Cargo.toml
是您的包的权威描述。Cargo.lock
纯粹是补充性的。因此不存在遵从后者的机制;如果可以,则会有一个循环逻辑,其中.toml
依赖于lockfile中的某些内容,但lockfile需要.toml
才能工作。想象一下,如果您想在您的场景中重新生成lockfile,那么就没有tokio依赖应该是哪个版本的基础了。
第二,Cargo.lock
已经确保兼容依赖项使用单个版本。如果一个crate依赖于tokio 1.12,而另一个依赖于1.14,那么Cargo.lock
将只包含一个tokio 1。与两者兼容的X项。两个crate可以有完全独立的依赖版本,因此在Cargo.lock
中有两个tokio条目,但前提是它们不兼容(0.1 vs 1)。X vs . X).
第三,没有办法依赖另一个crate的依赖项。它们不被认为是用于确定破坏性更改的crate公共接口的一部分(当然,除非它们是公开暴露的)。一个crate应该可以自由地更新内部依赖,而不用担心破坏其他依赖。
也就是说,有一种机制可以实现这一点:工作空间依赖关系。在工作空间中,您可以通过将crate放在根工作空间的Cargo.toml
:
# workspace/Cargo.toml
[workspace.dependencies]
tokio = { version = "1.14.1" }
# workspace/other_crate/Cargo.toml and
# workspace/my_crate/Cargo.toml
[dependencies]
tokio = { workspace = true }