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

Oli*_*ier 6 rust rust-cargo

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

我有以下项目结构:

myworkspace
??? project_a
?   ??? Cargo.toml
??? project_b
?   ??? Cargo.toml
?   ??? project_b_dependency
|       ??? Cargo.toml
??? Cargo.toml
Run Code Online (Sandbox Code Playgroud)

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

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

$ cargo build
error: multiple workspace roots found in the same workspace:
  /myworkspace
  /myworkspace/project_b/project_b_dependency
Run Code Online (Sandbox Code Playgroud)

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

这不是重构到工作区结构导致 extern crate 导入不起作用的副本,因为我想知道如何处理嵌套的工作区。

att*_*ona 5

嵌套工作区似乎很难管理,因此\n不可能更改项目的布局:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 myworkspace\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.lock\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 project_a\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 project_b\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.rs\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 project_b_dependency\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.rs\n
Run Code Online (Sandbox Code Playgroud)\n\n

myworkspace/Cargo.toml

\n\n
[workspace]\nmembers= ["project_a", "project_b"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

myworkspace/project_b/Cargo.toml

\n\n
[dependencies]\nproject_b_dependency = {path = "../../project_b_dependency"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n


lje*_*drz 5

工作区不能嵌套;正如文档所述

板条箱可以指定 package.workspace 或指定[workspace]. 也就是说,一个 crate 不能既是工作区(包含[workspace])中的根 crate 又是另一个工作区(包含 package.workspace的成员 crate

Cargo工作区 RFC还指定了这一点:

如果这两个属性成立,则工作区有效:

  • 一个工作区只有一个根 crate(带有[workspace]in Cargo.toml
  • 中定义的所有工作区 crate 都workspace.members指向带有package.workspace.