コマンドラインの概要
ワークスペースの操作の一環として、カーゴは機能の統合を実行します: https://doc.rust-lang.org/cargo/reference/features.html#feature-unification
これはどういう意味ですか?
ワークスペースがあるとします。
[ workspace ]
members = [ " mega " , " potato " ]
メンバー2名: 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"
単一のクレートで動作するコマンドは、統一されていないバージョンを使用します。
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 がそれをコンパイルします。
この問題を回避する 1 つの方法は、ワークスペースのメンバーがクレートに依存している場合、同じ機能セットでクレートに依存していることを確認することです。手作業でメンテナンスするとエラーが発生しやすく、そんなときこそ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
ハッカーマンによって変更された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 config 内でそのファイルへのパスを指定する必要があります。
[core]
attributesfile = ~/.gitattributes
ここでは、ワークスペースの統合に対するさまざまなアプローチの効果を比較しています。変更を加えない場合、すべての外部依存関係のコンパイルを伴うワークスペース全体のクリーン チェックには 672 秒かかります。
ワークスペースには多数のクレートが含まれており、そこからクレートa
、 b
、 c
などを選択しました。クレートb
クレートa
をインポートし、クレートc
クレートb
インポートします。クレートa
には外部依存関係が含まれず、他のクレートには外部依存関係が含まれません。
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
— ワークスペース内の個々のクレート間でクレートの依存関係を統合するrestore
— hack
コマンドによって追加されたクレート依存関係の統合を削除しますcheck
— 統合が必要かどうか、およびチェックサムが正しいかどうかを確認しますmerge
— ファイルを復元し、デフォルトのマージ ドライバーを使用してマージします。explain
— 依存関係が存在する理由を説明します。機能とバージョンは両方ともオプションですdupes
— ワークスペース内のすべての重複をリストします。tree
— 依存関係からツリーを作成するshow
— クレートマニフェスト、readme、リポジトリ、またはドキュメントを表示します。 --help
2 回渡すと、より詳細なヘルプが表示されます。
ワークスペース内の個々のクレート間でクレートの依存関係を統合する
使用法: 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
コマンドによって追加されたクレート依存関係の統合を削除します
使用法: 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
BASE
LOCAL
REMOTE
RESULT
merge
利用可能なオプション:
-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
を生成する代わりにドット ファイルを stdout に出力します。-h
、 --help
— ヘルプ情報を出力します。依存関係が大量にある場合、サブサブサブサブ依存関係が含まれている理由を正確に伝えるのは難しい場合があります。 hackerman Explain は、ターゲットからワークスペースまでの依存関係チェーンをトレースすることで、この問題を解決します。
explain
、指定されたクレート/フィーチャーから開始され、ワークスペース自体には入らずに、ワークスペースとのすべての交差点に到達するまで逆依存関係リンクをたどります。
白いノードはワークスペースのメンバーを表し、丸いノードはフィーチャを表し、八角形のノードは基本クレートを表します。点線は開発のみの依存関係を表し、破線は開発と通常の両方の依存関係を表しますが、それらの間には異なる機能があります。通常、ターゲットは強調表示されます。デフォルトでは、ハッカーマンは-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
— dev の依存関係を含めません。-P
、 --package-nodes
— 機能ノードの代わりにパッケージ ノードを使用します-w
、 --workspace
— ワークスペース内に保持します-s
、 --stdout
— xdot
を生成する代わりにドット ファイルを stdout に出力します。-h
、 --help
— ヘルプ情報を出力します。例:
cargo hackerman tree rand 0.8.4
cargo hackerman tree serde_json preserve_order
クレートマニフェスト、readme、リポジトリ、またはドキュメントを表示します
使用法: 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
— クレートの Readme を表示します-d
、 --doc
— ドキュメントの URL を開く-R
、 --repository
— リポジトリ-h
、 --help
— ヘルプ情報を出力します。例:
cargo hackerman show --repository syn