写点什么

文盘 Rust -- 本地库引发的依赖冲突

  • 2023-02-17
    北京
  • 本文字数:1226 字

    阅读完需:约 4 分钟

作者: jiashiwen 原文来源:https://tidb.net/blog/e949b2e7

问题描述

clickhouse 的原生 rust 客户端目前比较好的有两个clickhouse-rs  和 clickhouse.rs  。clickhouse-rs 是 tcp 连接;clickhouse.rs 是 http 连接。两个库在单独使用时没有任何问题,但是,在同一工程同时引用时会报错。


  • Cargo.toml

  • 报错如下


错误描述还是很清楚的,clickhouse-rs-cityhash-sys 这个库冲突了。仔细看了一下两个库的源码,引用 clickhouse-rs-cityhash-sys 库的方式是不一样的。clickhouse.rs 是在其 Cargo.toml 文件中使用最普遍的方式引用的


clickhouse-rs-cityhash-sys = { version = "0.1.2", optional = true }
复制代码


clickhouse-rs 是通过本地方式引用的


[dependencies.clickhouse-rs-cityhash-sys]path = "clickhouse-rs-cityhash-sys"version = "0.1.2"
复制代码


clickhouse-rs-cityhash-sys 的源码直接放在 clickhouse-rs 工程目录下面。


一开始是有个直观的想法,如果在一个工程中通过 workspace 进行隔离,是不是会解决冲突问题呢?于是,工程的目录结构从这样


.├── Cargo.lock├── Cargo.toml└── src    └── main.rs
复制代码


改成了这样


.├── Cargo.lock├── Cargo.toml├── ck_http│   ├── Cargo.toml│   └── src├── ck_tcp│   ├── Cargo.toml│   └── src└── src    └── main.rs
复制代码


新建了两个 lib


cargo new ck_http --libcargo new ck_tcp --lib
复制代码


在 workspace 中分别应用 clickhouse-rs 和 clickhouse.rs , 删除根下 Cargo.toml 文件中的依赖关系。很可惜,workspace 没有解决问题,报错没有一点儿差别。


又仔细看了看报错,里面有这样一段


  the package `clickhouse-rs-cityhash-sys` links to the native library   `clickhouse-rs`, but it conflicts with a previous package which links to   `clickhouse-rs`
复制代码


难道是 clickhouse-rs 这个名字冲突了?直接把 clickhouse-rs 源码拉下来作为本地库来试试呢?于是把 clickhouse-rs clone 到本地,稍稍修改一下 ck_tcp workspace 的 Cargo.toml


clickhouse-rs = { path = "../../clickhouse-rs", features = ["default"]}
复制代码


编译后冲突依旧存在。翻翻 clickhouse-rs/clickhouse-rs-cityhash-sys/Cargo.toml,里面的一个配置很可疑


[package]......links = "clickhouse-rs"
复制代码


把 links 随便改个名字比如:links = “ck-rs-cityhash-sys”,编译就通过了。


错误提示中这句话很重要


Only one package in the dependency graph may specify the same links value.
复制代码


看了一下 links 字段的含义


The links fieldThe links field specifies the name of a native library that is being linked to. More information can be found in the links section of the build script guide.
复制代码


links 指定了本地包被链接的名字,在这里引起了冲突,改掉本地包中的名字自然解决了冲突,在依赖图中保证唯一性很重要。


本文涉及代码 github仓库 ,有兴趣的同学可以亲自试一试


下期见。


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
文盘Rust -- 本地库引发的依赖冲突_开发语言_TiDB 社区干货传送门_InfoQ写作社区