如何使用本地未发布的板条箱?


103

我做了一个图书馆:

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)时。

Answers:


137

在您的可执行文件的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文件。
保罗·塞巴斯蒂安·马诺

7
@DavidRoundy如果您仍在寻找答案,现在可以按照您的要求去做。您可以同时指定version和并指定path依赖项,并且path在发布时将其
删除


1
是否可以这样做git而不是version?这样的事情my_lib = { path = "...", git = "..." }使我可以在开发过程中使用本地副本,并在有人克隆存储库并尝试编译程序时使用远程git?
鲁本·科斯塔迪安

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;

从切换useextern 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
突变Bob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.