|
一個事情空間是由多個 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] :
- [workspace]
- members = [
- "crates/globset",
- "crates/grep",
- "crates/cli",
- "crates/matcher",
- "crates/pcre2",
- "crates/printer",
- "crates/regex",
- "crates/searcher",
- "crates/ignore",
- ]
複製代碼
那末最外层的目次就是 ripgrep 的事情空間的根。
若一個 Cargo.toml 有 [workspace] 可是没有 [package] 部門,则它是虚拟清单類型的事情空間。
對付没有主 package 的場景或你但愿将所有的 package 组织在零丁的目次中時,這類方法就很是合适。
比方 rust-analyzer 就是如许的项目,它的根目次中的 Cargo.toml 中并無 [package],阐明该根目次不是一個 package,可是却有 [workspacke] :
- [workspace]
- members = ["xtask/", "lib/*", "crates/*"]
- exclude = ["crates/proc_macro_test/imp"]
複製代碼
連系 rust-analyzer 的目次结構可以看出,该事情空間的所有成员 package 都在零丁的目次中,是以這類方法很合适虚拟清单的事情空間。
事情空間的几個關头點在于:
Cargo.toml 中的 [workspace] 部門用于界说哪些 packages 属于事情空間的成员:
- [workspace]
- members = ["member1", "path/to/member2", "crates/*"]
- 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] 利用,比方:
- [package]
- name = "hello"
- version = "0.1.0"
- [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 可以在号令行参数没有被供给時,手动指定操作的成员:
- [workspac戒檳榔神器,e]
- members = ["path/to/member1", "path/to/member2", "path/to/member3/*"]
- default-members = ["path/to/member2", "path/to/member3/foo"]
複製代碼
如许一来, cargo build 就不會利用到虚拟清单事情空間的所有成员,而是指定的成员上。
與 package.metadata 很是雷同,workspace治療椎間盤突出,.metadata 會被 Cargo 主动疏忽,就算没有被利用也不會發出告诫。
這個部門可以用于讓东西在 Cargo.toml 中存储一些事情空間的設置装备摆設元信息。比方:
- [workspace]
- members = ["member1", "member2"]
- [workspace.metadata.webcontents]
- root = "path/to/webproject"
- tool = ["npm", "run", "build"]
- # ...
複製代碼- 弱弱的说一声:若文章對你有所帮忙,能否随手一赞,感激感激 :)
複製代碼 |
|