admin 發表於 2023-10-23 18:24:49

Rust Cargo使用指南

一個事情空間是由多個 package 構成的调集,它們同享統一個 Cargo.lock 文件、输出目次和一些設置(比方 profiles : 编译器設置和優化)。構成事情空間的 packages 被称之為事情空間的成员。

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

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

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

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

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


members = [
"crates/globset",
"crates/grep",
"crates/cli",
"crates/matcher",
"crates/pcre2",
"crates/printer",
"crates/regex",
"crates/searcher",
"crates/ignore",
]
那末最外层的目次就是 ripgrep 的事情空間的根。

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

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

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


members = ["xtask/", "lib/*", "crates/*"]
exclude = ["crates/proc_macro_test/imp"]
連系 rust-analyzer 的目次结構可以看出,该事情空間的所有成员 package 都在零丁的目次中,是以這類方法很合适虚拟清单的事情空間。

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

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


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 目次解除在外。

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


name = "hello"
version = "0.1.0"


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

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

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

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

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

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

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


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 中存储一些事情空間的設置装备摆設元信息。比方:


members = ["member1", "member2"]


root = "path/to/webproject"
tool = ["npm", "run", "build"]
# ...
弱弱的说一声:若文章對你有所帮忙,能否随手一赞,感激感激 :)
頁: [1]
查看完整版本: Rust Cargo使用指南