如何使用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
作为子模块保存在源代码控制中。
这不是Refactoring to workspace structure causes extern crate imports to not work的重复,因为我想知道如何处理嵌套的x1e。
4条答案
按热度按时间jslywgbw1#
工作区不能嵌套;正如docs所说:
一个crate可以指定package.workspace或者指定
[workspace]
。也就是说,一个crate不能同时是一个工作区的根crate(包含[workspace]
)和另一个工作区的成员crate(包含package.workspace
)。Cargo workspace RFC还指定了以下内容:
如果以下两个属性成立,则工作区有效:
*一个工作区只有一个根crate(
Cargo.toml
中有[workspace]
的那个)。workspace.members
中定义的所有工作区crate都指向带有package.workspace
的工作区根。pgvzfuti2#
看起来嵌套的布局很难管理,所以一种可能性是更改项目的布局:
在
myworkspace/Cargo.toml
中:单位:
myworkspace/project_b/Cargo.toml
我尝试使用
workspace.exclude
属性与您的布局,但没有成功。tzdcorbm3#
我找到了一个保持git子模块的方法。
1.将子模块项目的工作区成员添加到父Cargo.toml
1.移除子模块项目的Cargo.toml
1.使用submodule_name/crate path定义依赖关系。
slhcrj9b4#
我已经找到了一种方法来完成这个任务,但它需要您引入的子模块的合作,以遵循类似的模式。
我这里的问题是,我有一个lib
bigger_lib
,它在repo中作为一个工作区,然后是一个common_lib
,它是my_app
和bigger_lib
的依赖项(不是具体的问题是问什么,但我试图解决什么)。这些都是我们目前许多小工作空间仓库的代表,都在git上。像这样的布局
内容如下所示
所有其他
Cargo.toml
文件与您所期望的没有特别的不同。有了这个图案,
bigger_lib::common_lib::MyStruct
)