Como usar uma caixa local não publicada?

103

Eu fiz uma biblioteca:

cargo new my_lib

e quero usar essa biblioteca em um programa diferente:

cargo new my_program --bin
extern crate my_lib;

fn main {
    println!("Hello, World!");
}

o que eu preciso fazer para que isso funcione?

Eles não estão na mesma pasta de projeto.

.
├── my_lib
└── my_program

Esperançosamente, isso faz sentido.

Achei que seria capaz de substituir o caminho de acordo com o guia de carga , mas afirma

Você não pode usar este recurso para informar ao Cargo como encontrar caixas locais não publicadas.

Isso ocorre ao usar a última versão estável do Rust (1.3).

Andre S.
fonte

Respostas:

137

Adicione uma seção de dependência ao Cargo.toml do seu executável e especifique o caminho:

[dependencies.my_lib]
path = "../my_lib"

ou o TOML alternativo equivalente:

[dependencies]
my_lib = { path = "../my_lib" }

Confira os documentos do Cargo para especificar dependências para obter mais detalhes, como como usar um repositório git em vez de um caminho local.

Shepmaster
fonte
8
Existe uma maneira de usar uma caixa local (para desenvolvimento) enquanto deixo Cargo.toml referindo-se a crates.io para que outros também possam construir meu código?
David Roundy
1
Não é possível por padrão no momento. No entanto, você pode trabalhar em uma filial local, substituir Cargo.toml por referências de dependência local (ou referências mistas) e, antes de mesclar ou durante, reverter ou manter o arquivo Cargo.toml principal.
Paul-Sebastian Manole,
7
@DavidRoundy se você ainda está procurando uma resposta, agora é possível fazer o que está pedindo. Você pode especificar versione pathpara uma dependência e isso path
removerá
A documentação detalhada está disponível em doc.rust-lang.org/cargo/reference/…
David J.
1
É possível fazer o mesmo, mas com em gitvez de version? Algo assim my_lib = { path = "...", git = "..." }para que eu possa usar minha cópia local durante o desenvolvimento e o git remoto quando alguém clona o repo e tenta compilar o programa?
Ruben Kostandyan
0

Eu estava procurando por um equivalente a mvn install . Embora essa pergunta não seja exatamente uma duplicata da minha pergunta original, qualquer pessoa que encontrar minha pergunta original e seguir o link aqui encontrará uma resposta mais completa.

A resposta é "não há equivalente a mvn install porque você tem que codificar o caminho no arquivo Cargo.toml que provavelmente estará errado no computador de outra pessoa, mas você pode chegar bem perto."

A resposta existente é um pouco breve e tive que me debater um pouco mais para realmente fazer as coisas funcionarem, então aqui estão mais detalhes:

/usr/bin/cargo run --color=always --package re5 --bin re5
   Compiling re5 v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/re5)
error[E0432]: unresolved import `embroidery_stitcher`
 --> re5/src/main.rs:5:5
  |
5 | use embroidery_stitcher;
  |     ^^^^^^^^^^^^^^^^^^^ no `embroidery_stitcher` in the root

rustc --explain E0432 inclui este parágrafo que ecoa a resposta de Shepmaster:

Ou, se você tentou usar um módulo de uma caixa externa, pode ter perdido a extern cratedeclaração (que geralmente é colocada na raiz da caixa):

extern crate core; // Required to use the `core` crate

use core::any;

Mudar de usepara extern crateme trouxe isto:

/usr/bin/cargo run --color=always --package re5 --bin re5
   Compiling embroidery_stitcher v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/embroidery_stitcher)
warning: function is never used: `svg_header`
 --> embroidery_stitcher/src/lib.rs:2:1
  |
2 | fn svg_header(w: i32, h: i32) -> String
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(dead_code)] on by default

   Compiling re5 v0.1.0 (file:///home/thoth/art/2019/radial-embroidery/re5)
error[E0603]: function `svg_header` is private
 --> re5/src/main.rs:8:19
  |
8 |     let mut svg = embroidery_stitcher::svg_header(100,100);
  |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Eu tive que colocar um pubna frente dessa função

pub fn svg_header(w: i32, h: i32) -> String

Agora funciona.

Bob mutante
fonte
2
E agora esta resposta é um artigo em miniatura: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob