#17440·cargo

为每个艺术品依赖声明分配自己的特征

作者: npmccallum创建于 2026年9月4日更新于 2026年9月29日
标签Z-bindeps

假设 schema 包含一个代码生成二进制文件和其生成的代码所使用的运行时库:

toml
[dependencies]
schema-runtime = { package = "schema", version = "1", features = ["runtime"] }

[build-dependencies]
schema-codegen = { package = "schema", version = "1", artifact = "bin:schema-codegen", features = ["cli"] }

Cargo 在构建脚本运行之前构建 schema-codegen,并通过 CARGO_BIN_FILE_... 环境变量暴露其路径。父 crate 将 schema 库链接为 schema_runtime。解析器 v2 已经将它们的功能分开,因为一个是普通依赖,另一个是构建依赖。Cargo 为两者选择同一个 schema 版本。RFC 3176 允许对同一个包使用多个名称。Cargo 今天仍然拒绝这种情况;#17067 在不更改功能行为的情况下实现了它。它可能在本设计确定之前实现。应用该 PR 后,以下情况将有效:

toml
[build-dependencies]
schema-json = { package = "schema", version = "1", artifact = "bin:schema-codegen", features = ["json"] }
schema-protobuf = { package = "schema", version = "1", artifact = "bin:schema-codegen", features = ["protobuf"] }

#17067 保持了 Cargo 目前的规则,即通过包和二进制目标选择功能。由于这些声明具有相同的包和目标,两个生成器构建都将获得 json 和 protobuf。这些功能不冲突,这并不奇怪:一个生成器所请求的可选解析器、后端或日志堆栈也会改变另一个生成器。我建议 schema-json 获得 json,而 schema-protobuf 获得 protobuf。这种分离符合它们的正常和构建依赖。

内容来源: rust-lang/cargo