代码之家  ›  专栏  ›  技术社区  ›  Phoenix

重构工作区结构会导致外部板条箱导入无法工作

  •  0
  • Phoenix  · 技术社区  · 6 年前

    我需要我的项目的不同部分来使用相同extern板条箱的不同版本,所以我正在重构我的Rust项目,通过工作区系统将其划分为多个包,使用 this 作为指导。这样做会导致我所有的酒吧外部板条箱导入都无法工作。

    这篇文章与我最近创建并删除的文章非常相似——这个版本包含一个最小的、完整的、可验证的示例。

    这是我的项目结构

    workspace_test/
      root/
        src/
          main.rs
        Cargo.toml
      Cargo.toml
    

    workspace\u测试/货物。汤姆:

    [package]
    name = "workspace_test"
    version = "0.1.0"
    authors = ["Phoenix <kahlo.phoenix@gmail.com>"]
    
    [workspace]
    members = [
        "root"
    ]
    
    [[bin]]
    name = "root"
    path = "root/src/main.rs"
    

    workspace\u测试/根/货物。汤姆:

    [package]
    name = "root"
    version = "0.1.0"
    authors = ["Phoenix <kahlo.phoenix@gmail.com>"]
    
    [dependencies]
    time = "0.1"
    

    workspace\u test/root/src/main。卢比:

    pub extern crate time;
    
    fn main() {
        println!("Hello, world!");
    }
    

    This is also on github ,因此可以很容易地进行克隆 cargo run 'd。

    这是错误:

    error[E0463]: can't find crate for `time`
     --> root/src/main.rs:1:1
      |
    1 | pub extern crate time;
      | ^^^^^^^^^^^^^^^^^^^^^^ can't find crate
    
    error: aborting due to previous error
    
    error: Could not compile `workspace_test`.
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Tim Diekmann suresh madaparthi    6 年前

    在里面 workspace_test/Cargo.toml 您使用二进制文件创建一个包 root .如果您执行 cargo run ,它运行 main.rs ,但由于您没有在此清单文件中声明依赖项,因此发生了错误。依赖关系仅在中指定 workspace_test/root/Cargo.toml ,此时不使用。

    我假设您想使用RFC建议的工作区。您可以使用虚拟清单创建工作区,该工作区既不能指定 [package] 也没有 [[bin]] ,所以只需移除它们。 workspace\u测试/货物。汤姆 现在看起来像这样:

    [workspace]
    members = [
        "root"
    ]
    

    如果只有一个可执行文件,现在可以传递包: -p/--package

    cargo run -p root
    

    或手动指定清单路径:

    cargo run --manifest-path root/Cargo.toml
    

    如果 root/Cargo.toml 包含多个目标,您只需附加 --lib --bin 像往常一样标记。E、 g.这将执行 abc -中指定的二进制文件 workspace\u测试/根/货物。汤姆 :

    cargo run -p root --bin abc