Rust é uma linguagem incrível para trabalhar. No entanto, ele vem com uma ferramenta frequentemente mal compreendida, conhecida como Cargo .

Muitas pessoas, quando começam a usar o Rust, têm dificuldade em entender o que o Cargo faz e como funciona. Você deve estar se perguntando, por exemplo, por que precisa executar seu código Rust com cargo run . Por que você precisa do Cargo para executar seu programa Rust? Por que existem tantas atividades cargo em um programa Rust?

Neste tutorial, pretendemos esclarecer o mistério em torno do Rust Cargo. Abordaremos o seguinte:

O que é Cargo in Rust?

Cargo é o sistema de compilação e gerenciador de pacotes do Rust. Com esta ferramenta, você obterá uma compilação repetitiva porque permite que os pacotes Rust declarem suas dependências no manifesto, cargo.toml . Quando você instala o Rust por meio do rustup , o Cargo também é instalado.

Por exemplo, quando você executa o seguinte comando no Linux ou macOS para instalar o Rust, o Cargo também é instalado:

 curl https://sh.rustup.rs-sSf | sh

Cargo ajuda você a compilar seu programa Rust com sucesso. Ele baixa dependências, compila seus pacotes e os carrega no registro do projeto Rust, crates.io .

Como funciona a carga

Cargo permite que pacotes Rust declarem suas dependências. Isso é feito no arquivo cargo.toml . Tudo que você precisa fazer é declarar as dependências necessárias para executar seu programa no arquivo cargo.toml . Em seguida, o Cargo extrai todas as informações necessárias sobre suas dependências e compila as informações no arquivo cargo.lock .

A função do arquivo cargo.lock é permitir uma construção repetitiva. Portanto, não deve haver casos de compilações diferentes, mesmo quando você compartilha seu projeto.

Você pode estar se perguntando como os arquivos cargo.toml e cargo.lock são diferentes. cargo.toml é um manifesto , que é um documento que contém informações detalhadas sobre os passageiros , mercadorias, etc. No Rust, o manifesto contém informações detalhadas sobre um determinado projeto, como o nome do projeto, versão, dependências, etc. O manifesto informa ao Cargo qual dependência ele precisa baixar para compilar seu projeto com êxito.

O que é cargo.lock ?

Quando você constrói seu projeto e o compartilha com outras pessoas, como Rust garante que você e seus amigos não tenham uma construção diferente com diferentes versões de dependências? É aqui que entra o cargo.lock .

cargo.lock simplesmente contém informações de compilação de seu projeto. Quando seu projeto é compilado com sucesso, todas as informações de compilação são armazenadas em seu arquivo cargo.lock . Isso inclui a versão exata das dependências para sua construção. Você pode se perguntar por que isso é importante quando você já especificou a versão de suas dependências em cargo.toml .

O que acontece quando a versão de suas dependências é atualizada e faz com que seu programa funcione inesperadamente? Como você tem a versão exata das dependências em cargo.toml , tudo o que o Cargo fará é baixá-las enquanto tenta compilar seu programa, mesmo que seja atualizado. No entanto, se você tiver um arquivo cargo.lock , o Cargo usará a cópia exata da dependência no arquivo cargo.lock . Você não terá que arriscar uma das dependências SemVer quebrando seu programa, mesmo após uma construção inicial bem-sucedida com cargo.lock .

cargo.lock vs. cargo.toml

A primeira coisa a observar sobre cargo.lock e cargo.toml é que ambos contêm dependências para seu projeto. No entanto, cargo.toml é escrito pelo desenvolvedor, enquanto cargo.lock é mantido pelo Cargo.

A razão para usar um arquivo cargo.lock além de um arquivo cargo.toml é para permitir compilações simultâneas em todas as máquinas. Enquanto o arquivo cargo.toml armazena versões SemVer, cargo.lock armazena a versão exata da dependência durante uma compilação bem-sucedida.

Para entender isso melhor, vamos imaginar que não há nenhum arquivo cargo.lock e as restrições SemVer para nossas dependências são:

 [dependências]
serde="1.0"
serde json="1.0"

Quando você constrói seu projeto, a versão exata do serde que constrói com sucesso é serde="1.0.124". Se serde for atualizado e você compartilhar seu projeto com um colega, eles podem encontrar alguns erros porque a atualização de serde pode não ser compatível com seu projeto. cargo.lock resolve problemas de dependência permitindo que Cargo compare informações no arquivo cargo.lock .

Carga e perfis

