Résumé de la ligne de commande
Dans le cadre de son travail avec les espaces de travail, Cargo effectue l'unification des fonctionnalités : https://doc.rust-lang.org/cargo/reference/features.html#feature-unification
Qu'est-ce que cela signifie?
Supposons que vous ayez un espace de travail
[ workspace ]
members = [ " mega " , " potato " ]
Avec deux membres : mega
[ package ]
name = " mega "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " mega " ] }
Et potato
[ package ]
name = " potato "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " potato " ] }
Les deux dépendent d'un potatoer
en caisse tiers commun mais avec des fonctionnalités différentes : mega
s'intéresse à la fonctionnalité "mega"
, potato
s'intéresse à celle "potato"
.
lors de l'exécution de différentes commandes, vous finissez par avoir besoin de plusieurs versions différentes de potatoer
Crate.
Les commandes de l'espace de travail entier utiliseront une version avec des fonctionnalités unifiées :
cargo check # this will use potatoer with both "mega" and "potato"
Les commandes opérant sur une seule caisse utiliseront des versions sans unification :
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"
Si une dépendance avec la combinaison requise n'est pas présente, cargo la compilera.
Une façon d'éviter ce problème est de s'assurer que si les membres d'un espace de travail dépendent d'une caisse, ils en dépendent avec le même ensemble de fonctionnalités. Le maintenir à la main est sujet aux erreurs et c'est à ce moment-là qu'interviennent hackerman hack
et hackerman restore
.
Lorsqu'il est utilisé avec l'option --lock
, hackerman
prendra une somme de contrôle de toutes les dépendances et l'enregistrera dans le fichier Cargo.toml
sous ["package.metadata.hackerman.lock"]
et les appels suivants à check confirmeront que cette somme de contrôle est toujours valide. .
Ceci est nécessaire pour garantir que les dépendances originales (non piratées) sont enregistrées et peuvent être restaurées ultérieurement.
Il est possible de coder en dur l'option --lock
dans un fichier Cargo.toml
qui définit l'espace de travail :
[ workspace . metadata . hackerman ]
lock = true
Pour le moment, l'unification est effectuée uniquement pour la cible actuelle et sans prise en charge de la compilation croisée. La mise à jour automatique des fichiers toml de l'espace de travail peut ne pas fonctionner si vous spécifiez des dépendances en utilisant une syntaxe différente de celle de version ou {}
:
potato = " 3.14 " # this is okay
banana = { version = " 3.14 " } # this is also okay
Résout les conflits de fusion et de rebase pour les fichiers Cargo.toml
modifiés par hackerman
Pour l'utiliser, vous voulez quelque chose comme ça
global .gitconfig
ou local .git/config
.
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
fichier gitattributes
, peut être local par projet ou global
Cargo.toml merge=hackerman
Pour créer un fichier gitattributes
global, vous devez spécifier un chemin d'accès dans la configuration git globale :
[core]
attributesfile = ~/.gitattributes
Ici, je compare les effets de différentes approches d'unification sur un espace de travail. Sans aucune modification, une vérification propre sur l'ensemble de l'espace de travail qui implique la compilation de toutes les dépendances externes prend 672 secondes.
L'espace de travail contient un tas de caisses, parmi lesquelles j'ai sélectionné les caisses a
, b
, c
, etc., de telle sorte que la caisse b
importe la caisse a
, la caisse c
importe la caisse b
, etc. la caisse a
ne contient aucune dépendance externe, d'autres caisses vers.
cargo hackerman hack
et de nouvelles dépendances sont ajoutées à chaque caisseAvant d'exécuter la commande, je nettoie les résultats de la compilation, puis les commandes pour chaque colonne de manière séquentielle
commande | pas de piratage | pirate informatique | piratage manuel |
---|---|---|---|
check -pa | 0,86 s | 0,80 s | 215,39 s |
check -pb | 211h30 | 240,15s | 113,56 s |
check -pc | 362,69 s | 233,38 s | 176,73 s |
check -pd | 36,16 s | 0,24 s | 0,25 s |
check -pe | 385,35 s | 66,34 s | 375,22 s |
check | 267,06 s | 93,29 s | 81h50 |
total | 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
↴ Une collection d'outils qui aident votre espace de travail à compiler rapidement
Utilisation : cargo hackerman
COMMAND ...
Options disponibles :
-h
, --help
— Imprime les informations d'aide-V
, --version
— Imprime les informations de versionCommandes disponibles :
hack
— Unifiez les dépendances des caisses entre les caisses individuelles dans l'espace de travailrestore
— Supprimer l'unification des dépendances de caisse ajoutée par la commande hack
check
— Vérifiez si l'unification est requise et si les sommes de contrôle sont correctesmerge
- Restaurer les fichiers et fusionner avec le pilote de fusion par défautexplain
— Expliquez pourquoi une certaine dépendance est présente. La fonctionnalité et la version sont facultativesdupes
— Répertorie tous les doublons dans l'espace de travailtree
— Créer un arbre à partir des dépendancesshow
— Afficher le manifeste de la caisse, le fichier Lisez-moi, le référentiel ou la documentation Vous pouvez passer --help
deux fois pour une aide plus détaillée
Unifiez les dépendances des caisses entre les caisses individuelles dans l'espace de travail.
Utilisation : cargo hackerman
hack
CARGO_OPTS
[ --dry
] [ --lock
] [ -D
]
Vous pouvez annuler ces modifications à l'aide cargo hackerman restore
.
Options de chargement :
--manifest-path
= PATH
— Chemin d'accès au fichier Cargo.toml--frozen
— Exiger que Cargo.lock et le cache soient à jour--locked
— Exiger que Cargo.lock soit à jour--offline
— Exécuter sans accéder au réseau-v
, --verbose
— augmente la verbosité, peut être utilisé plusieurs foisOptions disponibles :
--dry
— N'effectuez pas d'action, affichez-la uniquement
--lock
— Inclut la somme de contrôle des dépendances dans la cachette
Cela permet de garantir que vous pouvez revenir aux dépendances d'origine (non piratées) : pour pouvoir restaurer les dépendances d'origine, le pirate informatique doit les stocker dans le fichier Cargo.toml
. Si CI détecte une inadéquation de somme de contrôle, cela signifie que les dépendances ont été mises à jour sur des sources piratées. Vous devriez plutôt les restaurer, les mettre à jour et les pirater à nouveau.
Vous pouvez faire du verrouillage le comportement par défaut en l'ajoutant à Cargo.toml
dans l'espace de travail
[workspace.metadata.hackerman]
lock = true
-D
, --no-dev
— Ne pas unifier les dépendances de développement
-h
, --help
— Imprime les informations d'aide
cargo-hackerman hack
calcule et ajoute un ensemble minimal de dépendances supplémentaires à tous les membres de l'espace de travail, de sorte que les fonctionnalités de toutes les dépendances de cette caisse restent les mêmes lorsqu'elle est utilisée dans le cadre de l'ensemble de l'espace de travail ou seule.
Une fois les dépendances piratées, vous devez les restaurer avant d'apporter des modifications.
Supprimer l'unification des dépendances de caisse ajoutée par la commande hack
Utilisation : cargo hackerman
restore
CARGO_OPTS
[ TOML
]...
Options de chargement :
--manifest-path
= PATH
— Chemin d'accès au fichier Cargo.toml--frozen
— Exiger que Cargo.lock et le cache soient à jour--locked
— Exiger que Cargo.lock soit à jour--offline
— Exécuter sans accéder au réseau-v
, --verbose
— augmente la verbosité, peut être utilisé plusieurs foisÉléments positionnels disponibles :
TOML
— Restaurer des fichiers individuels au lieu de tout l'espace de travailOptions disponibles :
-h
, --help
— Imprime les informations d'aide Vérifiez si l'unification est requise et si les sommes de contrôle sont correctes
Similaire à cargo-hackerman hack --dry
, mais définit également le statut de sortie sur 1 afin que vous puissiez l'utiliser dans le cadre du processus CI
Utilisation : cargo hackerman
check
CARGO_OPTS
[ -D
]
Options de chargement :
--manifest-path
= PATH
— Chemin d'accès au fichier Cargo.toml--frozen
— Exiger que Cargo.lock et le cache soient à jour--locked
— Exiger que Cargo.lock soit à jour--offline
— Exécuter sans accéder au réseau-v
, --verbose
— augmente la verbosité, peut être utilisé plusieurs foisOptions disponibles :
-D
, --no-dev
— Ne pas unifier les dépendances de développement-h
, --help
— Imprime les informations d'aide Restaurer les fichiers et fusionner avec le pilote de fusion par défaut
Utilisation : cargo hackerman
merge
BASE
LOCAL
REMOTE
RESULT
Options disponibles :
-h
, --help
— Imprime les informations d'aide Pour l'utiliser, vous ajouteriez quelque chose comme ceci à ~/.gitconfig
ou .git/config
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
Et quelque chose comme ça dans .git/gitattributes
Cargo.toml merge=hackerman
Expliquez pourquoi une certaine dépendance est présente. La fonctionnalité et la version sont facultatives
Utilisation : cargo hackerman
explain
CARGO_OPTS
[ -T
] [ -P
] [ -s
] CRATE
[ FEATURE
] [ VERSION
]
Options de chargement :
--manifest-path
= PATH
— Chemin d'accès au fichier Cargo.toml--frozen
— Exiger que Cargo.lock et le cache soient à jour--locked
— Exiger que Cargo.lock soit à jour--offline
— Exécuter sans accéder au réseau-v
, --verbose
— augmente la verbosité, peut être utilisé plusieurs foisOptions disponibles :
-T
, --no-transitive-opt
— Ne supprime pas les liens redondants-P
, --package-nodes
— Utiliser des nœuds de package au lieu de nœuds de fonctionnalités-s
, --stdout
— Imprimer le fichier dot sur stdout au lieu de générer xdot
-h
, --help
— Imprime les informations d'aideAvec un grand nombre de dépendances, il peut être difficile de savoir pourquoi exactement une sous-sous-sous-dépendance est incluse. Hackerman Explication résout ce problème en traçant la chaîne de dépendances depuis la cible jusqu'à l'espace de travail.
explain
commence à une caisse/fonctionnalité donnée et suit les liens de dépendance inverses jusqu'à ce qu'il atteigne tous les points de croisement avec l'espace de travail mais sans entrer dans l'espace de travail lui-même.
Les nœuds blancs représentent les membres de l'espace de travail, les nœuds ronds représentent les fonctionnalités et les nœuds octogonaux représentent les caisses de base. La ligne pointillée représente la dépendance réservée aux développeurs, la ligne pointillée - à la fois dev et normale, mais avec des fonctionnalités différentes. La cible est généralement mise en évidence. Par défaut, Hackerman étend les nœuds de fonctionnalités d'informations sur les packages qui peuvent être inversés avec -P
et essaie de réduire les dépendances transitives pour garder l'arborescence plus lisible - cela peut être inversé avec -T
.
Si une caisse est présente en plusieurs versions vous pouvez préciser la version de celle qui vous intéresse mais c'est facultatif.
Vous pouvez également spécifier quelle fonctionnalité rechercher, sinon le hackerman les recherchera toutes.
Répertorie tous les doublons dans l'espace de travail
Utilisation : cargo hackerman
dupes
CARGO_OPTS
Options de chargement :
--manifest-path
= PATH
— Chemin d'accès au fichier Cargo.toml--frozen
— Exiger que Cargo.lock et le cache soient à jour--locked
— Exiger que Cargo.lock soit à jour--offline
— Exécuter sans accéder au réseau-v
, --verbose
— augmente la verbosité, peut être utilisé plusieurs foisOptions disponibles :
-h
, --help
— Imprime les informations d'aide Faire un arbre avec les dépendances
Utilisation : cargo hackerman
tree
CARGO_OPTS
[ -T
] [ -D
] [ -P
] [ -w
] [ -s
] [ CRATE
] [ FEATURE
] [ VERSION
]
Options de chargement :
--manifest-path
= PATH
— Chemin d'accès au fichier Cargo.toml--frozen
— Exiger que Cargo.lock et le cache soient à jour--locked
— Exiger que Cargo.lock soit à jour--offline
— Exécuter sans accéder au réseau-v
, --verbose
— augmente la verbosité, peut être utilisé plusieurs foisOptions disponibles :
-T
, --no-transitive-opt
— Ne supprime pas les liens redondants-D
, --no-dev
— N'inclut pas les dépendances de développement-P
, --package-nodes
— Utiliser des nœuds de package au lieu de nœuds de fonctionnalités-w
, --workspace
— Rester dans l'espace de travail-s
, --stdout
— Imprimer le fichier dot sur stdout au lieu de générer xdot
-h
, --help
— Imprime les informations d'aideExemples :
cargo hackerman tree rand 0.8.4
cargo hackerman tree serde_json preserve_order
Afficher le manifeste de la caisse, le fichier Lisez-moi, le référentiel ou la documentation
Utilisation : cargo hackerman
show
CARGO_OPTS
[ -m
| -r
| -d
| -R
] CRATE
[ VERSION
]
Options de chargement :
--manifest-path
= PATH
— Chemin d'accès au fichier Cargo.toml--frozen
— Exiger que Cargo.lock et le cache soient à jour--locked
— Exiger que Cargo.lock soit à jour--offline
— Exécuter sans accéder au réseau-v
, --verbose
— augmente la verbosité, peut être utilisé plusieurs foisOptions disponibles :
-m
, --manifest
— Afficher le manifeste de la caisse-r
, --readme
— Afficher le fichier readme de la caisse-d
, --doc
— Ouvrir l'URL de la documentation-R
, --repository
— Référentiel-h
, --help
— Imprime les informations d'aideExemples :
cargo hackerman show --repository syn