Zusammenfassung der Befehlszeile
Im Rahmen der Arbeit mit Arbeitsbereichen führt Cargo eine Funktionsvereinheitlichung durch: https://doc.rust-lang.org/cargo/reference/features.html#feature-unification
Was bedeutet das?
Angenommen, Sie haben einen Arbeitsbereich
[ workspace ]
members = [ " mega " , " potato " ]
Mit zwei Mitgliedern: mega
[ package ]
name = " mega "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " mega " ] }
Und potato
[ package ]
name = " potato "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " potato " ] }
Beide basieren auf einem gemeinsamen potatoer
eines Drittanbieters, verfügen jedoch über unterschiedliche Funktionen: mega
ist an der "mega"
-Funktion interessiert, potato
ist an der "potato"
-Funktion interessiert.
Wenn Sie verschiedene Befehle ausführen, benötigen Sie letztendlich mehrere verschiedene Versionen von potatoer
Crate.
Befehle für den gesamten Arbeitsbereich verwenden eine Version mit einheitlichen Funktionen:
cargo check # this will use potatoer with both "mega" and "potato"
Befehle, die auf einer einzelnen Kiste ausgeführt werden, verwenden Versionen ohne Vereinheitlichung:
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"
Wenn eine Abhängigkeit mit der erforderlichen Kombination nicht vorhanden ist, wird sie von Cargo kompiliert.
Eine Möglichkeit, dieses Problem zu vermeiden, besteht darin, sicherzustellen, dass Mitglieder eines Arbeitsbereichs, wenn sie von einer Kiste abhängig sind, mit denselben Funktionen von dieser abhängig sind. Die manuelle Wartung ist fehleranfällig und hier kommen hackerman hack
und hackerman restore
ins Spiel.
Bei Verwendung mit der Option --lock
nimmt hackerman
eine Prüfsumme aller Abhängigkeiten und speichert sie in der Datei Cargo.toml
unter ["package.metadata.hackerman.lock"]
und nachfolgende Aufrufe von check bestätigen, dass diese Prüfsumme noch gültig ist .
Dies ist erforderlich, um sicherzustellen, dass die ursprünglichen (nicht gehackten) Abhängigkeiten gespeichert werden und zu einem späteren Zeitpunkt wiederhergestellt werden können.
Es ist möglich, die Option --lock
in einer Cargo.toml
Datei fest zu codieren, die den Arbeitsbereich definiert:
[ workspace . metadata . hackerman ]
lock = true
Derzeit wird die Vereinheitlichung nur für das aktuelle Ziel und ohne Cross-Compilation-Unterstützung durchgeführt. Die automatische Aktualisierung für Workspace-TOML-Dateien funktioniert möglicherweise nicht, wenn Sie Abhängigkeiten mit einer anderen Syntax als nach Version oder {}
angeben:
potato = " 3.14 " # this is okay
banana = { version = " 3.14 " } # this is also okay
Behebt Zusammenführungs- und Rebase-Konflikte für von Hackerman geänderte Cargo.toml
Dateien
Um es zu verwenden, benötigen Sie so etwas
global .gitconfig
oder lokal .git/config
.
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
gitattributes
Datei, kann lokal pro Projekt oder global sein
Cargo.toml merge=hackerman
Um eine globale gitattributes
Datei zu erstellen, müssen Sie in der globalen Git-Konfiguration einen Pfad dazu angeben:
[core]
attributesfile = ~/.gitattributes
Hier vergleiche ich die Auswirkungen verschiedener Ansätze zur Vereinheitlichung auf einen Arbeitsbereich. Ohne Änderungen dauert die saubere Überprüfung des gesamten Arbeitsbereichs, die das Kompilieren aller externen Abhängigkeiten umfasst, 672 Sekunden.
Der Arbeitsbereich enthält eine Reihe von Crates, aus denen ich die Crates a
, b
, c
usw. ausgewählt habe, sodass Crate b
Crate a
importiert, Crate c
Crate b
usw. importiert. Crate a
enthält keine externen Abhängigkeiten, andere Crates dazu.
cargo hackerman hack
generiert und jeder Kiste werden neue Abhängigkeiten hinzugefügtBevor ich den Befehl ausführe, bereinige ich die Kompilierungsergebnisse und führe dann nacheinander Befehle für jede Spalte aus
Befehl | kein Hack | Hackermann | manueller Hack |
---|---|---|---|
check -pa | 0,86 s | 0,80s | 215,39 Sekunden |
check -pb | 211,30s | 240,15s | 113,56 Sekunden |
check -pc | 362,69s | 233,38 Sekunden | 176,73 Sekunden |
check -pd | 36,16 Sekunden | 0,24 s | 0,25 s |
check -pe | 385,35 Sekunden | 66,34 Sekunden | 375,22 Sekunden |
check | 267,06 Sekunden | 93,29 Sekunden | 81,50s |
gesamt | 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
↴ Eine Sammlung von Tools, die Ihnen helfen, Ihren Arbeitsbereich schnell zu kompilieren
Verwendung : cargo hackerman
COMMAND ...
Verfügbare Optionen:
-h
, --help
– Gibt Hilfeinformationen aus-V
, --version
– Gibt Versionsinformationen ausVerfügbare Befehle:
hack
– Crate-Abhängigkeiten zwischen einzelnen Crates im Arbeitsbereich vereinheitlichenrestore
– Entfernen Sie die durch den hack
-Befehl hinzugefügte Crate-Abhängigkeitsvereinheitlichungcheck
– Überprüfen Sie, ob eine Vereinheitlichung erforderlich ist und ob die Prüfsummen korrekt sindmerge
– Dateien wiederherstellen und mit dem Standard-Merge-Treiber zusammenführenexplain
– Erklären Sie, warum eine gewisse Abhängigkeit besteht. Sowohl die Funktion als auch die Version sind optionaldupes
– Listet alle Duplikate im Arbeitsbereich auftree
– Erstellen Sie einen Baum aus Abhängigkeitenshow
– Crate-Manifest, Readme, Repository oder Dokumentation anzeigen Sie können --help
zweimal übergeben, um detailliertere Hilfe zu erhalten
Vereinheitlichen Sie Crate-Abhängigkeiten zwischen einzelnen Crates im Arbeitsbereich
Verwendung : cargo hackerman
hack
CARGO_OPTS
[ --dry
] [ --lock
] [ -D
]
Sie können diese Änderungen mit cargo hackerman restore
rückgängig machen.
Frachtoptionen:
--manifest-path
= PATH
– Pfad zur Datei Cargo.toml--frozen
– Cargo.lock und Cache müssen auf dem neuesten Stand sein--locked
– Cargo.lock muss auf dem neuesten Stand sein--offline
– Ohne Zugriff auf das Netzwerk ausführen-v
, --verbose
– Ausführlichkeit erhöhen, kann mehrmals verwendet werdenVerfügbare Optionen:
--dry
– Aktion nicht ausführen, nur anzeigen
--lock
– Prüfsumme der Abhängigkeiten in den Stash einbeziehen
Dadurch wird sichergestellt, dass Sie zu den ursprünglichen (nicht gehackten) Abhängigkeiten zurückkehren können: Um die ursprünglichen Abhängigkeiten wiederherstellen zu können, muss Hackerman sie in der Datei Cargo.toml
speichern. Wenn CI eine Nichtübereinstimmung der Prüfsummen erkennt, bedeutet dies, dass Abhängigkeiten von gehackten Quellen aktualisiert wurden. Sie sollten sie stattdessen wiederherstellen, aktualisieren und erneut hacken.
Sie können das Sperren zum Standardverhalten machen, indem Sie es im Arbeitsbereich zu Cargo.toml
hinzufügen
[workspace.metadata.hackerman]
lock = true
-D
, --no-dev
– Entwicklerabhängigkeiten nicht vereinheitlichen
-h
, --help
– Gibt Hilfeinformationen aus
cargo-hackerman hack
berechnet und fügt allen Arbeitsbereichsmitgliedern einen minimalen Satz zusätzlicher Abhängigkeiten hinzu, sodass die Funktionen aller Abhängigkeiten dieser Kiste gleich bleiben, wenn sie als Teil des gesamten Arbeitsbereichs oder allein verwendet wird.
Sobald Abhängigkeiten gehackt wurden, sollten Sie sie wiederherstellen, bevor Sie Änderungen vornehmen.
Entfernen Sie die durch den hack
-Befehl hinzugefügte Vereinheitlichung der Crate-Abhängigkeit
Verwendung : cargo hackerman
stellt CARGO_OPTS
[ TOML
] restore
...
Frachtoptionen:
--manifest-path
= PATH
– Pfad zur Datei Cargo.toml--frozen
– Cargo.lock und Cache müssen auf dem neuesten Stand sein--locked
– Cargo.lock muss auf dem neuesten Stand sein--offline
– Ohne Zugriff auf das Netzwerk ausführen-v
, --verbose
– Ausführlichkeit erhöhen, kann mehrmals verwendet werdenVerfügbare Positionselemente:
TOML
– Stellen Sie einzelne Dateien anstelle des gesamten Arbeitsbereichs wieder herVerfügbare Optionen:
-h
, --help
– Gibt Hilfeinformationen aus Prüfen Sie, ob eine Vereinheitlichung erforderlich ist und ob die Prüfsummen korrekt sind
Ähnlich wie cargo-hackerman hack --dry
, setzt aber auch den Exit-Status auf 1, sodass Sie ihn als Teil des CI-Prozesses verwenden können
Verwendung : cargo hackerman
check
CARGO_OPTS
[ -D
]
Frachtoptionen:
--manifest-path
= PATH
– Pfad zur Datei Cargo.toml--frozen
– Cargo.lock und Cache müssen auf dem neuesten Stand sein--locked
– Cargo.lock muss auf dem neuesten Stand sein--offline
– Ohne Zugriff auf das Netzwerk ausführen-v
, --verbose
– Ausführlichkeit erhöhen, kann mehrmals verwendet werdenVerfügbare Optionen:
-D
, --no-dev
– Entwicklerabhängigkeiten nicht vereinheitlichen-h
, --help
– Gibt Hilfeinformationen aus Dateien wiederherstellen und mit dem Standard-Merge-Treiber zusammenführen
Verwendung : cargo hackerman
merge
BASE
REMOTE
LOCAL
RESULT
Verfügbare Optionen:
-h
, --help
– Gibt Hilfeinformationen aus Um es zu verwenden, würden Sie so etwas zu ~/.gitconfig
oder .git/config
hinzufügen
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
Und so etwas in der Art zu .git/gitattributes
Cargo.toml merge=hackerman
Erklären Sie, warum eine gewisse Abhängigkeit besteht. Sowohl die Funktion als auch die Version sind optional
Verwendung : cargo hackerman
explain
CARGO_OPTS
[ -T
] [ -P
] [ -s
] CRATE
[ FEATURE
] [ VERSION
]
Frachtoptionen:
--manifest-path
= PATH
– Pfad zur Datei Cargo.toml--frozen
– Cargo.lock und Cache müssen auf dem neuesten Stand sein--locked
– Cargo.lock muss auf dem neuesten Stand sein--offline
– Ohne Zugriff auf das Netzwerk ausführen-v
, --verbose
– Ausführlichkeit erhöhen, kann mehrmals verwendet werdenVerfügbare Optionen:
-T
, --no-transitive-opt
– Redundante Links werden nicht entfernt-P
, --package-nodes
– Paketknoten anstelle von Feature-Knoten verwenden-s
, --stdout
– Dot-Datei auf stdout drucken, anstatt xdot
zu erzeugen-h
, --help
– Gibt Hilfeinformationen ausBei einer großen Anzahl von Abhängigkeiten kann es schwierig sein zu sagen, warum genau eine Sub-Sub-Sub-Abhängigkeit enthalten ist. Hackerman Explain löst dieses Problem, indem es die Abhängigkeitskette vom Ziel bis zum Arbeitsbereich verfolgt.
explain
beginnt bei einer bestimmten Kiste/Funktion und folgt umgekehrten Abhängigkeitsverknüpfungen, bis es alle Kreuzungspunkte mit dem Arbeitsbereich erreicht, ohne jedoch den Arbeitsbereich selbst zu betreten.
Weiße Knoten stellen Arbeitsbereichsmitglieder dar, runde Knoten stellen Features dar, achteckige Knoten stellen Basiskisten dar. Die gepunktete Linie stellt die reine Entwicklerabhängigkeit dar, die gestrichelte Linie stellt sowohl die Dev- als auch die normale Abhängigkeit dar, jedoch mit unterschiedlichen Merkmalen. Das Ziel wird normalerweise hervorgehoben. Standardmäßig erweitert Hackerman die Info-Feature-Knoten von Paketen, die mit -P
zurückgesetzt werden können, und versucht, transitive Abhängigkeiten zu reduzieren, um den Baum besser lesbar zu halten – dies kann mit -T
zurückgesetzt werden.
Wenn eine Kiste in mehreren Versionen vorhanden ist, können Sie die Version angeben, an der Sie interessiert sind. Dies ist jedoch optional.
Sie können auch angeben, nach welcher Funktion gesucht werden soll, andernfalls sucht Hackerman nach allen.
Listet alle Duplikate im Arbeitsbereich auf
Verwendung : cargo hackerman
dupes
CARGO_OPTS
Frachtoptionen:
--manifest-path
= PATH
– Pfad zur Datei Cargo.toml--frozen
– Cargo.lock und Cache müssen auf dem neuesten Stand sein--locked
– Cargo.lock muss auf dem neuesten Stand sein--offline
– Ohne Zugriff auf das Netzwerk ausführen-v
, --verbose
– Ausführlichkeit erhöhen, kann mehrmals verwendet werdenVerfügbare Optionen:
-h
, --help
– Gibt Hilfeinformationen aus Machen Sie einen Baum aus Abhängigkeiten
Verwendung : cargo hackerman
tree
CARGO_OPTS
[ -T
] [ -D
] [ -P
] [ -w
] [ -s
] [ CRATE
] [ FEATURE
] [ VERSION
]
Frachtoptionen:
--manifest-path
= PATH
– Pfad zur Datei Cargo.toml--frozen
– Cargo.lock und Cache müssen auf dem neuesten Stand sein--locked
– Cargo.lock muss auf dem neuesten Stand sein--offline
– Ohne Zugriff auf das Netzwerk ausführen-v
, --verbose
– Ausführlichkeit erhöhen, kann mehrmals verwendet werdenVerfügbare Optionen:
-T
, --no-transitive-opt
– Redundante Links werden nicht entfernt-D
, --no-dev
– Keine Entwicklungsabhängigkeiten einbeziehen-P
, --package-nodes
– Paketknoten anstelle von Feature-Knoten verwenden-w
, --workspace
– Im Arbeitsbereich bleiben-s
, --stdout
– Dot-Datei auf stdout drucken, anstatt xdot
zu erzeugen-h
, --help
– Gibt Hilfeinformationen ausBeispiele:
cargo hackerman tree rand 0.8.4
cargo hackerman tree serde_json preserve_order
Crate-Manifest, Readme, Repository oder Dokumentation anzeigen
Verwendung : cargo hackerman
show
CARGO_OPTS
[ -m
| -r
| -d
| -R
] CRATE
[ VERSION
]
Frachtoptionen:
--manifest-path
= PATH
– Pfad zur Datei Cargo.toml--frozen
– Cargo.lock und Cache müssen auf dem neuesten Stand sein--locked
– Cargo.lock muss auf dem neuesten Stand sein--offline
– Ohne Zugriff auf das Netzwerk ausführen-v
, --verbose
– Ausführlichkeit erhöhen, kann mehrmals verwendet werdenVerfügbare Optionen:
-m
, --manifest
– Crate-Manifest anzeigen-r
, --readme
– Crate-Readme anzeigen-d
, --doc
– Dokumentations-URL öffnen-R
, --repository
– Repository-h
, --help
– Gibt Hilfeinformationen ausBeispiele:
cargo hackerman show --repository syn