0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_wN0SrCdH 来源:京东云开发者 2023-03-17 16:42 次阅读

问题描述

clickhouse 的原生 rust 客户端目前比较好的有两个clickhouse-rsclickhouse.rs

clickhouse-rs 是 tcp 连接;clickhouse.rs 是 http 连接。

两个库在单独使用时没有任何问题,但是,在同一工程同时引用时会报错。

Cargo.toml

# clickhouse http
clickhouse = {git = "https://github.com/loyd/clickhouse.rs", features =      ["test-util"]}


# clickhouse tcp
clickhouse-rs={git="https://github.com/suharev7/clickhouse-rs",features=["default"]}报错如下


报错如下:

    Blocking waiting for file lock on package cache
    Updating git repository `https://github.com/suharev7/clickhouse-rs`
    Updating crates.io index
error: failed to select a version for `clickhouse-rs-cityhash-sys`.
    ... required by package `clickhouse-rs v1.0.0-alpha.1 (https://github.  com/suharev7/clickhouse-rs#ecf28f46)`
    ... which satisfies git dependency `clickhouse-rs` of package   `conflict v0.1.0 (/Users/jiashiwen/rustproject/conflict)`
versions that meet the requirements `^0.1.2` are: 0.1.2


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` as well:
package `clickhouse-rs-cityhash-sys v0.1.2`
    ... which satisfies dependency `clickhouse-rs-cityhash-sys = "^0.1.2"`   (locked to 0.1.2) of package `clickhouse v0.11.2 (https://github.com/  loyd/clickhouse.rs#4ba31e65)`
    ... which satisfies git dependency `clickhouse` (locked to 0.11.2) of   package `conflict v0.1.0 (/Users/jiashiwen/rustproject/conflict)`
Only one package in the dependency graph may specify the same links value.   This helps ensure that only one copy of a native library is linked in the   final binary. Try to adjust your dependencies so that only one package   uses the links ='clickhouse-rs-cityhash-sys' value. For more information,   see https://doc.rust-lang.org/cargo/reference/resolver.html#links.


failed to select a version for `clickhouse-rs-cityhash-sys` which could   resolve this conflict

错误描述还是很清楚的,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 --lib
cargo 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 field
The 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 指定了本地包被链接的名字,在这里引起了冲突,改掉本地包中的名字自然解决了冲突,在依赖图中保证唯一性很重要。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • TCP通信
    +关注

    关注

    0

    文章

    146

    浏览量

    4188
  • Rust
    +关注

    关注

    1

    文章

    227

    浏览量

    6506

原文标题:文盘Rust -- 本地库引发的依赖冲突

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何使用Rust连接Redis

    Rust操作Redis。 Redis依赖Rust中有很多Redis的客户端可以选择,这里我们选择使用redis-rs
    的头像 发表于 09-19 16:22 2059次阅读

    如何在Rust中连接和使用MySQL数据

    MySQL是一个广泛使用的关系型数据Rust作为一门相对较新的系统级编程语言,具有C语言般的高性能、安全、并发等特性,因此与MySQL一起使用是一种非常有趣的选择。在本教程中,我们将手把手地展示
    的头像 发表于 09-30 17:05 1445次阅读

    Maven依赖冲突的几种常用方法

    Maven依赖冲突是一个很常见的问题,它通常发生在项目中有多个依赖包含相同的不同版本时。我这边解决Maven依赖
    的头像 发表于 09-30 11:11 770次阅读
    Maven<b class='flag-5'>依赖</b><b class='flag-5'>冲突</b>的几种常用方法

    怎么解决依赖关系中vi冲突

    冲突项是Error Cluster From Error Code.vi。如果不在依赖关系中可以放进项目中来解决同名冲突。在依赖关系中怎么
    发表于 09-25 21:14

    如何利用C语言去调用rust静态

    提示在rust的静态libfoo.a中也有__aeabi_ul2d的实现,与libgcc.a中冲突。这点暂时没理解得太清楚,不过release版本编译的没有引入这个实现$ carg
    发表于 06-21 10:27

    Armv8.1-M PAC和BTI扩展

    1、Armv8.1-M PAC和 BTI 扩展Armv8-M通过Trustzone for Armv8-M, Memory Protection Unit (MPU) 和Privileged
    发表于 08-05 14:56

    Rust代码中加载静态时,出现错误 ` rust-lld: error: undefined symbol: malloc `怎么解决?

    “ [i]malloc ”、“ [i]exit ”。我验证了使用 ` [i]nm ` 命令。 问题是我打算使用 ffi 在 rust 中使用这个静态。当我尝试在我的 Rust 代码中加载静态
    发表于 06-09 08:44

    EPON技术

    EPON技术 EPON是一个新技术,用于保证提供一个高品质与高带宽利用率的应用。   EPON在日本、韩国、中国大陆、中国台湾及其它以以太网络为基础的地区都
    发表于 01-22 10:43 833次阅读

    鼠标HID例程(中)

    鼠标 HID 例程 紧接《鼠标 HID 例程(上)》一,继续向大家介绍鼠 标 HID 例程的未完的内容。
    发表于 07-26 15:18 0次下载

    5G AAU 功放控制和监测模块

    5G AAU 功放控制和监测模块
    发表于 10-28 12:00 2次下载
    5G AAU 功放控制和监测模块<b class='flag-5'>简</b><b class='flag-5'>析</b>

    Rust -- rust连接oss

    我们以 [S3 sdk](https://github.com/awslabs/aws-sdk-rust)为例来说说基本的连接与操作,作者验证过aws、京东云、阿里云。主要的增删改查功能没有什么差别。
    的头像 发表于 05-12 16:18 513次阅读

    AFE8092帧同步特性

    AFE8092帧同步特性
    的头像 发表于 08-24 13:37 572次阅读
    AFE8092帧同步特性<b class='flag-5'>简</b><b class='flag-5'>析</b>

    基于Rust的Log日志介绍

    Rust是一门系统级编程语言,因其安全性、高性能和并发性而备受欢迎。在Rust应用程序中,日志记录是一项非常重要的任务,因为它可以帮助开发人员了解应用程序的运行情况并解决问题。Rust的Log
    的头像 发表于 09-19 14:49 3203次阅读

    FastTime-纯Rust编写的高并发快速时间

    FastTime, 纯Rust编写的快速时间, 并发: 2800万+/秒. 一、组件
    的头像 发表于 11-06 09:23 517次阅读

    基于Rust的嵌入式符合ACID的键值数据

    surrealkv -- 基于 Rust 的 low level、版本化、嵌入式、符合 ACID 的键值数据
    的头像 发表于 12-28 11:29 789次阅读