【问题标题】:How to tell Cargo to use a git repository as source for an indirect dependency instead of crates.io?如何告诉 Cargo 使用 git 存储库作为间接依赖的源而不是 crates.io?
【发布时间】:2016-10-17 06:38:16
【问题描述】:

A few days ago,通过 Emscripten 交叉编译到 JavaScript 终于在 nightly 上线了。我想以这种方式使用glium 编译一个项目。但是,在许多 crate 中仍然存在许多与 Emscripten 相关的错误。虽然维护人员通常会快速修复这些错误,但他们不一定会立即将这些错误修复发布到crates.io。

就我而言,glium 取决于 glutin。 glutin 有一个错误现在已修复,但仅在 git 存储库中,而不是在 crates.io 上。 注意:glutin 不是我项目的直接依赖项;只是通过glium的间接一个!

如何告诉 Cargo 使用 the glutin repository 作为 glutin 的来源而不是 crates.io?

【问题讨论】:

    标签: rust rust-cargo


    【解决方案1】:

    您可以在项目的Cargo.toml 中使用[replace] 部分。您可以找到有关该功能的文档here in the Cargo documentation。

    在您的情况下,glium 取决于 glutin 0.6.1。 crates.io 上的 0.6.1 版本仍然包含该错误。因此,只需将其添加到您的 Cargo.toml:

    [replace]
    "glutin:0.6.1" = { git = 'https://github.com/tomaka/glutin' }
    

    请注意,

    [...] 被替换的 crate 不仅必须具有相同的名称,而且必须具有相同的版本。

    但即使在版本不匹配的情况下(存储库已经包含一个较新的版本),如果 crate 的维护者为每个版本创建 git 标签(许多 Rust 社区中的人都这样做),你仍然很幸运。在这种情况下,您只需指定标签:

    [replace]
    "glutin:0.6.1" = { 
        git = 'https://github.com/tomaka/glutin' 
        tag = 'v0.6.1'
    }
    

    遗憾的是,这不适用于glutin,因为维护者没有为每个版本创建标签。在这种情况下,您可以简单地找到版本被碰撞之前的最后一次提交,并使用 rev = 'b4a3d0...' 指定它或使用 branch = '...' 键指定特定分支。 p>

    【讨论】:

    • "x:version.number" = ...和"x = { version = "version.number", ... }有区别吗?
    • @Jsor 是的,后者不起作用。 LHS 定义了要替换的 what,您只能替换特定版本的 crate,而不是一般的某些 crate(可能会发生在您的 dep-tree 中有两个不同版本的 crate)。 RHS 说明了用什么替换它 并且如答案中所述,版本必须与 LHS 版本匹配,因此将其写在右侧没有意义。
    • 请注意,[replace] 已被弃用,而应使用[patch]。有关更多信息,请参阅答案中链接的货物文档。
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2016-12-22
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2015-12-17
    相关资源
    最近更新 更多