Com perfis em Rust , é fácil alterar alguns configurações do compilador. Por exemplo, você pode alterar o nível de otimização apenas especificando-o no arquivo cargo.toml :

 [profile.dev opt-level=1 # Use otimizações básicas.

Isso diz ao Cargo para usar um nível de otimização de 1 ao compilar seu projeto.

Rust tem quatro perfis integrados: dev , test , bench e release . O comando em execução depende do perfil a ser escolhido. Você pode alterar as configurações do compilador na tabela [profile] de seu arquivo cargo.toml .

Vejamos os perfis padrão, bem como os comandos e sinalizadores de linha de comando associados a cada um.

DEV

Quando você executa o comando cargo build , o compilador usa o perfil dev . Este perfil é usado para desenvolvimento normal e depuração.

 [profile.dev] opt-level=0 debug=true debug-assertions=true overflow-checks=true lto=falso pânico='descontrair' incremental=verdadeiro unidades codegen=256 rpath=false

RELEASE

O perfil RELEASE é usado para lançamentos e em produção. Quando você usa o comando cargo install ou -release flag , este perfil será usado.

 [profile.release] opt-level=3 debug=false debug-assertions=false overflow-checks=false lto=falso pânico='descontrair' incremental=falso unidades codegen=16 rpath=false

TEST

O perfil TEST é usado quando você executa o comando cargo build para benchmarks no modo de depuração ou quando você constrói testes.

 [teste do perfil] opt-level=0 debug=2 debug-assertions=true overflow-checks=true lto=falso pânico='descontrair' incremental=verdadeiro unidades codegen=256 rpath=false

BENCH

BENCH entra em ação quando você constrói benchmarks ou constrói testes com o sinalizador --release .

 [profile.bench] opt-level=3 debug=false debug-assertions=false overflow-checks=false lto=falso pânico='descontrair' incremental=falso unidades codegen=16 rpath=false

Carga e espaços de trabalho

No Rust, você pode criar uma coleção de pacotes que compartilham um arquivo cargo.lock , diretório de saída e outras configurações, como perfis. Esta coleção é chamada de espaço de trabalho e os pacotes que compõem o espaço de trabalho são membros do espaço de trabalho s.

Os espaços de trabalho são especificados no arquivo cargo.toml . Isso geralmente é feito de duas maneiras: usando o pacote raiz ou manifesto virtual .

O método root package envolve a adição de uma tabela [workspace] ao seu arquivo cargo.toml . A tabela [espaço de trabalho] pode ser adicionada a um arquivo cargo.toml onde [pacote] já foi declarado se [pacote] é o pacote raiz do espaço de trabalho.

Pelo método manifesto virtual , você pode criar um arquivo cargo.toml e adicionar uma tabela [espaço de trabalho] . No entanto, nenhuma tabela [pacote] estará no arquivo cargo.toml . Esta pode ser uma boa opção quando você deseja manter todos os pacotes juntos em um diretório diferente ou quando não há um pacote “principal”.

Comandos de carga

Abaixo estão os comandos Cargo mais populares. Para sua conveniência, nós os agrupamos nas seguintes categorias: comandos de construção, comandos de manifesto, comandos de pacote e comandos de publicação:

 # Comandos de construção banco de carga \ [options \] [benchname] construção de carga [opções] verificação de carga [opções] carga limpa [opções] doc de carga [opções] buscar carga [opções] correção de carga [opções] cargo run \ [options \] [-args] cargo rustc \ [options \] [-args] cargo rustdoc \ [options \] [-args] teste de carga \ [options \] [testname] # Comandos de manifesto load generate-lockfile [opções] projeto de localização de carga [opções] metadados de carga [opções] cargo pkgid \ [options \] [spec] árvore de carga [opções] atualização de carga [opções] vendedor de carga \ [opções \] [caminho] verificar-projeto de carga [opções] # Comandos de pacote carga init \ [opções \] [caminho] instalação de carga [opções] carga novo [opções] caminho pesquisa de carga \ [opções \] [consulta...] desinstalação de carga \ [opções \] [especificações...] # Comandos de publicação login de carga \ [opções \] [token] proprietário da carga [opções] pacote de carga [opções] publicação de carga [opções] carga yank [opções]-versão anterior [engradado]

Para obter mais informações sobre os comandos Cargo, verifique a documentação oficial do Rust .

Conclusão

Construir um aplicativo Rust é impossível sem Cargo. Além disso, você precisa dos comandos Cargo para publicar seu projeto. Simplificando, o Cargo orquestra uma construção, compilação e tempo de execução suaves para seu projeto Rust.

Espero que este guia tenha dado a você uma melhor compreensão do que é Cargo, como funciona e por que é uma parte tão importante de qualquer projeto Rust. Se você quiser saber mais sobre o Cargo, a documentação do Rust é um ótimo recurso.

A postagem Demystifying Cargo in Rust apareceu primeiro em LogRocket Blog .

Source link