Resumo da linha de comando
Como parte do trabalho com espaços de trabalho, o cargo realiza a unificação de recursos: https://doc.rust-lang.org/cargo/reference/features.html#feature-unification
O que isto significa?
Suponha que você tenha um espaço de trabalho
[ workspace ]
members = [ " mega " , " potato " ]
Com dois membros: mega
[ package ]
name = " mega "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " mega " ] }
E potato
[ package ]
name = " potato "
[ dependencies ]
potatoer = { version = " 0.2.1 " , features = [ " potato " ] }
Ambos dependem de uma caixa comum de potatoer
de terceiros, mas com recursos diferentes: mega
está interessado no recurso "mega"
, potato
está interessada no recurso "potato"
.
ao executar comandos diferentes, você acaba exigindo várias versões diferentes da caixa potatoer
.
Comandos inteiros do espaço de trabalho usarão versões com recursos unificados:
cargo check # this will use potatoer with both "mega" and "potato"
Comandos operando em uma única caixa usarão versões sem unificação:
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"
Se uma dependência com a combinação necessária não estiver presente - cargo irá compilá-la.
Uma maneira de evitar esse problema é garantir que, se os membros de um espaço de trabalho dependem de uma caixa, eles dependem dela com o mesmo conjunto de recursos. Mantê-lo manualmente é propenso a erros e é aí que entram hackerman hack
e hackerman restore
.
Quando usado com a opção --lock
, hackerman
fará uma soma de verificação de todas as dependências e a salvará dentro do arquivo Cargo.toml
em ["package.metadata.hackerman.lock"]
e as chamadas subsequentes para verificar confirmarão que esta soma de verificação ainda é válida .
Isso é necessário para garantir que as dependências originais (não hackeadas) sejam salvas e possam ser restauradas posteriormente.
É possível codificar a opção --lock
em um arquivo Cargo.toml
que define o espaço de trabalho:
[ workspace . metadata . hackerman ]
lock = true
No momento, a unificação é realizada apenas para o destino atual e sem suporte para compilação cruzada. A atualização automática para arquivos toml do espaço de trabalho poderá não funcionar se você estiver especificando dependências usando uma sintaxe diferente de version ou {}
:
potato = " 3.14 " # this is okay
banana = { version = " 3.14 " } # this is also okay
Resolve conflitos de mesclagem e rebase para arquivos Cargo.toml
alterados por hackerman
Para usá-lo você quer algo assim
global .gitconfig
ou local .git/config
.
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
arquivo gitattributes
, pode ser local por projeto ou global
Cargo.toml merge=hackerman
Para criar um arquivo gitattributes
global, você precisa especificar um caminho para ele dentro da configuração global do git:
[core]
attributesfile = ~/.gitattributes
Aqui estou comparando os efeitos de diferentes abordagens de unificação em um espaço de trabalho. Sem nenhuma alteração, a verificação limpa de todo o espaço de trabalho que envolve a compilação de todas as dependências externas leva 672 segundos.
A área de trabalho contém um monte de caixas, das quais selecionei as caixas a
, b
, c
, etc, de modo que a caixa b
a
a caixa a
, a caixa c
importa a caixa b
, etc.
cargo hackerman hack
e novas dependências são adicionadas a cada caixaAntes de executar o comando eu limpo os resultados da compilação e depois os comandos para cada coluna sequencialmente
comando | sem hack | hacker | hack manual |
---|---|---|---|
check -pa | 0,86s | 0,80s | 215,39s |
check -pb | 211h30 | 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
↴ Uma coleção de ferramentas que ajudam seu espaço de trabalho a compilar rapidamente
Uso : cargo hackerman
COMMAND ...
Opções disponíveis:
-h
, --help
— Imprime informações de ajuda-V
, --version
— Imprime informações da versãoComandos disponíveis:
hack
— Unifique dependências de caixas em caixas individuais no espaço de trabalhorestore
– Remove a unificação da dependência da caixa adicionada pelo comando hack
check
— Verifica se a unificação é necessária e se as somas de verificação estão corretasmerge
— Restaure arquivos e mescle com o driver de mesclagem padrãoexplain
— Explique por que alguma dependência está presente. Tanto o recurso quanto a versão são opcionaisdupes
— Lista todas as duplicatas no espaço de trabalhotree
– Faça uma árvore com dependênciasshow
— Mostra o manifesto da caixa, leia-me, repositório ou documentação Você pode passar --help
duas vezes para obter ajuda mais detalhada
Unifique dependências de caixas em caixas individuais no espaço de trabalho
Uso : hack
cargo hackerman
CARGO_OPTS
[ --dry
] [ --lock
] [ -D
]
Você pode desfazer essas alterações usando cargo hackerman restore
.
Opções de carga:
--manifest-path
= PATH
— Caminho para o arquivo Cargo.toml--frozen
— Exige que Cargo.lock e cache estejam atualizados--locked
— Exige que Cargo.lock esteja atualizado--offline
— Executa sem acessar a rede-v
, --verbose
— aumenta a verbosidade, pode ser usado várias vezesOpções disponíveis:
--dry
— Não execute ações, apenas exiba-as
--lock
— Inclui checksum de dependências no stash
Isso ajuda a garantir que você possa voltar às dependências originais (não hackeadas): para poder restaurar as dependências originais, o hackerman precisa armazená-las no arquivo Cargo.toml
. Se o CI detectar incompatibilidade de soma de verificação, isso significa que as dependências foram atualizadas em fontes hackeadas. Em vez disso, você deve restaurá-los, atualizá-los e hackear novamente.
Você pode tornar o bloqueio o comportamento padrão adicionando-o ao Cargo.toml
no espaço de trabalho
[workspace.metadata.hackerman]
lock = true
-D
, --no-dev
— Não unifique dependências de desenvolvimento
-h
, --help
— Imprime informações de ajuda
cargo-hackerman hack
calcula e adiciona um conjunto mínimo de dependências extras a todos os membros do espaço de trabalho, de modo que os recursos de todas as dependências desta caixa permaneçam os mesmos quando for usado como parte de todo o espaço de trabalho ou por si só.
Depois que as dependências forem hackeadas, você deverá restaurá-las antes de fazer qualquer alteração.
Remova a unificação da dependência da caixa adicionada pelo comando hack
Uso : cargo hackerman
restore
CARGO_OPTS
[ TOML
]...
Opções de carga:
--manifest-path
= PATH
— Caminho para o arquivo Cargo.toml--frozen
— Exige que Cargo.lock e cache estejam atualizados--locked
— Exige que Cargo.lock esteja atualizado--offline
— Executa sem acessar a rede-v
, --verbose
— aumenta a verbosidade, pode ser usado várias vezesItens posicionais disponíveis:
TOML
— Restaure arquivos individuais em vez de todo o espaço de trabalhoOpções disponíveis:
-h
, --help
— Imprime informações de ajuda Verifique se a unificação é necessária e se as somas de verificação estão corretas
Semelhante ao cargo-hackerman hack --dry
, mas também define o status de saída como 1 para que você possa usá-lo como parte do processo de CI
Uso : check
cargo hackerman
CARGO_OPTS
[ -D
]
Opções de carga:
--manifest-path
= PATH
— Caminho para o arquivo Cargo.toml--frozen
— Exige que Cargo.lock e cache estejam atualizados--locked
— Exige que Cargo.lock esteja atualizado--offline
— Executa sem acessar a rede-v
, --verbose
— aumenta a verbosidade, pode ser usado várias vezesOpções disponíveis:
-D
, --no-dev
— Não unifique dependências de desenvolvimento-h
, --help
— Imprime informações de ajuda Restaure arquivos e mescle com o driver de mesclagem padrão
Uso : cargo hackerman
merge
BASE
LOCAL
REMOTE
RESULT
Opções disponíveis:
-h
, --help
— Imprime informações de ajuda Para usá-lo, você adicionaria algo assim a ~/.gitconfig
ou .git/config
[merge "hackerman"]
name = merge restored files with hackerman
driver = cargo hackerman merge %O %A %B %P
E algo assim para .git/gitattributes
Cargo.toml merge=hackerman
Explique por que alguma dependência está presente. Tanto o recurso quanto a versão são opcionais
Uso : cargo hackerman
explain
CARGO_OPTS
[ -T
] [ -P
] [ -s
] CRATE
[ FEATURE
] [ VERSION
]
Opções de carga:
--manifest-path
= PATH
— Caminho para o arquivo Cargo.toml--frozen
— Exige que Cargo.lock e cache estejam atualizados--locked
— Exige que Cargo.lock esteja atualizado--offline
— Executa sem acessar a rede-v
, --verbose
— aumenta a verbosidade, pode ser usado várias vezesOpções disponíveis:
-T
, --no-transitive-opt
— Não remove links redundantes-P
, --package-nodes
— Use nós de pacote em vez de nós de recursos-s
, --stdout
— Imprime o arquivo dot em stdout em vez de gerar xdot
-h
, --help
— Imprime informações de ajudaCom uma grande quantidade de dependências, pode ser difícil dizer por que exatamente alguma dependência sub-sub-sub está incluída. hackerman explica resolve esse problema rastreando a cadeia de dependência do destino até o espaço de trabalho.
explain
começa em uma determinada caixa/recurso e segue links de dependência reversa até atingir todos os pontos de cruzamento com o espaço de trabalho, mas sem entrar no próprio espaço de trabalho.
Os nós brancos representam membros do espaço de trabalho, os nós redondos representam recursos, os nós octogonais representam caixas de base. A linha pontilhada representa a dependência somente de desenvolvimento, a linha tracejada - tanto dev quanto normal, mas com recursos diferentes entre eles. O alvo geralmente é destacado. Por padrão, o hackerman expande os nós de recursos de informações dos pacotes que podem ser revertidos com -P
e tenta reduzir dependências transitivas para manter a árvore mais legível - isso pode ser revertido com -T
.
Se uma caixa estiver presente em várias versões, você poderá especificar a versão daquela em que está interessado, mas é opcional.
Você também pode especificar qual recurso procurar, caso contrário, o hackerman estará procurando por todos eles.
Lista todas as duplicatas no espaço de trabalho
Uso : cargo hackerman
dupes
CARGO_OPTS
Opções de carga:
--manifest-path
= PATH
— Caminho para o arquivo Cargo.toml--frozen
— Exige que Cargo.lock e cache estejam atualizados--locked
— Exige que Cargo.lock esteja atualizado--offline
— Executa sem acessar a rede-v
, --verbose
— aumenta a verbosidade, pode ser usado várias vezesOpções disponíveis:
-h
, --help
— Imprime informações de ajuda Faça uma árvore de dependências
Uso : tree
cargo hackerman
CARGO_OPTS
[ -T
] [ -D
] [ -P
] [ -w
] [ -s
] [ CRATE
] [ FEATURE
] [ VERSION
]
Opções de carga:
--manifest-path
= PATH
— Caminho para o arquivo Cargo.toml--frozen
— Exige que Cargo.lock e cache estejam atualizados--locked
— Exige que Cargo.lock esteja atualizado--offline
— Executa sem acessar a rede-v
, --verbose
— aumenta a verbosidade, pode ser usado várias vezesOpções disponíveis:
-T
, --no-transitive-opt
— Não remove links redundantes-D
, --no-dev
— Não inclui dependências de desenvolvimento-P
, --package-nodes
— Use nós de pacote em vez de nós de recursos-w
, --workspace
— Mantenha-se dentro da área de trabalho-s
, --stdout
— Imprime o arquivo dot em stdout em vez de gerar xdot
-h
, --help
— Imprime informações de ajudaExemplos:
cargo hackerman tree rand 0.8.4
cargo hackerman tree serde_json preserve_order
Mostrar manifesto da caixa, leia-me, repositório ou documentação
Uso : cargo hackerman
show
CARGO_OPTS
[ -m
| -r
| -d
| -R
] CRATE
[ VERSION
]
Opções de carga:
--manifest-path
= PATH
— Caminho para o arquivo Cargo.toml--frozen
— Exige que Cargo.lock e cache estejam atualizados--locked
— Exige que Cargo.lock esteja atualizado--offline
— Executa sem acessar a rede-v
, --verbose
— aumenta a verbosidade, pode ser usado várias vezesOpções disponíveis:
-m
, --manifest
— Mostra o manifesto da caixa-r
, --readme
— Mostra o leia-me da caixa-d
, --doc
— URL da documentação aberta-R
, --repository
— Repositório-h
, --help
— Imprime informações de ajudaExemplos:
cargo hackerman show --repository syn