如何通过Git依赖Cargo工作区中的指定crate?
依赖Git仓库中Cargo工作区子Crate的解决方案
假设你有一个包含Cargo工作区的Git仓库,工作区内有个名为foo的crate;同时还有一个工作区外的bar crate,需要在bar中依赖foo。
你已经知道两种可行的依赖场景:
- 若
foo是独立Git仓库的普通crate,可在bar的Cargo.toml中配置:foo = { git = "ssh://git@server/some/foo.git", ... } - 若
foo在本地的Cargo工作区内,可配置:foo = { path = "../../some-workspace/foo" }
但当foo位于远程Git仓库的工作区内时,直接使用git = "ssh://..."无法指定具体的子crate,且git与path选项互斥不能组合使用。Cargo官方指南中的branch、tag、rev仅用于指定版本,package字段仅用于重命名依赖,都无法直接解决这个问题。
以下是几种可行的解决方案:
1. 将子crate发布到依赖仓库
如果允许的话,把foo单独发布到crates.io或者你的私有依赖仓库,这样bar就能像依赖普通crate一样直接引用:
[dependencies] foo = "x.y.z"
这里的x.y.z是foo发布的版本号。
2. 使用Git子模块
在bar的仓库中添加包含目标工作区的Git仓库作为子模块,通过本地路径依赖foo:
- 执行命令添加子模块:
git submodule add ssh://git@server/some/workspace.git workspace-submodule - 在
bar的Cargo.toml中配置依赖:[dependencies] foo = { path = "./workspace-submodule/foo" }
这种方式既能通过Git子模块同步工作区的代码更新,又能正确识别foo crate。
3. 使用Cargo的patch功能(临时方案)
如果只是临时需要依赖特定版本的foo,可以用patch功能指向Git仓库中的工作区:
在bar的Cargo.toml中添加:
[patch.crates-io] foo = { git = "ssh://git@server/some/workspace.git", package = "foo" }
然后在依赖部分正常声明foo,版本号需与工作区中foo的Cargo.toml版本一致:
[dependencies] foo = "x.y.z"
4. 直接指向子crate的Git路径(部分Git服务支持)
如果你的Git服务支持直接指向仓库内的子目录,可以直接指定foo所在目录的Git URL,并配合package字段:
[dependencies] foo = { git = "ssh://git@server/some/workspace.git", rev = "abc123", package = "foo" }
注意这里的rev需要替换为工作区仓库中包含foo的有效提交哈希,且要确保该提交下foo的Cargo.toml是完整可用的。
内容的提问来源于stack exchange,提问作者sshine
相关产品推荐
相关产品推荐

