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

標題: Rust Cargo使用指南 [打印本頁]

作者: admin    時間: 2023-10-23 18:24
標題: Rust Cargo使用指南
一個事情空間是由多個 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. 弱弱的说一声:若文章對你有所帮忙,能否随手一赞,感激感激 :)
複製代碼





歡迎光臨 台北共享工作空間交流論壇 (https://bbs.tdudu.com.tw/) Powered by Discuz! X3.3