Como posso construir vários binários com Cargo?

104

Eu gostaria de fazer um projeto com a daemone a client, conectando através de um soquete unix.

A cliente a daemonrequerem dois binários, então como posso dizer Cargopara construir dois destinos de duas fontes diferentes?

Para adicionar um pouco de fantasia, gostaria de ter um librarypara a parte principal do daemone apenas um binário para envolvê-lo e comunicar-se por meio de soquetes.

Portanto, temos este tipo de arquitetura de árvore:

├── Cargo.toml
├── target
|   └── debug
|       ├── daemon
│       └── client
└── src
    ├── daemon
    │   ├── bin
    │   │   └── main.rs
    │   └── lib
    │       └── lib.rs
    └── client
        └── bin
            └── main.rs

Eu poderia fazer um executável que gerencie ambas as questões, mas não é o que eu quero fazer, a menos que seja uma prática muito boa.

RallionRl
fonte
1
Altamente relevante: Pacote Rust com uma biblioteca e um binário? .
Shepmaster
Em complemento à resposta de Dognert , eles respondem a todas as perguntas que recebi. Muito obrigado!
RallionRl

Respostas:

137

Você pode especificar vários binários usando [[bin]], conforme mencionado aqui :

[[bin]]
name = "daemon"
path = "src/daemon/bin/main.rs"

[[bin]]
name = "client"
path = "src/client/bin/main.rs"

Dica: Se, em vez disso, você colocar esses arquivos em src/bin/daemon.rse src/bin/client.rs, obterá dois executáveis ​​chamados daemone, clientpois o Cargo compila todos os arquivos em src/binexecutáveis ​​com o mesmo nome automaticamente. Você precisa especificar nomes e caminhos como no trecho acima apenas se você não seguir esta convenção.

Dogbert
fonte
Já olhei a documentação do Cargo, mas não consigo ver nada, pode especificar a saída para armazenar o binário? por exemplo pathTo: "/ some / path" Sinto muito pelo meu inglês.
Angel Angel
se você acha que é melhor fazer uma pergunta sobre isso, eu posso fazer sem problemas, seria mais fácil encontrar outras pessoas com a mesma dúvida?
Angel Angel de
@AngelAngel você deseja personalizar o caminho de saída? Por padrão, ele será armazenado target/debug/$nameonde $nameestá o nameespecificado em Cargo.toml.
Dogbert
Eu só queria saber se você poderia dizer onde instalar uma cópia do binário em outro lugar que não o padrão. Uma cópia em $ name e outra cópia em outro caminho. Não que seja trivial, apenas curioso, obrigado pelo seu tempo.
Angel Angel
@AngelAngel Acho que você está procurando o cargo installcomando. Tente ler a saída de cargo help install.
Dogbert
18

Outra maneira é usar o recurso de espaço de trabalho . Isso fornecerá mais flexibilidade devido ao fato de que podemos ter mais de uma biblioteca. Exemplo de estrutura de projeto:

.
├── Cargo.toml
├── cli
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── core
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── daemon
│   ├── Cargo.toml
│   └── src
│       └── main.rs
├── gui
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── rpc
    ├── Cargo.toml
    └── src
        └── lib.rs

Conteúdo da raiz Cargo.toml:

[workspace]
members = ["cli", "core", "daemon", "gui", "rpc"]
UltimaWeapon
fonte
1
Eu não conseguia fazer isso funcionar. Tive que mover a fonte de ferrugem binária na pasta src / e especificar outro destino [[bin]]. Você poderia dar mais detalhes sobre o que você fez para fazer isso funcionar? Eu estava recebendo o seguinte erro: use ::engine::RuleEngine; could not find engine in {{root}}
Kenny Bambridge
@KennyBambridge Não trabalho com Rust há algum tempo. IIRC Quando criei esta resposta, experimentei na minha máquina local e funcionou como pretendido.
UltimaWeapon de
@KennyBambridge Você precisa adicionar engradados em outras áreas de trabalho como dependências no Cargo.toml onde deseja usá-los.
César,
1

Outro formato poderia ser replicar o que o código-fonte Crates.io fez, se você tiver um projeto enorme, algo como:

Biblioteca principal em src, com uma pasta Bin com seus executáveis. Em seguida, faça chamadas para a caixa da biblioteca principal a partir de seus executáveis.

Dessa forma, sua biblioteca é centralizada de forma mais fácil de encontrar as coisas enquanto é armazenada em cache.

Robust Systems 8472-1488
fonte