Cargo 不穩(wěn)定的功能

2021-09-27 14:31 更新

Unstable Features

不穩(wěn)定的特性

實(shí)驗(yàn)性 Cargo 特性僅適用于夜間通道(Rust 的 nightly 版本)。您通常使用-Z帶其中一個(gè)特性,以啟用它們。運(yùn)行cargo -Z help查看可用的標(biāo)志列表。

-Z unstable-options是用于啟用其他不穩(wěn)定命令行標(biāo)志的通用標(biāo)志。需要的此選項(xiàng)將在下面列出。

某些不穩(wěn)定的特性需要您,在Cargo.toml指定cargo-features字段。

Alternate Registries

替換(/備用)注冊(cè)表

備用注冊(cè)表,允許您使用 crates.io 以外的注冊(cè)表。

注冊(cè)表的名稱定義在.cargo/config中,registries表格的下面:

[registries]
my-registry = { index = "https://my-intranet:8080/git/index" }

可以在.cargo/credentials添加備用注冊(cè)表的身份驗(yàn)證信息:

[registries.my-registry]
token = "api-token"

Cargo.toml里面,您可以使用指定registry字段,讓某個(gè)依賴項(xiàng)來(lái)自哪個(gè)注冊(cè)表。但首先,您需要在文件的頂部包含適當(dāng)?shù)?code>cargo-features:

cargo-features = ["alternative-registries"]

[package]
...

[dependencies]
other-create = { version = "1.0", registry = "my-registry"}

一個(gè)--registry標(biāo)志 已添加到與注冊(cè)表交互的publish,login等命令中。示例:

cargo +nightly publish -Z unstable-options --registry my-registry

Cargo.toml的 publish 字段,已被擴(kuò)展為接受限制為發(fā)布到這些注冊(cè)表的注冊(cè)表列表。

[package]
...
publish = ["my-registry"]

publish-lockfile

發(fā)布-鎖文件

創(chuàng)建.crate文件分發(fā)時(shí),Cargo 歷史上不包括Cargo.lock文件。這可能會(huì)導(dǎo)致cargo install用于二進(jìn)制文件的問(wèn)題。您可以在cargo package要么cargo publish使用時(shí),指定您的包應(yīng)包含Cargo.lock,方法是在Cargo.toml中指定publish-lockfile字段。這也需要適當(dāng)?shù)?code>cargo-features要求:

cargo-features = ["publish-lockfile"]

[package]
...
publish-lockfile = true

Offline Mode

離線模式

-Z offline標(biāo)志 可防止 Cargo 因任何原因嘗試訪問(wèn)網(wǎng)絡(luò)。通常情況下,如果 Cargo 要訪問(wèn)網(wǎng)絡(luò)但它不可用,則會(huì)因錯(cuò)誤而停止。

請(qǐng)注意,這可能會(huì)導(dǎo)致與在線模式不同的依賴項(xiàng)解析。即使可能有索引的較新版本的本地副本,Cargo 也會(huì)將自己限制在本地可用的箱(crate)中。

no-index-update

無(wú)索引更新

-Z no-index-update標(biāo)志 確保 Cargo 不會(huì)嘗試更新注冊(cè)表索引。這適用于測(cè)試(調(diào)制)許多 Cargo 命令的 Crater 等工具,并且您希望每次都避免更新索引的網(wǎng)絡(luò)延遲。

avoid-dev-deps

阻止 開(kāi)發(fā)依賴項(xiàng)

  • 原始問(wèn)題:#4988
  • 穩(wěn)定問(wèn)題:#5133

運(yùn)行命令如cargo install要么cargo build時(shí),Cargo 當(dāng)前會(huì)需要下載 dev 依賴項(xiàng),即使它們未被使用。而該-Z avoid-dev-deps標(biāo)志 則讓 Cargo 避免在不需要時(shí)下載 dev 依賴項(xiàng)。該Cargo.lock如果跳過(guò)了 dev-dependencies,將不會(huì)生成相關(guān)信息。

minimal-versions

最小的版本

當(dāng)一個(gè)Cargo.lock文件被生成,-Z minimal-versions標(biāo)志的使用, 將解析依賴關(guān)系為滿足要求的最小 semver 版本(而不是最高版本)。

此標(biāo)志的預(yù)期用例,是在持續(xù)集成期間,檢查 Cargo.toml 中指定的版本是否是您實(shí)際使用的最低版本的正確反映。也就是說(shuō),如果 Cargo.toml 有foo = "1.0.0"說(shuō)明,那您依賴該特性,不會(huì)意外地添加foo 1.5.0。

out-dir

輸出目錄

