以下是 Rust中文教程中对 Cargo.lock 文件的描述,我有一点小疑问。
Cargo.lock 文件确保构建是可重现的 Cargo 有一个机制来确保任何人在任何时候重新构建代码,都会产生相同的结果:Cargo 只会使用你指定的依赖版本,除非你又手动指定了别的。例如,如果下周
rand crate
的 0.5.6 版本出来了,它修复了一个重要的 bug,同时也含有一个会破坏代码运行的缺陷,这时会发生什么呢?这个问题的答案是 Cargo.lock 文件。它在第一次运行
cargo build
时创建,并放在 guessing_game 目录。当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 Cargo.lock 文件。当将来构建项目时,Cargo 会发现 Cargo.lock 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 0.5.5 直到你显式升级,多亏有了 Cargo.lock 文件。
~~ 我不明白追踪我使用的依赖不是 Cargo.toml 文件已经记录了嘛,为什么还需要一个 Cargo.lock 呢。~~
~~ 我尝试理解是因为 cargo build
的时候,并不会直接使用我在文件 Cargo.toml 中指定的版本,而是搜索大于等于指定版本,通过某种计算选择一个合适的版本使用。比如我在 Cargo.toml 中指定使用 xxx = '0.3.1'
版本。Cargo 搜索到了 0.3.1, 0.3.2, 0.3.3
三个版本,然后使用了 0.3.3
版本,将这个 0.3.3
记录到了 Cargo.lock 文件中。 请问是这个样子吗?还是什么其他的原因我不太懂。原谅我不太懂,感谢回答。 ~~
--------------- 抱歉没有找到删除,我觉得我可能知道原因了 ---------------
通过 cat Cargo.lock
看到了更详细的依赖记录。只是我不明白为什么不把这个文件隐藏起来,而要显式的留在这里,或许是方便编辑?或许我以后会知道。
评论区
写评论我的理解: cargo.toml 文件中的版本号是一个简写,如 0.5.5 是 ^0.5.5 的简写,意思是所有和 0.5.5 版本兼容的公共api。也就是说,这个版本号代表的是一个范围。而 cargo.lock 中才是具体的项目中依赖包的版本号
教程说的很明确啊,lock表示一个可重复的build,是需要跟源码一起保存到 git 之类的地方的。怎么能隐藏呢?
不给删除哈,修改的过程也是有意义的。所以进展最好添在后面。
现在如果在cargo.toml里面指定了某包的新版本号 重新build确实会覆盖cargo.lock里面对应的包和版本 我觉得这也是这个问题 目前lock的作用就是使用别人的项目时保证依赖的版本和完整性