參考鏈接:https://mozillazg.com/2017/10/rust-cargo-use-local-crate-package.html
默認在 Cargo.toml 中指定了包以后,Cargo build 的時候會從 crates.io 上下載遠程的對應包代碼。
本文將介紹如何在 Cargo.toml 中指定使用本地機器上某個目錄下的包, 方便調試本地開發的包或者在沒網的環境下開發和調試。
待調用的本地包
假設我們要使用的包是 hello, 通過 cargo new hello 創建:
$ cargo new --lib hello
Created library `hello` project
$ tree hello
hello
├── Cargo.toml
└── src
└── lib.rs
1 directory, 2 files
我們給這個包加一個 hi 函數:
// cat hello/src/lib.rs
pub fn hi(name: &str) {
println!("hi {}!", name);
}
現在我們要在別的地方使用 hello 這個包,比如調用 hello.hi 函數,該如何設置呢?
配置使用本地包
假設我們在 hello 的同級目錄有一個 demo 項目,這個項目將使用 hello 包里的函數。
先創建這個 demo 項目:
$ cargo new demo --bin
Created binary (application) `demo` project
然后在項目中增加調用代碼:
// cat demo/src/main.rs
extern crate hello;
fn main() {
hello::hi("mozillazg");
}
最后關鍵的一步就是配置 Cargo.toml 使用本地的 hello 包。
先來看一下當前的目錄結構:
$ tree .
.
├── demo
│ ├── Cargo.toml
│ └── src
│ └── main.rs
└── hello
├── Cargo.toml
└── src
└── lib.rs
4 directories, 4 files
可以看出來, hello 相對於 demo/Cargo.toml 的目錄位置是 ../hello 。 然后我們配置一下 demo/Cargo.toml 指定使用這個目錄下的 hello 包:
[dependencies]
hello = { path = "../hello" }
在 demo 項目目錄下執行 cargo run 看看效果:
# ~/demo
$ cargo run
Compiling hello v0.1.0 (file:///Users/mozillazg/hello)
Compiling demo v0.1.0 (file:///Users/mozillazg/demo)
Finished dev [unoptimized + debuginfo] target(s) in 0.47 secs
Running `target/debug/demo`
hi mozillazg!
可以看到 demo 確實使用了本地的 hello 包的代碼。👍
P.S. 上面的:
[dependencies] hello = { path = "../hello" }
也可以改為:
[dependencies.hello] path = "../hello"