七爪源码:Rust 中的工作区继承

看一下 Rust 1.64 的新特性

Rust 1.64 今天已经到来,这个版本将影响网络上数百个各种类型的项目。

这样做的原因是它具有一个关键特性,任何项目都被划分为大量不同的 crate。 这个特性是工作空间继承,它允许我们在 crate 之间共享版本号或元数据字段等字段。 Cargo.toml 文件终于开始遵循 DRY 原则。


告别复制粘贴许可证和作者

任何人在创建新 crate 时要做的第一件事就是打开前一个 crate 的清单并复制两者之间共有的所有部分 - 即使它们在同一个工作区中。

例如,在我用来展示代码示例的存储库中,您可以看到我曾经在每个 crate 中拥有相同的 authors 密钥。 现在我可以去掉所有的重复。 如何? 首先,使根 Cargo.toml 如下所示:

[package]
name = "sotoestevez_medium"
version = "0.1.0"

[workspace]
members = ["add_trait", "beginning_tips", "generify_with_compiler_errors", "modules", "scoped_threads" ]

[workspace.package]
edition = "2021"
authors = ["Soto Estévez "]
description = "Demos of the articles at https://medium.com/@sotoestevez"
documentation = "https://medium.com/@sotoestevez"
readme = "./README.md"
homepage = "https://www.sotoestevez.dev"
repository = "https://github.com/kriogenia/medium"
license = "MIT OR Apache-2.0"

在这个新版本中,在 [workspace.package] 下,您可以定义要声明为工作区默认值的 package 部分的一些键。

这将允许工作区 crate 选择加入并继承那些相同的部分,否则会被复制(在此示例中,它们是您在 workspace.members 中看到的存储库的所有 crate)。

现在,要使用这些默认值,我们只需将它们调用到其他清单中。 例如,现在是 add_trait/Cargo.toml:

[package]
name = "add_trait"
version = "0.1.0"
edition.workspace = true
authors.workspace = true
description = "Dissecting Rust Traits to Learn Their Secrets"
documentation = "https://betterprogramming.pub/dissecting-rust-traits-to-learn-their-secrets-839845d3d71e"
homepage.workspace = true
repository.workspace = true
license.workspace = true

add_trait 的清单现在将继承我们在根目录中为我们使用 {key}.workspace 带来的键设置的值,例如 edition 或 authors。另请参阅我们如何忽略那些我们不想带来的内容,例如自述文件,因为这个箱子没有;或描述,这是不同的,我们是压倒一切的。

有了这个新清单,所有项目将始终使用相同的版本,并且无需在每个项目中手动更新诸如更改许可证之类的更新。


保持版本同步

但是我们可以利用这种新的继承来做另一件事,这将是商业项目的关键。这是使用继承来授予依赖项之间的同步性。为此,我们可以采用与 [package] 相同的方法,但使用 [workspace.dependencies] 和典型的依赖声明(但我们不能在这里使用 optional)。

例如,将其添加到根 Cargo.toml 会将工作区默认版本和功能设置为这三个依赖项:

[... rest of the manifest ]

[workspace.dependencies]
num = { version = "0.4", default-features = false }
vector2d = "2.2"
rand = "0.8.5"

现在,在generify_with_compiler_errors,我们可以将这些依赖项与工作区版本和功能一起使用,并在下面的示例中在宣言中声明它们:

[package]
name = "generify_with_compiler_errors"
version = "0.1.0"
edition = "2021"
authors.workspace = true

[dependencies]
num = { workspace = true, default-features = true }
vector2d.workspace = true

[dev-dependencies]
rand = { workspace = true, features = [ "log" ] }

看看我们如何在工作区中以相同的方式声明 vector2d,但是我们如何覆盖 num 依赖项,因为这个 crate 需要使用默认功能,我们只使用相同的版本。 这个 crate 不使用 rand,但我添加它是为了展示如何在声明的特性之上声明特性,并将依赖项不仅引入 [dependencies],还引入 [dev-dependencies] 和 [build-dependencies]。

关注七爪网,获取更多APP/小程序/网站源码资源!

展开阅读全文

页面更新:2024-04-23

标签:工作   字段   示例   清单   源码   特性   许可证   声明   版本   功能   项目

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top