如何告诉Cargo使用git存储库作为间接依赖的源而不是crates.io?

Luk*_*odt 11 rust rust-cargo

几天前,通过Emscripten对JavaScript进行交叉编译终于在夜间播出.我想以glium这种方式编译项目.但是,许多板条箱中仍然存在许多与Emscripten相关的错误.虽然维护人员通常会快速修复这些错误,但他们并不一定立即将这些错误修复程序发布到crates.io.

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

我怎么知道货物使用glutin存储库作为来源glutin,而不是crates.io

Luk*_*odt 11

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

在你的情况下,glium取决于glutin 0.6.1.0.6.1crates.io上的版本仍包含该错误.所以只需将其添加到您的Cargo.toml:

[replace]
"glutin:0.6.1" = { git = 'https://github.com/tomaka/glutin' }
Run Code Online (Sandbox Code Playgroud)

但请注意,

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

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

[replace]
"glutin:0.6.1" = { 
    git = 'https://github.com/tomaka/glutin' 
    tag = 'v0.6.1'
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这不起作用glutin,因为维护者没有为每个版本创建标签.在这种情况下,您只需在版本发生之前找到最后一次提交,并rev = 'b4a3d0...'使用该branch = '...'键指定或指定一个特定的分支.

  • @Jsor 是的,后者不起作用。LHS 定义了要替换的*什么*,并且您只能替换特定版本的 crate,而不是一般的一些 crate(可能发生在您的 dep-tree 中有两个不同版本的 crate)。RHS 说明了用*替换它的内容,正如答案中提到的,版本必须与 LHS 版本匹配,因此将其写在右侧毫无意义。 (2认同)