如何在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
相关产品推荐
相关产品推荐

