如何处理多个嵌套的工作空间根?

How to deal with multiple nested workspace roots?

如何使用 Cargo 拥有多个嵌套工作区?

我有以下项目结构:

myworkspace
├── project_a
│   └── Cargo.toml
├── project_b
│   └── Cargo.toml
│   └── project_b_dependency
|       └── Cargo.toml
└── Cargo.toml

其中 project_b_dependency 是一个大库,它是一个 git 子模块,它本身有一个工作区。

我在 运行 cargo build 时出错,因为工作区中有工作区。

$ cargo build
error: multiple workspace roots found in the same workspace:
  /myworkspace
  /myworkspace/project_b/project_b_dependency

有简单的解决方法吗?我想将 project_b_dependency 作为子模块保留在源代码管理中。

这不是 的副本,因为我想知道如何处理嵌套工作区。

嵌套的工作区似乎很难管理,所以 一种可能性是更改项目的布局:

.
├── myworkspace
│   ├── Cargo.lock
│   ├── Cargo.toml
│   ├── project_a
│   │   ├── Cargo.toml
│   │   └── src
│   │       └── lib.rs
│   ├── project_b
│   │   ├── Cargo.toml
│   │   └── src
│   │       └── lib.rs
│   └── src
│       └── main.rs
└── project_b_dependency
    ├── Cargo.toml
    └── src
        └── lib.rs

myworkspace/Cargo.toml中:

[workspace]
members= ["project_a", "project_b"]

myworkspace/project_b/Cargo.toml

[dependencies]
project_b_dependency = {path = "../../project_b_dependency"}

我已经尝试将 workspace.exclude 属性 用于您的布局,但没有成功。

工作区不能嵌套;作为 the docs 状态:

A crate may either specify package.workspace or specify [workspace]. That is, a crate cannot both be a root crate in a workspace (contain [workspace]) and also be a member crate of another workspace (contain package.workspace).

Cargo workspace RFC 还指定了这个:

A workspace is valid if these two properties hold:

  • A workspace has only one root crate (that with [workspace] in Cargo.toml).
  • All workspace crates defined in workspace.members point back to the workspace root with package.workspace.

我找到了保留 git 子模块的方法。

  1. 将子模块项目的工作区成员添加到父项目Cargo.toml
  2. 删除子模块项目的 Cargo.toml
  3. 使用submodule_name/crate路径定义依赖。