原文链接:https://zhuanlan.zhihu.com/p/163940004
在Rust
中,一般使用外部依赖的库部署在https://crates.io/。我们直接在Cargo.toml
的dependencies
配置即可,列如下配置:
...[dependencies]rand = "0.7.3"serde = "1.0"serde_derive = "1.0"serde_json = "1.0"lazy_static = "1.4.0"...
如果细心的同学会发现,如果rand
库更新到rand = "0.7.4"
时,我们执行cargo update
,Cargo.lock
会自动更新rand
到最新的0.7.4
版本。这主要是Rust
采用了语义化版本。
但是这样的依赖对于Rust
提供的crates.io
是没问题的,面对私有化的项目,即不能共享到公开的crates
上,又想做到私有依赖,问题就暴露了。
2.cargo私有化git依赖
一般来说,企业的私有代码,都依赖于私有git仓库。翻过cargo
的文档时,这里就提到了一个关于git私有化依赖的问题,详见链接:
https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#specifying-dependencies-from-git-repositories
这里的git私有化不外乎这几种依赖:branch
依赖,tag
依赖,commit-id
依赖,列如下配置:
[dependencies]
rand = { git = "https://github.com/rust-lang-nursery/rand", branch = "master" }
rand = { git = "https://github.com/rust-lang-nursery/rand", tag = "0.2.2" }
rand = { git = "https://github.com/rust-lang-nursery/rand", rev = "e2112c4" }
看到这里,我们就想到了才有私有化git
方式依赖,我们也这样做了。接下来问题便发生了。
2.1 在项目中,我们定义了一些公共依赖的结构:
hula_common
私有仓库。2.2
A
项目(lib)使用了hula_common
的仓库,依赖tag="0.1.5"
如下
hula_common = { package = "hula_common", git = "ssh://git@git.baoyachi.com/hula/hula_common.git" , tag = "0.1.5" }
2.3.
B
项目(lib)也使用了hula_common
的仓库,依赖tag="0.1.4"
如下
hula_common = { package = "hula_common", git = "ssh://git@git.baoyachi.com/hula/hula_common.git" , tag = "0.1.4" }
2.4
A
lib和B
lib都同时依赖了hula_common
,两者区别就是引用的git的tag
版本不同。2.5 在主程序的
project
名称是fuzz
中,fuzz
同时依赖了A
,B
,hula_common
等私有lib
,大致如下:
...[dependencies]serde_derive = "1.0.111"serde = "1.0.111"serde_json = "1.0.53"...
hula_common = { package = "hula_common", git = "ssh://git@git.baoyachi.com/hula/hula_common.git" , tag = "0.1.5" }B = { package = "B", git = "ssh://git@git.baoyachi.com/hula/B.git" , tag = "0.3.2" }A = { package = "A", git = "ssh://git@git.baoyachi.com/hula/A.git" , tag = "0.5.7" }...
2.6 当我们编译
fuzz
时,居然编译报错?
error[E0308]: mismatched types
--> src/common/query.rs:196:23
|
196 | let items = self.query(pos, key)?;
| ^^^^^ expected str