วิธีใช้ลังที่ไม่ได้เผยแพร่ในท้องถิ่น


113

ฉันสร้างห้องสมุด:

cargo new my_lib

และฉันต้องการใช้ไลบรารีนั้นในโปรแกรมอื่น:

cargo new my_program --bin
extern crate my_lib;

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

ฉันต้องทำอย่างไรจึงจะได้ผล

ไม่ได้อยู่ในโฟลเดอร์โครงการเดียวกัน

.
├── my_lib
└── my_program

หวังว่านี่จะสมเหตุสมผล

ฉันคิดว่าจะสามารถลบล้างเส้นทางได้ตามคู่มือการขนส่งสินค้าแต่มันระบุ

คุณไม่สามารถใช้คุณสมบัตินี้เพื่อบอกคาร์โก้ว่าจะหาลังที่ไม่ได้เผยแพร่ในท้องถิ่นได้อย่างไร

นี่คือเมื่อใช้ Rust (1.3) เวอร์ชันเสถียรล่าสุด

คำตอบ:


150

เพิ่มส่วนการพึ่งพาให้กับCargo.tomlของปฏิบัติการของคุณและระบุเส้นทาง:

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

หรือ TOML ทางเลือกที่เทียบเท่า:

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

ตรวจสอบเอกสาร Cargo เพื่อระบุการอ้างอิงสำหรับรายละเอียดเพิ่มเติมเช่นวิธีใช้ที่เก็บ git แทนเส้นทางภายในเครื่อง


8
มีวิธีใช้ลังท้องถิ่นด้วยตัวเอง (สำหรับการพัฒนา) ในขณะที่ออกจาก Cargo.toml โดยอ้างถึง crates.io เพื่อให้ผู้อื่นสามารถสร้างรหัสของฉันได้หรือไม่
David Roundy

1
เป็นไปไม่ได้ตามค่าเริ่มต้นในขณะนี้ อย่างไรก็ตามคุณสามารถทำงานในสาขาท้องถิ่นแทนที่ Cargo.toml ด้วยการอ้างอิงการอ้างอิงในพื้นที่ (หรือการอ้างอิงแบบผสม) และก่อนที่คุณจะรวมหรือระหว่างนั้นให้เปลี่ยนกลับหรือเก็บไฟล์ Cargo.toml หลักไว้
Paul-Sebastian Manole

7
@DavidRoundy หากคุณยังคงมองหาคำตอบตอนนี้คุณสามารถทำสิ่งที่คุณต้องการได้แล้ว คุณสามารถระบุทั้งสองversionและpathสำหรับการอ้างอิงและจะตัดpathส่วนนั้นออกเมื่อคุณเผยแพร่ :)
Connie Hilarides

ดูเอกสารโดยละเอียดได้ที่doc.rust-lang.org/cargo/reference/…
David J.

1
เป็นไปได้ไหมที่จะทำแบบเดียวกัน แต่ใช้gitแทนversion? อะไรทำนองนี้my_lib = { path = "...", git = "..." }เพื่อให้ฉันสามารถใช้สำเนาภายในเครื่องของฉันในระหว่างการพัฒนาและ git ระยะไกลเมื่อมีคนโคลน repo และพยายามรวบรวมโปรแกรม?
Ruben Kostandyan

0

ฉันกำลังมองหาสิ่งที่เทียบเท่ากับmvn install. แม้ว่าคำถามนี้จะไม่ซ้ำกับคำถามเดิมของฉัน แต่ใครก็ตามที่สะดุดกับคำถามเดิมของฉันและไปที่ลิงก์ที่นี่จะพบคำตอบที่สมบูรณ์ยิ่งขึ้น

คำตอบคือ "ไม่มีทางเทียบเท่าได้mvn installเนื่องจากคุณต้องฮาร์ดโค้ดเส้นทางในไฟล์ Cargo.toml ซึ่งอาจผิดในคอมพิวเตอร์ของคนอื่น แต่คุณสามารถเข้าใกล้ได้ดี"

คำตอบที่มีอยู่นั้นสั้นไปหน่อยและฉันต้องรออีกสักพักกว่าจะทำงานได้จริงดังนั้นนี่คือรายละเอียดเพิ่มเติม:

/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:

หรือหากคุณพยายามใช้โมดูลจากลังภายนอกคุณอาจพลาดการextern crateประกาศ (ซึ่งโดยปกติจะวางไว้ในรูทของลัง):

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

use core::any;

เปลี่ยนจากเป็นuseให้extern crateฉัน:

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

ฉันต้องตบpubหน้าฟังก์ชั่นนั้น

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

ตอนนี้ใช้งานได้แล้ว


2
และตอนนี้คำตอบนี้เป็นบทความย่อ: purplefrog.com/~thoth/rust-external-libraries
Mutant Bob
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.