最近,我使用cargo build --release --timings来调查我的Ruust项目的构建时间,发现依赖于开发的特性尽管处于发布模式,但仍然占用了大量的构建时间.

特别是,我使用具有以下特性的sea-orm,而sqlite特性仅用于测试:

[dependencies.sea-orm]
version = "0.11"
features = ["runtime-tokio-rustls", "sqlx-mysql", "macros"]
default-features = false

[dev-dependencies]
sea-orm = { version = "0.11", features = ["sqlx-sqlite"]}

当然,Cargo在cargo.lock中同时解决了所有这些功能.然而,构建SQLite sys库会占用很大一部分构建时间,即使在发布模式下也是如此.

虽然不是很重要,但在构建版本配置文件时排除此功能将是很好的.有没有办法实现这一点?

推荐答案

这就是最初的Cargo 功能解析器的工作方式;功能标志在所有方面都是统一的.

幸运的是,Rust 2021中引入了一个feature resolver version 2,它更像您所期望的那样将它们拆分(针对构建依赖项、开发依赖项和特定于平台的标志的单独"存储桶"),但可能需要多次编译一些机箱(如果它们在不同的"存储桶"中启用了不同的功能标志).

你可能不会使用新的功能解析器,原因有几个:

  • 如果您的 crate 使用edition = "2018"或更早的版本,则默认情况下将使用原始解析器.你可以更新到edition = "2021",或者在你的Cargo [package]中指定resolver = "2".
  • 如果您正在使用带有根程序包的工作区,则它只使用为其配置的根Cargo.toml,所以如果它使用以前的版本,请使用上面的步骤.
  • 如果您使用的工作区没有根程序包成员(即虚拟 list ),则默认情况下它将使用原始解析器.您需要在您的[workspace]中指定resolver = "2".

另见:

Rust相关问答推荐

trait 中self 的显式生命周期似乎导致E0499无法在循环中多次borrow * emits 器作为可变的

如何在rust中有条件地分配变量?

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

如何装箱生命周期相关联的两个对象?

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

原始数组数据类型的默认trait实现

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

作为1字节位掩码的布尔值 struct

更合理的方法来设计样条线函数器?

将Vec<;U8&>转换为Vec<;{Float}&>

如何实现Deref;多次;?

什么是`&;[][..]`铁 rust 里的刻薄?

为什么我必须使用 PhantomData?在这种情况下它在做什么?

如何返回 struct 体中向量的切片

从字节数组转换为字节元组和字节数组时,为什么 Transmute 会对字节重新排序?

Rust Axum 框架 - 解包安全吗?

为什么 Rust 字符串没有短字符串优化 (SSO)?

Rust Redis 中的 HSET 命令问题

Rust/Serde/HTTP:序列化`Option`

传递 Option<&mut T> 时何时需要 mut