最近尝试在一个项目中引用一个私有crate,这个crate是一个lib,然后存储在私有git仓库中,并且这个git平台不支持rust的crate-index.
- 第一坑,引用git依赖
于是我在我的项目中这样引用外部依赖包
[package]
name = "las"
version = "0.1.1"
authors = ["...."]
edition = "2018"
[dependencies]
elasticsearch = { version = "8.5.0-alpha.1", default-features = false, features = [
"rustls-tls",
] }
logwatcher = "0.1.1"
json = "*"
reqwest = { version = "0.11.12", default-features = false, features = [
"blocking",
"rustls-tls",
] }
toml = "0.8.6"
serde_derive = "1.0.177"
serde = "1.0.177"
serde_json = "1.0.104"
once_cell = "1.18.0"
futures = "0.3"
tokio = { version = "*", features = ["full"] }
uuid = { version = "1.4", features = ["v4", "fast-rng", "macro-diagnostics"] }
chrono = "0.4"
core_affinity = "0.8.0"
geoip = { git = "ssh://git@git.xxxx.com/xxxx/tgeoip.git", branch = "master", package = "geoip" }
nix = "0.26"
libc = "0.2.146"
clap = { version = "4.4.2", features = ["derive"] }
log4rs = { version = "1.2.0" }
log = { version = "0.4.20" }
[build-dependencies]
regex = "1.6.0"
需要注意的是,我git@git.xxxx.com:xxxx/tgeoip.git
仓库中是一个workspace,里面有2个子项,一个是可执行bin项目,叫做regen
,一个是外部可依赖包,叫做geoip
(后续实践表明同一个workspace里面的子项引用就应该这么干,git路径是同一个,使用package指定子项的包名),我这样引入之后,发现死活拉取不了私有git依赖。报错没权限拉取,git鉴权失败
error: failed to get `geoip` as a dependency of package `las v0.1.1 (/data/code/rust/las)`
Caused by:
failed to load source for dependency `geoip`
Caused by:
Unable to update ssh://git@git.xxxx.com/xxxx/tgeoip.git?branch=master#e41c5279
Caused by:
failed to clone into: /root/.cargo/git/db/tgeoip-9094aceea5940357
Caused by:
failed to authenticate when downloading repository
* attempted ssh-agent authentication, but no usernames succeeded: `git`
if the git CLI succeeds then `net.git-fetch-with-cli` may help here
https://doc.rust-lang.org/cargo/reference/config.html#netgit-fetch-with-cli
Caused by:
no authentication methods succeeded
各方查询后,都是建议添加这个选项,我开始还没搞清楚加在哪儿,但是发现使用环境变量好使。各方尝试后:
添加到~/.cargo/config
文件中,如下
[net]
git-fetch-with-cli = true
然后再次执行cargo build
无需环境变量即可。(前提是你本地已经配置好了访问ssh://git@git.xxxx.com/xxxx/tgeoip.git
的ssh key)
- 第二坑,外部依赖包要申明为
rlib
我在这个bin项目中引用geoip
,发现一直报错
failed to resolve: use of undeclared crate or module `geoip`
百思不得其解,最后发现是我依赖包申明类型的问题,我Cargo.toml
申明的是
[package]
....
[lib]
name = "geoip"
crate-type = ["staticlib", "cdylib"]
[dependencies]
bincode = "1.3.3"
serde = { version = "1.0.193", features = ["derive"] }
实际lib
应该申明rlib
类型,才能被正常引用,改为如下,更新依赖,就没报错了
[package]
....
[lib]
name = "geoip"
crate-type = ["staticlib", "cdylib", "rlib"]
[dependencies]
bincode = "1.3.3"
serde = { version = "1.0.193", features = ["derive"] }