如何在Cargo.toml的"dependencies"和"dev-dependencies"下拉取带有不同特性的依赖项?

19

假设你有一个名为“dep”的依赖项,其中有两个名为f1和f2的特性。当我正常构建我的crate时,我想使用“dep”与f1功能,但在构建测试时要使用f2功能。我知道dev-dependencies是我们需要用于测试的依赖项,因此认为下面的Cargo.toml结构应该有效:

    [dev-dependencies]
    dep = { version = "1.0.0", features = ["f2"] }
    
    [dependencies]
    dep = { version = "1.0.0", features = ["f1"] }
    

然而,看起来一旦我用“f1”拉入“dep”,编译器将忽略在dev-dependencies部分提到的同一依赖项。另一方面,将依赖关系设置为“可选”的方式无法解决此问题,因为这样测试中将不会拉入“dep”。有任何解决此问题或绕过它的好方法吗?

PS:我注意到此问题正在此处跟踪:https://github.com/rust-lang/cargo/issues/7916。所以目前,我只能期待来自回答者的良好解决方法。


你尝试过这个并遇到了问题吗?我认为合理的假设是编译器会根据需要合并功能集。 - apetranzilla
是的,我尝试过了,正如所说,编译器似乎忽略了dev-dependencies下的定义。 - Alex Sed
1
作为一种解决方法,我曾经做过的是将依赖项设置为可选,并使用 cargo test --all-features 运行测试。 - rodrigo
1
关于这个问题的最新进展是,看起来7916已经合并了。如果我理解正确,您还可以使用依赖解析器的第二个版本,它不再合并开发和普通依赖项,除非目标确实需要它们。 - bnaecker
1个回答

4
使用Rust 2021和解析器版本2可以实现这一点。详见此处的文档。具体来说,它表示如下:

在使用开发依赖项作为普通依赖项时,除非正在构建这些开发依赖项,否则不会统一启用这些功能。

为了实现这一点,您需要在根包中设置 edition = "2021",然后在您的创建清单中使用resolver ="2"以启用所需行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接