Rust 中 Cargo.toml & Cargo.lock

https://rustwiki.org/zh-CN/cargo/guide/cargo-toml-vs-cargo-lock.html

https://rustwiki.org/zh-CN/cargo/faq.html#why-do-binaries-have-cargolock-in-version-control-but-not-libraries

以上官方资料中指出

  • Cargo.toml是从广义上描述你的依赖,并由你编写.
  • Cargo.lock包含有关您的依赖项的确切信息。它由 Cargo 维护,不应手动编辑.

并提出原则:在编写 binary crate 时,应将 Cargo.lock 加入 git 管理并传入仓库;在编写 library crate 时,应避免将 Cargo.lock 加入 git 管理。

我理解,Cargo.toml 使用 semver(Semantic Version 语义版本) 为依赖规定较宽的约束,而 Cargo.lock 是在第一次构建成功后由 cargo 自动记录下的一套确切可行的依赖版本。因为 semver 有时候太宽泛了,同一套 semver 在不同时间下可能有不同的索引结果,所以使用 lock 保证提供一套可行的依赖版本。

binary crate 将 Cargo.lock 加入 git 管理就是为了保证用户可以用这套依赖编译出可用的 二进制文件。

对于 library crate,它作为其他项目的依赖,可能与该项目共同依赖一个第三方 crate,如果两者都用 lock 指定第三方 crate 的版本,而且指定的还是不同版本。那么整个项目内部就会出现对同一个 crate 的不同版本的依赖。这会大大加剧代码的迷惑性,编译器视角下不同的类型,由于隐藏了版本信息,在代码中看起来可能一样。

上面这段话很混乱,举个例子

复制代码
// 项目 Root,Cargo.toml
[dependencies]
mylib = "0.1"
serde = "1.0" // 检索为 serde = 1.0.201

// mylib,Cargo.toml
[dependencies]
serde = "1.0"  // 由 mylib:Cargo.lock 指定为 serde = 1.0.150

// 最终项目 Root 依赖结构
myserver
├── serde 1.0.201
└── mylib
    └── serde 1.0.150

// 后续可能报错
expected serde::Value
found serde::Value
// 看着一样,实际来自于不同的版本
相关推荐
星栈37 分钟前
用 Rust 写 Agent 服务 -- adk-rust 上手记
后端·agent
杨运交1 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
LucianaiB2 小时前
我用豆包工作 Seed-2.1-pro,复刻了 QQ 时代爆红的魔术图片
后端
码事漫谈2 小时前
智谱 ZCode 静默上传 Git 历史:48 小时信任危机复盘
后端
掘金码甲哥2 小时前
当对话模型遇上向量模型,vllm production stack 又该如何应对?
后端
传奇开心果编程2 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
Bruce_Liuxiaowei2 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
IT_陈寒3 小时前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
光影少年3 小时前
Express 中间件原理
后端·node.js·express
梦醒沉醉3 小时前
std1.97.1——cmp模块细览
rust