台北共享工作空間交流論壇

 找回密碼
 立即註冊
搜索
熱搜: 活動 交友 discuz
查看: 400|回復: 0
打印 上一主題 下一主題

Rust Cargo使用指南

[複製鏈接]

1197

主題

1197

帖子

3622

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
3622
跳轉到指定樓層
樓主
發表於 2023-10-23 18:24:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一個事情空間是由多個 package 構成的调集,它們同享統一個 Cargo.lock 文件、输出目次和一些設置(比方 profiles : 编译器設置和優化)。構成事情空間的 packages 被称之為事情空間的成员。

事情空間蒲公英根茶, 有两種類型:root package 和虚拟清单( virtual manifest )。

若一個 package 的 Cargo.toml 包括了[package] 的同時又包括了 [workspace] 部門,则该 package 被称為事情空間的根 package

换而言之,一個事情空間的根( root )是该事情空間的 Cargo.toml 文件地點的目次。

举個例子,咱們如今有多個 package,它們的目次是嵌套瓜葛,然後咱們在最外层的 package,也就是最外层目次中的 Cargo.toml 中界说一個 [workspace],此時這個最外层的 package 就是事情空間的根。

再举個例子,台甫鼎鼎的 ripgrep 就在最外层的 package 中界说了 [workspace] :

  1. [workspace]
  2. members = [
  3. "crates/globset",
  4. "crates/grep",
  5. "crates/cli",
  6. "crates/matcher",
  7. "crates/pcre2",
  8. "crates/printer",
  9. "crates/regex",
  10. "crates/searcher",
  11. "crates/ignore",
  12. ]
複製代碼

那末最外层的目次就是 ripgrep 的事情空間的根。

若一個 Cargo.toml 有 [workspace] 可是没有 [package] 部門,则它是虚拟清单類型的事情空間。

對付没有主 package 的場景或你但愿将所有的 package 组织在零丁的目次中時,這類方法就很是合适。

比方 rust-analyzer 就是如许的项目,它的根目次中的 Cargo.toml 中并無 [package],阐明该根目次不是一個 package,可是却有 [workspacke] :

  1. [workspace]
  2. members = ["xtask/", "lib/*", "crates/*"]
  3. exclude = ["crates/proc_macro_test/imp"]
複製代碼

連系 rust-analyzer 的目次结構可以看出,该事情空間的所有成员 package 都在零丁的目次中,是以這類方法很合适虚拟清单的事情空間。

事情空間的几個關头點在于:

Cargo.toml 中的 [workspace] 部門用于界说哪些 packages 属于事情空間的成员:

  1. [workspace]
  2. members = ["member1", "path/to/member2", "crates/*"]
  3. exclude = ["crates/foo", "path/to/other"]
複製代碼

若某個當地依靠包是經由過程 path 引入,且该包位于事情空間的目次中,则该包主动成為事情空間的成员。

残剩的成员必要經由過程 workspace.members 来指定,內里包括了各個成员地點的目次(成员目次中包括了 Cargo.toml )。

members 還支撑利用 glob 来匹配多個路径,比方上面的例子中利用 crates/* 匹配 crates 目次下的所有包。

exclude 可以将指定的目次解除在事情空間以外,比方仍是上面的例子,crates/* 在包括了 crates 目次下的所有包後,又經由過程 exclude 中 crates/foo 将 crates 下的 foo 目次解除在外。

你也能够将一個空的 [workspace] 直接结合 [package] 利用,比方:

  1. [package]
  2. name = "hello"
  3. version = "0.1.0"

  4. [workspace]
複製代碼

此時的事情空間的成员包括:

選擇事情空間有两種方法:Cargo 主动查找、手动指定 package.workspace 字段。

當位于事情空間的子目次中時,Cargo 會主动在该目次的父目次中寻觅带有 [workspace] 界说的 Cargo.toml,然後再决议利用哪一個事情空間。

咱們還可使用下面的法子来笼盖 Cargo 主动查找功效:将成员包中的 package.workspace 字段修改成事情區間根目次的位置,如许就可以顯式地讓一個成员利用指定的事情空間。

當做员不在事情空間的子目次下時,這類手动選擇事情空間的法子就很是合用。究竟结果 Cargo 的主动搜刮是沿着父目次往上查找,而成员其实不在事情空間的子目次下,這象征着顺着成员的父目次往上找是没法治療哮喘咳嗽,找到该事情空間的 Cargo.toml 的,此時就只妙手动指定了。

在事情空間中,package 相干的 Cargo 号令(比方 cargo build )可使用 -p 、 --package 或 --workspace 号令行参数来指定想要操作的 package。

若没有指定任何参数,则 Cargo 将利用當前事情目次的中的 package 。若事情目次是虚拟清单類型的事情空間,则该号令将感化在所有成员上(就仿佛是利用了 --workspace 号令行参数)。而 default-members 可以在号令行参数没有被供给時,手动指定操作的成员:

  1. [workspac戒檳榔神器,e]
  2. members = ["path/to/member1", "path/to/member2", "path/to/member3/*"]
  3. default-members = ["path/to/member2", "path/to/member3/foo"]
複製代碼

如许一来, cargo build 就不會利用到虚拟清单事情空間的所有成员,而是指定的成员上。

與 package.metadata 很是雷同,workspace治療椎間盤突出,.metadata 會被 Cargo 主动疏忽,就算没有被利用也不會發出告诫。

這個部門可以用于讓东西在 Cargo.toml 中存储一些事情空間的設置装备摆設元信息。比方:

  1. [workspace]
  2. members = ["member1", "member2"]

  3. [workspace.metadata.webcontents]
  4. root = "path/to/webproject"
  5. tool = ["npm", "run", "build"]
  6. # ...
複製代碼
  1. 弱弱的说一声:若文章對你有所帮忙,能否随手一赞,感激感激 :)
複製代碼
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|台北共享工作空間交流論壇  

音波拉皮, 支票借款, 票貼, 紙杯植纖碗廚餘回收廢鐵回收, 防盜, 樹林當舖, 抽脂價格, 楊梅當舖, 平鎮當舖中壢機車借款汽機車借款, 支票借款空壓機, 汽車借款免留車, 台北網頁設計, 當舖, 汽車借款, 台北市花店, 台北當舖, 未上市, 聯誼活動團體休閒彰化汽車借款, 慢性食物過敏檢測, 竹北週轉, 汐止汽車借款汐止當舖台北網頁設計, 夾克, 未上市, 支票借款, 新店當舖, 未上市股票, 未上市, 廚餘機中古沖床中古機械買賣, 團體服,

GMT+8, 2024-11-22 03:48 , Processed in 0.016916 second(s), 5 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表