此功能允許您指定,構(gòu)建工件后,將復(fù)制到的目錄。通常,工件只寫(xiě)入target/release要么target/debug目錄。但是,確定明確的文件名可能很棘手,因?yàn)槟枰馕?JSON 輸出。而該--out-dir標(biāo)志 可以更容易地預(yù)測(cè)訪問(wèn)工件。但是請(qǐng)注意,工件只是被復(fù)制,因此原件仍在target目錄.例:

cargo +nightly build --out-dir=out -Z unstable-options

Profile Overrides

覆蓋配置

可以為特定包和自定義生成腳本覆蓋配置文件。一般格式如下:

cargo-features = ["profile-overrides"]

[package]
...

[profile.dev]
opt-level = 0
debug = true

# 這個(gè) `image` 箱 會(huì)編譯的等級(jí) -Copt-level=3
[profile.dev.overrides.image]
opt-level = 3

# 所有 依賴項(xiàng) (但 不是 箱本身 或 某些工作區(qū)成員)
# 會(huì)編譯的等級(jí) -Copt-level=2 。 其中包括 構(gòu)建依賴項(xiàng).
[profile.dev.overrides."*"]
opt-level = 2

# 構(gòu)建 腳本和他們的 依賴項(xiàng), 會(huì)編譯的等級(jí) -Copt-level=3
# 默認(rèn)情況, 構(gòu)建 腳本 對(duì)剩下的配置使用相同的選擇
[profile.dev.build-override]
opt-level = 3

能只為 dev 和 release 配置文件指定覆蓋。

Config Profiles

配置 配置文件 (第一個(gè)動(dòng)詞,第二個(gè)名詞)

可以在.cargo/config文件中指定配置文件。該-Z config-profile命令行標(biāo)志是使用此功能所必需的。格式與一個(gè) Cargo.toml清單格式相同。如果在多個(gè)文件中找到相同的配置,則通過(guò)使用常規(guī)設(shè)置配置層次結(jié)構(gòu)合并。配置設(shè)置優(yōu)先于清單設(shè)置。

[profile.dev]
opt-level = 3
cargo +nightly build -Z config-profile

Namespaced features

特性的命名區(qū)間化

目前,不可能在清單中具有相同名稱的特性和依賴項(xiàng)。但如果你設(shè)置namespaced-featurestrue,功能和依賴項(xiàng)的命名空間就會(huì)是分開(kāi)的。這樣做的結(jié)果是,在特性請(qǐng)求中,依賴項(xiàng)必須以crate:為前綴。像這樣:

[package]
namespaced-features = true

[features]
bar = ["crate:baz", "foo"]
foo = []

[dependencies]
baz = { version = "0.1", optional = true }

為了防止不必要的,必須為每個(gè)可選依賴項(xiàng)顯式聲明特性的模版,將為任何不是定義為相同名稱的特性,的可選依賴項(xiàng)創(chuàng)建隱式特性。但是,如果定義了與依賴項(xiàng)同名的特性,則該特性必須將依賴項(xiàng)作為必需項(xiàng),正如foo = ["crate:foo"]。

Build-plan

構(gòu)建計(jì)劃

build命令的--build-plan參數(shù),將輸出 JSON,其中包含有關(guān)將運(yùn)行哪些命令,和不實(shí)際執(zhí)行任何操作的信息。與其他構(gòu)建工具集成時(shí),這可能很有用。例:

cargo +nightly build --build-plan -Z unstable-options

default-run

默認(rèn)運(yùn)行

清單中[package]部分的該default-run選項(xiàng),可用于指定cargo run選擇的默認(rèn)二進(jìn)制文件。例如,當(dāng)存在src/bin/a.rssrc/bin/b.rs兩者時(shí),選擇前者:

[package]
default-run = "a"

Metabuild

元構(gòu)建

Metabuild 是一個(gè)具有聲明性構(gòu)建腳本的特性。作為不去寫(xiě)一個(gè)build.rs腳本,而是您在Cargo.toml中的metabuild字段,指定構(gòu)建依賴項(xiàng)列表。其將自動(dòng)生成一個(gè)構(gòu)建腳本,該腳本按順序運(yùn)行每個(gè)構(gòu)建依賴項(xiàng)。然后,Metabuild 包可以從Cargo.toml中讀取元數(shù)據(jù),執(zhí)行他們的指定行為。

需要包括cargo-featuresCargo.toml的頂部, 一個(gè)metadata字段在package下,列出build-dependencies依賴項(xiàng),并添加 metabuild 包所需的任何元數(shù)據(jù)。例:

cargo-features = ["metabuild"]

[package]
name = "mypackage"
version = "0.0.1"
metabuild = ["foo", "bar"]

[build-dependencies]
foo = "1.0"
bar = "1.0"

[package.metadata.foo]
extra-info = "qwerty"

Metabuild 包應(yīng)該有一個(gè)名metabuild為的公共函數(shù),它會(huì)執(zhí)行與常規(guī)build.rs腳本一樣,執(zhí)行相同操作。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)