Rust的工作区无法与Cargo包配合使用吗?

5

我根据这里的教程创建了一个包含多个文件夹的"工作区"。

使用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]

enter image description here

Error message:

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)`

这很奇怪,你确定没有打错字或类似的错误吗? - Netwave
@Netwave:我确定这不是打字错误。我创建了一个新的项目来确认这一点。只需创建一个包含两个包“foo_1”和“foo_2”的工作区。如果这两个包是独立的,那么cargo package将成功运行。但是,一旦你将foo_2放入foo_1的依赖项中,你将收到与我相同的错误消息。 - DennyHiu
@AhmedMasud:它在那儿。它根本没有任何依赖关系。 - DennyHiu
如果 foo_2 是一个库,那么它只能作为依赖项。你需要在 Cargo.toml 文件中添加 [lib] 声明。 :P - Ahmed Masud
1
@AhmedMasud:foo_2是一个库。我将上传工作区结构。 - DennyHiu
显示剩余2条评论
1个回答

4
打包和发布crate需要该crate的所有依赖项也在注册表中可用。对于发布来说,这相对明显,因为消费者也需要能够获取和构建传递依赖项。目前创建tarballs也有同样的限制,因此如果它们不打算发布,则不可能进行。
每当您有一个在单个工作区中拥有许多crate的项目,并希望将它们发布到crates.io上时,您应从没有依赖关系的crate开始,并逐步处理其他crate。
cargo publish -p foo_2
cargo publish -p foo_1

或者,使用cargo-workspaces

cargo workspaces publish

这是一个预期的行为吗?

只要按正确顺序进行,仍然可以在工作区中发布crate,但在打包方面,这是一种限制。当前的行为可能与打包主要是发布的一部分有关,因此这可能会得到改进。

如果是这样,那我为什么还要使用工作区呢?

这与本文无关。工作区的存在主要是为了解决其他问题,例如具有共享依赖项锁定的已编译依赖项的单一源。这种区别在同样的链接中有描述。


所以基本上我需要像 cargo publish 一样逐个“打包”每个项目?如果是这种情况,那么如果我不想发布它怎么办?或者如果它是一个私有项目呢? - DennyHiu
而且,我如何使用cargo package打包foo_1(它依赖于foo_2项目)?我需要将foo_2二进制包引入foo_1中吗? - DennyHiu
回答已澄清。仅使用Cargo目前无法实现。像这样依赖于crate tarballs可能是不寻常的。 - E net4
工作区只能与已发布的项目一起使用吗?我必须将 foo_1foo_2 都发布到 crates.io 才能使其正常工作吗? - DennyHiu
这是我的观点,但工作区的目的不应该是将一个大项目分成更小的部分吗?如果我需要编译每个项目/部分并且还必须将其发布到crates.io,那么这就违背了这个目的。 - DennyHiu
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接