Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Тема
Описание
Доп.

По мере развития вашего проекта может возникнуть ситуация, когда библиотечный крейт будет становиться все больше, и вы захотите разделить ваш пакет на несколько библиотечных крейтов.

Cargo предоставляет функциональность под названием workspaces, которая помогает управлять несколькими взаимосвязанными пакетами, которые разрабатываются в тандеме

Workspace (Рабочее пространство) - представляет собой набор пакетов, которые разделяют те же Cargo.lock и выходной каталог.

У нас будет рабочее пространство, содержащее двоичную и две библиотеки. Бинарный файл, который будет обеспечивать основную функциональность, будет зависеть от двух библиотек. Одна библиотека предоставит add_one функцию, а вторая - add_two функцию.

File Cargo.toml:

[workspace]

members = [
    "adder",
    "add_one",
]

File add_one/src/lib.rs:

use rand;
pub fn add_one(x: i32) -> i32 {
    x + 1
}
// $ cargo test -p add_one
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        assert_eq!(add_one(2), 3);
    }
}

File add_one/Cargo.toml:

[package]
name = "add_one"
version = "0.1.0"
edition = "2021"
 
[dependencies]
rand = "0.8.5"

File adder/src/main.rs:

use rand;
use add_one;

// $ cargo run -p adder
fn main() {
    let num = 10;
    println!("Hello, world! {num} plus one is {}!", add_one::add_one(num));
}

File adder/Cargo.toml:

[package]
name = "adder"
version = "0.1.0"
edition = "2021"
 
[dependencies]
rand = "0.8.5"
add_one = { path = "../add_one" }

Запуск:

$ cargo test -p add_one

$ cargo run -p adder

Использование рабочего пространства [workspace]

cargo-workspaces

Рабочее пространство является набором пакетов, которые совместно используют один и тот же файл Cargo.lock и папку target для хранения конечных программных продуктов (будь то бинарные файлы или библиотеки)

[workspace]

members = [
    "adder",
    "add-one",
]

$ tree .

├── Cargo.lock
├── Cargo.toml
├── add-one
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── adder
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── target

Для связи крейтов добавьте им зависимости

Файл: adder/Cargo.toml

[dependencies]
add-one = { path = "../add-one" }

Запуск конкретного крейта

$ cargo run -p adder
$ cargo test -p add-one

Если мы хотим использовать внешнюю зависимость, то следует добавить ее во все Cargo.toml используемых крейтов и эта зависимость будет в общем Cargo.lock в единственном варианте (одна версия на всех)