命令列總結
作為使用工作空間的一部分,Cargo 執行功能統一:https://doc.rust-lang.org/cargo/reference/features.html#feature-unification
這意味著什麼?
假設您有一個工作空間
[ workspace ]
members = [ " mega " , " potato " ]
擁有兩名成員: mega
[ package ]
name = " mega "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " mega " ] }
還有potato
[ package ]
name = " potato "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " potato " ] }
兩者都依賴一個常見的第三方potatoer
但具有不同的功能: mega
對"mega"
功能感興趣, potato
對"potato"
功能感興趣。
當您執行不同的命令時,您最終需要幾個不同版本的potatoer
crate。
整個工作區命令將使用具有統一功能的版本:
cargo check # this will use potatoer with both "mega" and "potato"
在單一 crate 上執行的命令將使用不統一的版本:
cargo check -p mega # this will use potatoer with "mega" feature
cargo check -p potatoer # this will use potatoer with "potato" feature
cargo check -p mega -p potato # this will require both "mega" and "potato"
如果不存在具有所需組合的依賴項 - Cargo 將對其進行編譯。
避免此問題的一種方法是確保工作區的成員是否依賴於一個 crate - 他們依賴它具有相同的功能集。手動維護很容易出錯,這時候就需要hackerman hack
和hackerman restore
了。
當與--lock
選項一起使用時, hackerman
將取得所有依賴項的校驗和,並將其保存在["package.metadata.hackerman.lock"]
下的Cargo.toml
檔案中,後續呼叫檢查將確認此校驗和仍然有效。
這是為了確保保存原始(未破解的)依賴項並可以在以後恢復。
可以在定義工作區的Cargo.toml
檔案中對--lock
選項進行硬編碼:
[ workspace . metadata . hackerman ]
lock = true
目前,僅針對目前目標執行統一,沒有交叉編譯支援。如果您使用與版本或{}
不同的語法指定依賴項,則工作區 toml 檔案的自動更新可能無法運作:
potato = " 3.14 " # this is okay
banana = { version = " 3.14 " } # this is also okay
解決由 hackerman 更改的Cargo.toml
檔案的合併和變基衝突
要使用它,你需要這樣的東西
全域.gitconfig
或本機.git/config
。
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
gitattributes
文件,可以是每個專案的本機文件或全域文件
Cargo.toml merge=hackerman
要建立全域gitattributes
文件,您需要在全域 git 配置中指定它的路徑:
[core]
attributesfile = ~/.gitattributes
在這裡,我比較了不同的統一方法對工作空間的影響。在沒有任何變更的情況下,對整個工作區進行徹底檢查(涉及編譯所有外部依賴項)需要 672 秒。
工作區包含一堆板條箱,我從中選擇了板條箱a
、 b
、 c
等, a
板條箱b
導入板條箱a
,板條箱c
導入板條箱b
等。包含外部依賴項,其他板條箱不包含外部相依性。
cargo hackerman hack
命令產生的,並且新的依賴項被添加到每個板條箱中在執行命令之前,我先清理編譯結果,然後按順序清理每個列的命令
命令 | 沒有駭客 | 駭客 | 手動破解 |
---|---|---|---|
check -pa | 0.86秒 | 0.80秒 | 215.39秒 |
check -pb | 211.30秒 | 240.15秒 | 113.56秒 |
check -pc | 362.69秒 | 233.38秒 | 176.73秒 |
check -pd | 36.16秒 | 0.24秒 | 0.25秒 |
check -pe | 385.35秒 | 66.34秒 | 375.22秒 |
check | 267.06秒 | 93.29秒 | 81.50秒 |
全部的 | 1263.42 | 634.20 | 962.65 |
cargo hackerman
↴cargo hackerman hack
↴cargo hackerman restore
↴cargo hackerman check
↴cargo hackerman merge
↴cargo hackerman explain
↴cargo hackerman dupes
↴cargo hackerman tree
↴cargo hackerman show
↴ 幫助您的工作區快速編譯的工具集合
用法: cargo hackerman
COMMAND ...
可用選項:
-h
, --help
— 列印幫助訊息-V
, --version
— 列印版本訊息可用指令:
hack
— 統一工作區中各個 crate 之間的 crate 依賴關係restore
- 刪除由hack
命令添加的板條箱依賴統一check
— 檢查是否需要統一以及校驗和是否正確merge
— 恢復檔案並使用預設合併驅動程式合併explain
——解釋為什麼存在某種依賴。功能和版本都是可選的dupes
— 列出工作區中的所有重複項tree
— 根據依賴關係建立一棵樹show
— 顯示板條箱清單、自述文件、儲存庫或文檔您可以通過--help
兩次以獲得更詳細的幫助
統一工作區中各個 crate 之間的 crate 依賴關係
用法: cargo hackerman
hack
CARGO_OPTS
[ --dry
] [ --lock
] [ -D
]
您可以使用cargo hackerman restore
撤銷這些變更。
貨物選擇:
--manifest-path
= PATH
— Cargo.toml 檔案的路徑--frozen
— 要求 Cargo.lock 和快取是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不訪問網路即可運行-v
, --verbose
— 增加詳細程度,可以使用多次可用選項:
--dry
— 不執行操作,只顯示它
--lock
— 將依賴項校驗和包含到儲存中
這有助於確保您可以返回原始(未破解的)依賴項:為了能夠恢復原始依賴項,駭客需要將它們隱藏在Cargo.toml
檔案中。如果 CI 偵測到校驗和不匹配,則表示對被駭源的依賴項已更新。相反,您應該恢復它們、更新並再次破解。
您可以透過將其新增至工作區中的Cargo.toml
來設定鎖定預設行為
[workspace.metadata.hackerman]
lock = true
-D
, --no-dev
— 不統一開發依賴
-h
, --help
— 列印幫助訊息
cargo-hackerman hack
計算並為所有工作區成員添加一組最小的額外依賴項,以便當該板條箱用作整個工作區的一部分或單獨使用時,該板條箱的所有依賴項的功能保持不變。
一旦依賴項被駭客攻擊,您應該在進行任何更改之前恢復它們。
刪除hack
指令新增的 crate 依賴統一
用法: cargo hackerman
restore
CARGO_OPTS
[ TOML
]...
貨物選擇:
--manifest-path
= PATH
— Cargo.toml 檔案的路徑--frozen
— 要求 Cargo.lock 和快取是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不訪問網路即可運行-v
, --verbose
— 增加詳細程度,可以使用多次可用的位置項目:
TOML
— 復原單一檔案而非整個工作區可用選項:
-h
, --help
— 列印幫助訊息檢查是否需要統一以及校驗和是否正確
與cargo-hackerman hack --dry
類似,但也將退出狀態設為 1,以便您可以將其用作 CI 流程的一部分
用法: cargo hackerman
check
CARGO_OPTS
[ -D
]
貨物選擇:
--manifest-path
= PATH
— Cargo.toml 檔案的路徑--frozen
— 要求 Cargo.lock 和快取是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不訪問網路即可運行-v
, --verbose
— 增加詳細程度,可以使用多次可用選項:
-D
, --no-dev
— 不統一開發依賴-h
, --help
— 列印幫助訊息恢復檔案並使用預設合併驅動程式合併
用法: cargo hackerman
merge
BASE
LOCAL
REMOTE
RESULT
可用選項:
-h
, --help
— 列印幫助訊息要使用它,您可以將類似的內容新增至~/.gitconfig
或.git/config
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
和.git/gitattributes
類似
Cargo.toml merge=hackerman
解釋為什麼存在某種依賴性。功能和版本都是可選的
用法: cargo hackerman
explain
CARGO_OPTS
[ -T
] [ -P
] [ -s
] CRATE
[ FEATURE
] [ VERSION
]
貨物選擇:
--manifest-path
= PATH
— Cargo.toml 檔案的路徑--frozen
— 要求 Cargo.lock 和快取是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不訪問網路即可運行-v
, --verbose
— 增加詳細程度,可以使用多次可用選項:
-T
, --no-transitive-opt
— 不要刪除冗餘鏈接-P
, --package-nodes
— 使用套件節點而非功能節點-s
, --stdout
— 將點檔案列印到標準輸出而不是產生xdot
-h
, --help
— 列印幫助訊息由於存在大量依賴項,可能很難判斷為什麼包含某些子子子依賴項。 hackerman 解釋透過追蹤從目標到工作區的依賴鏈解決了這個問題。
explain
從給定的板條箱/功能開始,並遵循反向依賴鏈接,直到到達與工作區的所有交叉點,但不進入工作區本身。
白色節點代表工作區成員,圓形節點代表特徵,八角形節點代表基礎板條箱。虛線代表僅開發依賴項,虛線代表開發版和普通版,但具有不同的功能。目標通常會突出顯示。預設情況下,hackerman 擴展可以使用-P
恢復的套件資訊功能節點,並嘗試減少傳遞依賴性以保持樹更具可讀性 - 這可以使用-T
恢復。
如果一個板條箱存在多個版本,您可以指定您感興趣的版本,但它是可選的。
您也可以指定要尋找的功能,否則駭客將尋找所有功能。
列出工作區中的所有重複項
用法: cargo hackerman
dupes
CARGO_OPTS
貨物選擇:
--manifest-path
= PATH
— Cargo.toml 檔案的路徑--frozen
— 要求 Cargo.lock 和快取是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不訪問網路即可運行-v
, --verbose
— 增加詳細程度,可以使用多次可用選項:
-h
, --help
— 列印幫助訊息從依賴關係中創建一棵樹
用法: cargo hackerman
tree
CARGO_OPTS
[ -T
] [ -D
] [ -P
] [ -w
] [ -s
] [ CRATE
] [ FEATURE
] [ VERSION
]
貨物選擇:
--manifest-path
= PATH
— Cargo.toml 檔案的路徑--frozen
— 要求 Cargo.lock 和快取是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不訪問網路即可運行-v
, --verbose
— 增加詳細程度,可以使用多次可用選項:
-T
, --no-transitive-opt
— 不要刪除冗餘鏈接-D
, --no-dev
— 不包含開發依賴項-P
, --package-nodes
— 使用套件節點而非功能節點-w
, --workspace
— 保留在工作空間內-s
, --stdout
— 將點檔案列印到標準輸出而不是產生xdot
-h
, --help
— 列印幫助訊息範例:
cargo hackerman tree rand 0.8.4
cargo hackerman tree serde_json preserve_order
顯示套件清單、自述文件、儲存庫或文檔
用法: cargo hackerman
show
CARGO_OPTS
[ -m
| -r
| -d
| -R
] CRATE
[ VERSION
]
貨物選擇:
--manifest-path
= PATH
— Cargo.toml 檔案的路徑--frozen
— 要求 Cargo.lock 和快取是最新的--locked
— 要求 Cargo.lock 是最新的--offline
— 不訪問網路即可運行-v
, --verbose
— 增加詳細程度,可以使用多次可用選項:
-m
, --manifest
— 顯示板條箱清單-r
, --readme
— 顯示箱自述文件-d
, --doc
— 開啟文件 URL-R
, --repository
— 儲存庫-h
, --help
— 列印幫助訊息範例:
cargo hackerman show --repository syn