【问题标题】:How to generate Cargo.lock based on last month's crates.io?如何根据上个月的 crates.io 生成 Cargo.lock?
【发布时间】:2018-01-29 08:46:31
【问题描述】:

我想根据 2017 年 2 月 22 日可用的内容,在 Cargo.toml 的 Rust 项目中创建一个 Cargo.lock 文件。我需要使版本选择与当天发生的情况兼容。 (不,在某个地方没有受版本控制的 Cargo.lock。)

我试过没有用:

  1. 将 crates.io 索引克隆到本地目录并检查与所需日期匹配的旧提交。
  2. 在 .cargo/config 中使用以下行:

    [source.mycrates]
    registry = "file:///path/to/crates.io-index"  # contains old checkout
    
    [source.crates-io]
    replace-with = "mycrates"
    

不过,cargo 将 Cargo.toml 中的依赖关系解析为最新可用的,而不是指定结帐中的最新依赖。

我怎样才能让 Cargo 的版本选择回到过去?

【问题讨论】:

  • 听起来有点像XY Problem。你到底想用这个实现什么?
  • 我的具体用例是在 NixOS 的 Rust 基础设施中创建一个与特定 crates.io 快照一起使用的 Cargo.lock。
  • 我明白了,但为什么它必须是快照?为什么不能直播?

标签: rust rust-cargo


【解决方案1】:

既然您说您已经尝试过克隆索引,我假设您仍然保留它。为了其他读者的利益,该存储库似乎是在 Git 中维护的,可通过https://github.com/rust-lang/crates.io-index 获得。

你需要告诉cargo 与--frozen 一起运行,这样它就不会接触到网络,q.v。 Cargo FAQ,如果它认为需要它就会爆炸。如果它已经下载了东西,你也需要cargo clean,或者核对缓存。

如果你还没有结帐时需要的所有包,你还需要下载你感兴趣的特定版本。Dissecting Crates.io: Bare Minimum Mirror 有解释,我会在这里总结以防万一链接炸了。

Crates repo 根目录中的config.json 包含用于下载软件包的 URL,官方认为这些 URL 不稳定,但现在可以使用。

“gmjosack”使用的libc crate 中的示例显示了/api/v1/crates/libc/0.1.10/download 的下载路径,基于config.json 中https://crates.io/api/v1/crates 的dl 键和当时可用的版本的帖子。

您可能需要编写下载脚本以构建镜像。另请参阅:Downloading Rust crates using a web browser on stackoverflow。

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    相关资源
    最近更新 更多