You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Git子模块的嵌套Rust Workspace中引用Crate?

问题

我想使用一个仅分发可执行文件、未发布为crate的外部Rust项目的内部功能,该项目以Git子模块形式存在,目录结构如下:

/third-party (git-submodule)
  /crates
    /some_lib
  Cargo.toml (workspace)
/my-project
  Cargo.toml
Cargo.toml (workspace)

我执行了以下操作:

cd third-party && cargo build && cd ..
cargo build

并在本地项目的Cargo.toml中添加依赖:

some_lib = { path = "../third-party/crates/some_lib" }

但Cargo报错:

Caused by:
  failed to load manifest for dependency `deno_runtime`

Caused by:
  failed to parse manifest at `/home/username/development/project/deno/runtime/Cargo.toml`

Caused by:
  error inheriting `edition` from workspace root manifest's `workspace.package.edition`

Caused by:
  `workspace.package.edition` was not defined

请问是否只能通过fork该项目并发布所需功能的crate来解决问题?

解决方案

不需要非得fork项目,有几个更直接的解决办法:

  • 补全第三方子模块的workspace配置
    打开third-party/Cargo.toml,在[workspace]区块下方添加[workspace.package]并指定对应版本的edition,示例:

    [workspace]
    members = ["crates/*"]
    
    [workspace.package]
    edition = "2021" # 请根据第三方项目实际使用的Rust版本选择,比如2018或2021
    

    这样内部依赖的deno_runtime就能正常继承edition配置。如果后续子模块更新覆盖了这个修改,可以用Git本地补丁保存该变更,每次拉取子模块后重新应用即可。

  • 将第三方crate纳入你的根workspace
    修改项目根目录的Cargo.toml,把第三方项目中需要的crate加入workspace成员列表,并定义全局edition:

    [workspace]
    members = [
      "my-project",
      "third-party/crates/some_lib",
      "third-party/crates/deno_runtime" # 必须包含报错的deno_runtime
    ]
    
    [workspace.package]
    edition = "2021"
    

    这种方法不需要修改子模块本身,但要确保所有被依赖的第三方crate都被添加到workspace成员中。

  • 直接修改报错crate的edition配置
    打开third-party/crates/deno_runtime/Cargo.toml,把edition = { workspace = true }替换为具体的版本号,比如edition = "2021"。同样,子模块更新后需要重新修改,或用Git补丁维护该变更。

内容的提问来源于stack exchange,提问作者David Alsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:35:05