Cargo 包不适用于 Rust 的工作区?

Cargo package doesn't work with Rust's workspace?

我在 the tutorial I read here

之后创建了一个包含多个文件夹的“工作区”

它 运行 与 cargo runcargo 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.