Cargo 构建包具有来自同一 git 存储库的冲突功能?

Cargo build package with conflicting features from the same git repository?

我有一个 git 存储库(不是 crates.io),它具有不同的功能,我们称它们为 A 和 B,它们是互斥的 - 这两个功能公开结构和 API同名,因此天真地编译两者会导致冲突和失败。

作为依赖包的开发者,我想同时使用这两个特性。 我可以使用别名。如果我使用相同的 git 存储库 url,它会失败,但如果在 Cargo.toml 我使用两个不同的 git 存储库,它会起作用:

[dependencies]
my_package_A = {package = "my_package", git = "/first/url", features = ["A"]}
my_package_B = {package = "my_package", git = "/second/url", features = ["B"]}

我想避免将我的存储库分叉到另一个 url。 有办法吗?

Cargo 特性允许将部分代码标记为可选,主要是为了允许将库的某些依赖项设为可选。它们不打算用作通用软件配置机制。

在您描述的情况下,我建议将您的 crate 分成三个 crate:一个具有基本功能,一个用于功能 A,一个用于功能 B。您可以将这三个 crate 保存在一个 Cargo 工作区和一个 Git 存储库中。依赖的 crate 可以选择它们想要依赖的部分,Cargo 将按预期解决这个问题,即使对于具有多个 crate 实例的更大的依赖图也是如此。