首页 > 业界 > > 详情

什么是Sparse by default for crates.io 微动态

来源:博客园 2023-06-13 21:29:04

当 Rust crate 发布到 crates.io 上时,可以启用“Sparse by default”特性,这意味着默认情况下,crate 不会包含所有依赖项在上传到 crates.io 的最终包中。相反,它只会包含必要的直接依赖项来使 crate 正常运行。

这个特性对于减少 crate 的大小和用户需要下载和安装的依赖项数量非常有用。然而,如果 crate 依赖于未包含的间接依赖项,或者间接依赖项具有冲突的版本,则可能会出现问题。

为了减轻这些问题,启用“Sparse by default”特性的 crate 通常会包含一个Cargo.toml文件,该文件指定了 crate 每个可选特性所需的依赖项。 crate 的用户可以启用这些特性来包含所需的依赖项,或者手动将所需的依赖项添加到其项目的Cargo.toml文件中。


(资料图片仅供参考)

总之,“Sparse by default”特性是 Rust crate 中的一个有用的优化,但需要仔细管理依赖项,以确保 crate 保持功能和易用性。

当一个 crate 启用了 "sparse by default" 特性时,使用这个 crate 的开发者需要注意以下几点:

需要查看 crate 的Cargo.toml文件,看看哪些功能需要手动开启依赖项。一些功能可能需要开启多个依赖项,所以需要仔细阅读说明文档。

如果使用了不开启依赖项的功能,将会出现编译错误或者运行时错误。这时需要回到第一步,查看哪些依赖项需要开启。

如果使用了一个依赖项的不同版本,可能会出现冲突。这时需要手动指定正确的版本号,或者尝试升级或降级依赖项的版本。

下面是一个具体的例子:假设一个 crate 需要使用serde_json库来解析 JSON 数据。在 crate 的Cargo.toml文件中,可以看到以下代码:

[dependencies]serde_json = { version = "1.0", optional = true }

这里指定serde_json为可选依赖项,如果需要解析 JSON 数据,则需要手动开启该依赖项。在使用 crate 的代码中,可以这样来开启依赖项:

// 在代码开头引入依赖项#[cfg(feature = "serde_json")]use serde_json;// 在使用时判断依赖项是否开启#[cfg(feature = "serde_json")]{    let data = "{\"name\": \"Alice\", \"age\": 30}";    let parsed = serde_json::from_str(data).unwrap();    // ...}

在这个例子中,crate 的使用者需要手动开启serde_json依赖项,并使用#[cfg(feature = "serde_json")]来判断是否开启了该依赖项。如果没有开启该依赖项,则解析 JSON 数据的代码块将会被忽略。

这里的本地仓库有一个参考的例子:https://github.com/DaviRain-Su/all-in-one-rust/tree/main/sparse-by-default-cratesio

Rust crate 中 "sparse by default" 特性的例子:

hypercrate:一个 HTTP 库,在默认情况下仅包含核心库和少量依赖项。如果需要使用 HTTPS 或其他功能,则需要手动开启依赖项,例如:
[dependencies]hyper = { version = "0.14", features = ["http1", "http2", "openssl"] }

这里开启了http1,http2openssl依赖项来支持 HTTP/1.1、HTTP/2 和 HTTPS。

reqwestcrate:一个 HTTP 客户端库,也是一个 "sparse by default" 的 crate。默认情况下仅包含核心库和少量依赖项。如果需要使用 HTTPS 或其他功能,则需要手动开启依赖项,例如:
[dependencies]reqwest = { version = "0.11", features = ["blocking", "json", "tls"] }

这里开启了blocking,jsontls依赖项来支持同步请求、JSON 解析和 HTTPS。

actix-webcrate:一个 Web 框架,也是一个 "sparse by default" 的 crate。默认情况下仅包含核心库和少量依赖项。如果需要使用 HTTPS、WebSocket 或其他功能,则需要手动开启依赖项,例如:
[dependencies]actix-web = { version = "3.3", features = ["ssl", "ws"] }

这里开启了sslws依赖项来支持 HTTPS 和 WebSocket。

总之,"sparse by default" 特性可以让 Rust crate 的核心部分保持轻量级和高效,同时也提供了灵活性来添加需要的功能。但是,使用这些 crate 的开发者需要留意依赖项的管理,以确保 crate 的正确性和可用性。

在Rust的1.70.0版本也有提到这个特性:https://blog.rust-lang.org/2023/06/01/Rust-1.70.0.html

分享至:

上一篇:天天视点!伊万卡给12岁女儿举办成人礼!女儿名媛范足,旺夫脸比妈妈还惊艳 下一篇 :最后一页
x

推荐阅读

更多推荐