Yerel olarak yayınlanmamış bir sandık nasıl kullanılır?


103

Bir kütüphane yaptım:

cargo new my_lib

ve bu kitaplığı farklı bir programda kullanmak istiyorum:

cargo new my_program --bin
extern crate my_lib;

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

bunun işe yaraması için ne yapmam gerekiyor?

Aynı proje klasöründe değiller.

.
├── my_lib
└── my_program

Umarım bu mantıklıdır.

Yolu Kargo rehberine göre geçersiz kılabileceğimi düşündüm , ancak

Bu özelliği, Cargo'ya yerel yayınlanmamış kasaları nasıl bulacağını söylemek için kullanamazsınız.

Bu, Rust'un (1.3) en son kararlı sürümünü kullanırken gerçekleşir.

Yanıtlar:


137

Yürütülebilir dosyanın Cargo.toml dosyasına bir bağımlılık bölümü ekleyin ve yolu belirtin:

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

veya eşdeğer alternatif TOML:

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

Yerel bir yol yerine bir git deposunun nasıl kullanılacağı gibi daha fazla ayrıntı için bağımlılıkları belirlemek için Kargo belgelerine bakın .


8
Cargo.toml'den crates.io'ya atıfta bulunarak kendim (geliştirme için) yerel bir sandık kullanmanın bir yolu var mı, böylece diğerleri de kodumu oluşturabilir?
David Roundy

1
Şu anda varsayılan olarak mümkün değil. Bununla birlikte, yerel bir şubede çalışabilir, Cargo.toml'yi yerel bağımlılık referansları (veya karışık referanslar) ile değiştirebilir ve birleştirme öncesinde veya sırasında, ana Cargo.toml dosyasını geri alabilir veya saklayabilirsiniz.
Paul-Sebastian Manole

7
@DavidRoundy Eğer hala bir cevap arıyorsanız, artık istediğinizi yapmak mümkün. Her iki belirtebilir versionve pathbir bağımlılık için ve şerit olacak path:) yayınladığınızda dışarı parçasını
Connie Hilarides


1
Aynısını yapmak gityerine ile yapmak mümkün mü version? Bunun gibi bir şey my_lib = { path = "...", git = "..." }, yerel kopyamı geliştirme sırasında ve uzak git'i birisi depoyu klonladığında ve programı derlemeye çalıştığında kullanabilir miyim?
Ruben Kostandyan

0

Bir eşdeğerini arıyordum mvn install. Bu soru orijinal sorumun tam bir kopyası olmasa da, orijinal sorumla karşılaşan ve buradaki bağlantıyı izleyen herkes daha eksiksiz bir cevap bulacaktır.

Cevap, " mvn installKargo.toml dosyasındaki yolu muhtemelen başka birinin bilgisayarında yanlış olacak, ancak oldukça yakınlaşabileceğiniz için yolun sabit kodlanması gerektiği için buna eşdeğer yoktur ."

Mevcut cevap biraz kısa ve işleri gerçekten işe yarayabilmek için biraz daha etrafta dolaşmak zorunda kaldım, işte daha fazla ayrıntı:

/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 Shepmaster'ın cevabını yansıtan şu paragrafı içerir:

Veya harici bir kasadan bir modül kullanmayı denediyseniz, extern cratebeyanı kaçırmış olabilirsiniz (bu genellikle sandık köküne yerleştirilir):

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

use core::any;

'Dan bana şunu almak useiçin extern crategeçiyorum:

/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);
  |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

pubBu işlevin önüne bir tokat atmak zorunda kaldım

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

Şimdi çalışıyor.


2
Ve şimdi bu cevap minyatür bir makale: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.