Cargo 包不适用于 Rust 的工作区?
Cargo package doesn't work with Rust's workspace?
之后创建了一个包含多个文件夹的“工作区”
它 运行 与 cargo run
或 cargo build
成功
如果所有包都相互独立,cargo package
将 运行 成功。但是一旦一个包依赖于另一个包,cargo package
就会失败。
显示:no matching package named "foo_2" found. location searched: registry "crates-io"
。这很奇怪,因为我专门在依赖项上添加了一个本地路径。
这是有意为之的行为吗?如果是这样,那我为什么还要为工作空间烦恼呢?
根Cargo.toml
[workspace]
members = [
"foo_1",
"foo_2",
]
foo_1/Cargo.toml
[package]
name = "foo_1"
version = "0.1.0"
edition = "2021"
# error here. It can't found the foo_2 package.
[dependencies]
foo_2 = { path = "../foo_2", version = "0.1.0" }
foo_2/Cargo.toml
[package]
name = "foo_2"
version = "0.1.0"
edition = "2021"
[dependencies]
错误信息:
PS E:\Works\Experimentals\rust-workspace> cargo package --workspace
warning: manifest has no description, license, license-file, documentation, homepage or repository.
See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.
Packaging foo_1 v0.1.0 (E:\Works\Experimentals\rust-workspace\foo_1)
Verifying foo_1 v0.1.0 (E:\Works\Experimentals\rust-workspace\foo_1)
Updating crates.io index
error: failed to verify package tarball
Caused by:
no matching package named `foo_2` found
location searched: registry `crates-io`
required by package `foo_1 v0.1.0 (E:\Works\Experimentals\rust-workspace\target\package\foo_1-0.1.0)`
打包和发布 crate要求所述 crate 的所有依赖项 也可在注册表中使用。对于发布,这是相对明显的,因为消费者还需要能够获取和构建传递依赖项。目前创建 tarball 也恰好有相同的限制,所以如果它们不打算发布是不可能的。
每当您在一个工作区中有一个包含许多 crate 的项目并希望在 crates.io 上发布它们时,您将从没有依赖项的 crate 开始,然后逐步完成其他 crate。
cargo publish -p foo_2
cargo publish -p foo_1
或者,使用 cargo-workspaces
:
cargo workspaces publish
Is this an intended behavior?
只要按正确的顺序完成,仍然可以在工作区中发布 crate。对于包装,这是撰写本文时的限制。当前的行为可能与包装主要是发布的一部分有关,因此这可能可能得到改进。
If so, then why should I bother with workspace at all?
与这里的问题无关。工作区的存在主要是为了解决其他问题,例如拥有一个带有共享依赖锁的已编译依赖源。这个区别就是described in that same link.
它 运行 与 cargo run
或 cargo build
如果所有包都相互独立,cargo package
将 运行 成功。但是一旦一个包依赖于另一个包,cargo package
就会失败。
显示:no matching package named "foo_2" found. location searched: registry "crates-io"
。这很奇怪,因为我专门在依赖项上添加了一个本地路径。
这是有意为之的行为吗?如果是这样,那我为什么还要为工作空间烦恼呢?
根Cargo.toml
[workspace]
members = [
"foo_1",
"foo_2",
]
foo_1/Cargo.toml
[package]
name = "foo_1"
version = "0.1.0"
edition = "2021"
# error here. It can't found the foo_2 package.
[dependencies]
foo_2 = { path = "../foo_2", version = "0.1.0" }
foo_2/Cargo.toml
[package]
name = "foo_2"
version = "0.1.0"
edition = "2021"
[dependencies]
错误信息:
PS E:\Works\Experimentals\rust-workspace> cargo package --workspace
warning: manifest has no description, license, license-file, documentation, homepage or repository.
See https://doc.rust-lang.org/cargo/reference/manifest.html#package-metadata for more info.
Packaging foo_1 v0.1.0 (E:\Works\Experimentals\rust-workspace\foo_1)
Verifying foo_1 v0.1.0 (E:\Works\Experimentals\rust-workspace\foo_1)
Updating crates.io index
error: failed to verify package tarball
Caused by:
no matching package named `foo_2` found
location searched: registry `crates-io`
required by package `foo_1 v0.1.0 (E:\Works\Experimentals\rust-workspace\target\package\foo_1-0.1.0)`
打包和发布 crate要求所述 crate 的所有依赖项 也可在注册表中使用。对于发布,这是相对明显的,因为消费者还需要能够获取和构建传递依赖项。目前创建 tarball 也恰好有相同的限制,所以如果它们不打算发布是不可能的。
每当您在一个工作区中有一个包含许多 crate 的项目并希望在 crates.io 上发布它们时,您将从没有依赖项的 crate 开始,然后逐步完成其他 crate。
cargo publish -p foo_2
cargo publish -p foo_1
或者,使用 cargo-workspaces
:
cargo workspaces publish
Is this an intended behavior?
只要按正确的顺序完成,仍然可以在工作区中发布 crate。对于包装,这是撰写本文时的限制。当前的行为可能与包装主要是发布的一部分有关,因此这可能可能得到改进。
If so, then why should I bother with workspace at all?
与这里的问题无关。工作区的存在主要是为了解决其他问题,例如拥有一个带有共享依赖锁的已编译依赖源。这个区别就是described in that same link.