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

时间:2018-04-16 04:58:25

标签: rust rust-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的副本,因为我想知道如何处理嵌套工作区。

3 个答案:

答案 0 :(得分:3)

工作区无法嵌套;作为the docs州:

  

crate可以指定package.workspace或指定[workspace]。   也就是说,一个箱子不能同时是工作空间中的根箱子(包含   [workspace])并且还是另一个工作区的成员箱(包含   package.workspace)。

货物workspace RFC也指明了这一点:

  

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

     
      
  • 工作区只有一个根箱([workspace]Cargo.toml
  •   
  • workspace.members中定义的所有工作区包都指向package.workspace的工作区根目录。
  •   

答案 1 :(得分:2)

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

.
├── 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属性,但没有成功。

答案 2 :(得分:0)

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

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