关于rust:如何处理多个嵌套工作空间的根?

How to deal with multiple nested workspace roots?

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

我有以下项目结构:

1
2
3
4
5
6
7
8
myworkspace
├── project_a
│  └── Cargo.toml
├── project_b
│  └── Cargo.toml
│   └── project_b_dependency
|       └── Cargo.toml
└── Cargo.toml

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

运行cargo build时出现错误,因为工作空间中有一个工作空间。

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

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

这不是"重构为工作空间结构"的重复,这导致外部包装箱导入无法工作,因为我想知道如何处理嵌套的工作空间。


工作空间不能嵌套; 如文档所述:

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

货运工作区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.

嵌套工作空间似乎很难管理,因此
一种可能是更改项目的布局:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.
├── 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中:

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

myworkspace/project_b/Cargo.toml

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

我尝试在您的布局中使用workspace.exclude属性,但没有成功。


我找到一种方法来保留git子模块。

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