Resumen de la línea de comando
Como parte del trabajo con espacios de trabajo, Cargo realiza la unificación de funciones: https://doc.rust-lang.org/cargo/reference/features.html#feature-unification
¿Qué quiere decir esto?
Supongamos que tienes un espacio de trabajo
[ workspace ]
members = [ " mega " , " potato " ]
Con dos miembros: mega
[ package ]
name = " mega "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " mega " ] }
y potato
[ package ]
name = " potato "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " potato " ] }
Ambos dependen de una potatoer
de caja común de terceros, pero con características diferentes: mega
está interesada en la característica "mega"
, potato
está interesada en la característica "potato"
.
Cuando ejecutas diferentes comandos, terminas necesitando varias versiones diferentes de potatoer
Crate.
Los comandos de todo el espacio de trabajo utilizarán la versión con funciones unificadas:
cargo check # this will use potatoer with both "mega" and "potato"
Los comandos que operan en una sola caja usarán versiones sin unificación:
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 una dependencia con la combinación requerida no está presente, cargo la compilará.
Una forma de evitar este problema es asegurarse de que si los miembros de un espacio de trabajo dependen de una caja, dependan de ella con el mismo conjunto de características. Mantenerlo a mano es propenso a errores y ahí es cuando entran en juego hackerman hack
y hackerman restore
.
Cuando se usa con la opción --lock
, hackerman
tomará una suma de verificación de todas las dependencias y la guardará dentro del archivo Cargo.toml
en ["package.metadata.hackerman.lock"]
y las llamadas posteriores para verificar confirmarán que esta suma de verificación aún es válida. .
Esto es necesario para garantizar que las dependencias originales (no pirateadas) se guarden y puedan restaurarse en un momento posterior.
Es posible codificar la opción --lock
en un archivo Cargo.toml
que define el espacio de trabajo:
[ workspace . metadata . hackerman ]
lock = true
Por el momento, la unificación se realiza sólo para el objetivo actual y sin soporte de compilación cruzada. Es posible que la actualización automática de los archivos toml del espacio de trabajo no funcione si especifica dependencias usando una sintaxis diferente a la de la versión o {}
:
potato = " 3.14 " # this is okay
banana = { version = " 3.14 " } # this is also okay
Resuelve conflictos de fusión y cambio de base para archivos Cargo.toml
modificados por hackerman
Para usarlo quieres algo como esto.
.gitconfig
global o .git/config
local.
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
archivo gitattributes
, puede ser local por proyecto o global
Cargo.toml merge=hackerman
Para crear un archivo global gitattributes
, debe especificar una ruta dentro de la configuración global de git:
[core]
attributesfile = ~/.gitattributes
Aquí estoy comparando los efectos de diferentes enfoques para la unificación en un espacio de trabajo. Sin ningún cambio, la verificación limpia de todo el espacio de trabajo, que implica la compilación de todas las dependencias externas, demora 672 segundos.
El espacio de trabajo contiene un montón de cajas, de las cuales seleccioné cajas a
, b
, c
, etc., de modo que crate b
importa crate a
, crate c
importa crate b
, etc. crate a
no contiene dependencias externas, otras cajas sí.
cargo hackerman hack
y se agregan nuevas dependencias a cada cajaAntes de ejecutar el comando, limpio los resultados de la compilación y luego los comandos para cada columna de forma secuencial.
dominio | sin hackear | hacker | truco manual |
---|---|---|---|
check -pa | 0,86s | 0.80s | 215,39s |
check -pb | 211.30s | 240,15s | 113,56s |
check -pc | 362,69s | 233,38s | 176,73s |
check -pd | 36.16s | 0,24s | 0,25s |
check -pe | 385,35s | 66,34s | 375,22s |
check | 267.06s | 93,29s | 81.50s |
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
↴ Una colección de herramientas que ayudan a que su espacio de trabajo se compile rápidamente
Uso : COMANDO cargo hackerman
COMMAND ...
Opciones disponibles:
-h
, --help
: imprime información de ayuda-V
, --version
: imprime información de la versión.Comandos disponibles:
hack
: unifica las dependencias de cajas entre cajas individuales en el espacio de trabajorestore
: elimina la unificación de dependencia de cajas agregada por el comando hack
check
: comprueba si se requiere unificación y si las sumas de verificación son correctasmerge
: restaurar archivos y fusionarlos con el controlador de fusión predeterminadoexplain
: explique por qué existe cierta dependencia. Tanto la característica como la versión son opcionales.dupes
: enumera todos los duplicados en el espacio de trabajotree
: crea un árbol a partir de dependenciasshow
: muestra el manifiesto de la caja, el archivo Léame, el repositorio o la documentación Puedes pasar --help
dos veces para obtener ayuda más detallada.
Unifique las dependencias de cajas entre cajas individuales en el espacio de trabajo
Uso : hack
cargo hackerman
CARGO_OPTS
[ --dry
] [ --lock
] [ -D
]
Puedes deshacer esos cambios usando cargo hackerman restore
.
Opciones de carga:
--manifest-path
= PATH
— Ruta al archivo Cargo.toml--frozen
: requiere que Cargo.lock y el caché estén actualizados--locked
— Requiere que Cargo.lock esté actualizado--offline
— Ejecutar sin acceder a la red-v
, --verbose
: aumenta la verbosidad, se puede utilizar varias vecesOpciones disponibles:
--dry
: no realiza ninguna acción, solo muéstrala
--lock
: incluye la suma de comprobación de dependencias en el alijo
Esto ayuda a garantizar que pueda volver a las dependencias originales (no pirateadas): para poder restaurar las dependencias originales, el hackerman debe tenerlas guardadas en el archivo Cargo.toml
. Si CI detecta una discrepancia en la suma de comprobación, significa que las dependencias se actualizaron en fuentes pirateadas. En su lugar, deberías restaurarlos, actualizarlos y piratearlos nuevamente.
Puede hacer que el bloqueo sea el comportamiento predeterminado agregando esto a Cargo.toml
en el espacio de trabajo
[workspace.metadata.hackerman]
lock = true
-D
, --no-dev
: no unificar las dependencias de desarrollo
-h
, --help
: imprime información de ayuda
cargo-hackerman hack
calcula y agrega un conjunto mínimo de dependencias adicionales a todos los miembros del espacio de trabajo, de modo que las características de todas las dependencias de esta caja permanezcan iguales cuando se usa como parte de todo el espacio de trabajo o por sí sola.
Una vez que se piratean las dependencias, debe restaurarlas antes de realizar cualquier cambio.
Eliminar la unificación de dependencia de cajas agregada por el comando hack
Uso : cargo hackerman
restore
CARGO_OPTS
[ TOML
]...
Opciones de carga:
--manifest-path
= PATH
— Ruta al archivo Cargo.toml--frozen
: requiere que Cargo.lock y el caché estén actualizados--locked
— Requiere que Cargo.lock esté actualizado--offline
— Ejecutar sin acceder a la red-v
, --verbose
: aumenta la verbosidad, se puede utilizar varias vecesArtículos posicionales disponibles:
TOML
: restaura archivos individuales en lugar de todo el espacio de trabajoOpciones disponibles:
-h
, --help
: imprime información de ayuda Compruebe si se requiere unificación y si las sumas de verificación son correctas
Similar a cargo-hackerman hack --dry
, pero también establece el estado de salida en 1 para que pueda usarlo como parte del proceso de CI
Uso : check
cargo hackerman
CARGO_OPTS
[ -D
]
Opciones de carga:
--manifest-path
= PATH
— Ruta al archivo Cargo.toml--frozen
: requiere que Cargo.lock y el caché estén actualizados--locked
— Requiere que Cargo.lock esté actualizado--offline
— Ejecutar sin acceder a la red-v
, --verbose
: aumenta la verbosidad, se puede utilizar varias vecesOpciones disponibles:
-D
, --no-dev
: no unificar las dependencias de desarrollo-h
, --help
: imprime información de ayuda Restaurar archivos y fusionarlos con el controlador de fusión predeterminado
Uso : cargo hackerman
merge
RESULT
REMOTE
LOCAL
BASE
Opciones disponibles:
-h
, --help
: imprime información de ayuda Para usarlo, agregarías algo como esto a ~/.gitconfig
o .git/config
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
Y algo como esto en .git/gitattributes
Cargo.toml merge=hackerman
Explique por qué existe cierta dependencia. Tanto la característica como la versión son opcionales.
Uso : cargo hackerman
explain
CARGO_OPTS
[ -T
] [ -P
] [ -s
] CRATE
[ FEATURE
] [ VERSION
]
Opciones de carga:
--manifest-path
= PATH
— Ruta al archivo Cargo.toml--frozen
: requiere que Cargo.lock y el caché estén actualizados--locked
— Requiere que Cargo.lock esté actualizado--offline
— Ejecutar sin acceder a la red-v
, --verbose
: aumenta la verbosidad, se puede utilizar varias vecesOpciones disponibles:
-T
, --no-transitive-opt
— No elimine enlaces redundantes-P
, --package-nodes
: utiliza nodos de paquete en lugar de nodos de características-s
, --stdout
: imprime el archivo de puntos en la salida estándar en lugar de generar xdot
-h
, --help
: imprime información de ayudaCon una gran cantidad de dependencias, puede resultar difícil saber por qué se incluye exactamente alguna sub-sub-subdependencia. Hackerman explica resuelve este problema rastreando la cadena de dependencia desde el objetivo hasta el espacio de trabajo.
explain
comienza en una caja/característica determinada y sigue enlaces de dependencia inversa hasta llegar a todos los puntos de cruce con el espacio de trabajo, pero sin ingresar al espacio de trabajo en sí.
Los nodos blancos representan miembros del espacio de trabajo, los nodos redondos representan características y los nodos octogonales representan cajas base. La línea de puntos representa la dependencia solo del desarrollador, la línea discontinua: tanto de desarrollo como normal, pero con diferentes características entre ellos. El objetivo suele estar resaltado. De forma predeterminada, hackerman expande los nodos de funciones de información de los paquetes que se pueden revertir con -P
e intenta reducir las dependencias transitivas para mantener el árbol más legible; esto se puede revertir con -T
.
Si una caja está presente en varias versiones, puede especificar la versión que le interesa, pero es opcional.
También puede especificar qué característica buscar; de lo contrario, el hackerman las buscará todas.
Enumera todos los duplicados en el espacio de trabajo.
Uso : cargo hackerman
dupes
CARGO_OPTS
Opciones de carga:
--manifest-path
= PATH
— Ruta al archivo Cargo.toml--frozen
: requiere que Cargo.lock y el caché estén actualizados--locked
— Requiere que Cargo.lock esté actualizado--offline
— Ejecutar sin acceder a la red-v
, --verbose
: aumenta la verbosidad, se puede utilizar varias vecesOpciones disponibles:
-h
, --help
: imprime información de ayuda Haz un árbol con dependencias.
Uso : tree
cargo hackerman
CARGO_OPTS
[ -T
] [ -D
] [ -P
] [ -w
] [ -s
] [ CRATE
] [ FEATURE
] [ VERSION
]
Opciones de carga:
--manifest-path
= PATH
— Ruta al archivo Cargo.toml--frozen
: requiere que Cargo.lock y el caché estén actualizados--locked
— Requiere que Cargo.lock esté actualizado--offline
— Ejecutar sin acceder a la red-v
, --verbose
: aumenta la verbosidad, se puede utilizar varias vecesOpciones disponibles:
-T
, --no-transitive-opt
— No elimine enlaces redundantes-D
, --no-dev
: no incluye dependencias de desarrollo-P
, --package-nodes
: utiliza nodos de paquete en lugar de nodos de características-w
, --workspace
: mantenerse dentro del espacio de trabajo-s
, --stdout
: imprime el archivo de puntos en la salida estándar en lugar de generar xdot
-h
, --help
: imprime información de ayudaEjemplos:
cargo hackerman tree rand 0.8.4
cargo hackerman tree serde_json preserve_order
Mostrar manifiesto de caja, archivo Léame, repositorio o documentación
Uso : cargo hackerman
show
CARGO_OPTS
[ -m
| -r
| -d
| -R
] CRATE
[ VERSION
]
Opciones de carga:
--manifest-path
= PATH
— Ruta al archivo Cargo.toml--frozen
: requiere que Cargo.lock y el caché estén actualizados--locked
— Requiere que Cargo.lock esté actualizado--offline
— Ejecutar sin acceder a la red-v
, --verbose
: aumenta la verbosidad, se puede utilizar varias vecesOpciones disponibles:
-m
, --manifest
: muestra el manifiesto de la caja-r
, --readme
: muestra el archivo Léame de la caja-d
, --doc
— Abrir URL de documentación-R
, --repository
— Repositorio-h
, --help
: imprime información de ayudaEjemplos:
cargo hackerman show --repository syn