Загрузка и использование внешних зависимостей

Последнее обновление: 05.05.2024

Рассмотрим, как мы можем с помощью Cargo загружать и использовать внешние зависимости.

Следует сказать, что кроме собственно стандартной библиотеки типов и функциональностей, которая поставляется вместе с компилятором Rust и которые мы можем использовать по умолчанию в нашей программе, также есть куча различных пакетов, которые разрабатываются различными разработчиками по всему миру. Для хранения подобных пакетов существует централизованная система - https://crates.io/. И мы можем использовать эти пакеты в своей программе.

Рассмотрим на примере пакета https://crates.io/crates/rand, который позволяет задействовать в Rust случайные числа. Возьмем проект Cargo, созданный в прошлой теме (или создадим новый).

Вначале создадим новый проект Cargo (либо используем ранее созданный). Для создания нового проекта выполним команду new. Допустим, наш проект будет называться hello. Так, для создания проекта выполним команду:

cargo new hello

После этого в текущей папке будет создан каталог hello, который будет выглядеть следующим образом:

Dependency in Rust

В проекте нас будет интересовать прежде всего файл конфигурации проекта Cargo.toml и файл кода main.rs из папки src.

Вначале укажем в файле Cargo.toml зависимость, которую надо загрузить и которую мы собираемся использовать. По умолчанию он выглядит примерно таким образом:

[package]
name = "hello"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

Конкретные данные в случае имени проекта, версии и издания могут отличаться, однако секция [dependencies] по умолчанию пуста. Именно в этой секции указываются внешние пакеты, которые надо загрузить.

ДЛя загрузки внешних зависимостей можно использовать два подхода. Первый подход заключается в указании загружаемых пакетов и их версих непосредственно в секции [dependencies]. Изменим данную секцию следующим образом:

[dependencies]
rand = "0.8.5"

Вначале идет название крейта или пакета - "rand", а после знака равно его версия. То есть в моем случае весь файл Cargo.toml будет выглядеть следующим образом:

[package]
name = "hello"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rand = "0.8.5"

Стоит отметить, что Cargo применяет семантическое версионирование. Так, версия "0.8.5" в реальности является сокращением от "^0.8.5", что, в свою очередь, означает, что версия должна быть как минимум 0.8.5, но ниже 0.9.0.

Теперь перейдем к файлу main.rs и изменим его код следующим образом:

use rand::Rng;	// используем пакет rand

fn main() {
    let random_number = rand::thread_rng().gen_range(0..10);

    println!("Сгенерированное число: {}", random_number);
}

Вначале здесь подключается тип (трейт) rand::Rng из пакета rand. Трейт Rng определяет ряд методов, в частности, метод gen_range(), который принимает в качестве параметра последовательность и возвращает случайное число из этой последовательности.

Чтобы получить случайное число, сначала обращаемся к функции rand::thread_rng(), которая возврашает объект структуры rand::rngs::ThreadRng. Для этой структуры реализован трейт rand:Rng, и соответственно через ее объект можно вызвать метод gen_range() для генерации случайного числа:

let random_number = rand::thread_rng().gen_range(0..10);

То есть в данном случае мы получим случайное число из диапазона от 0 до 10.

Теперь построим и запустим проект командой cargo run (либо можно использовать для построения команду cargo build, а потом отдельно запустить исполняемый файл)

C:\rust\hello> cargo run
    pdating crates.io index
  Downloaded rand_core v0.6.4
  Downloaded getrandom v0.2.14
  Downloaded cfg-if v1.0.0
  Downloaded rand_chacha v0.3.1
  Downloaded ppv-lite86 v0.2.17
  Downloaded rand v0.8.5
  Downloaded libc v0.2.154
  Downloaded 7 crates (935.8 KB) in 0.63s
   Compiling libc v0.2.154
   Compiling cfg-if v1.0.0
   Compiling ppv-lite86 v0.2.17
   Compiling getrandom v0.2.14
   Compiling rand_core v0.6.4
   Compiling rand_chacha v0.3.1
   Compiling rand v0.8.5
   Compiling hello v0.1.0 (C:\rust\hello)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.31s
     Running `target/debug/hello`
Сгенерированное число: 0
C:\rust\hello>

При построении проекта Cargo проверяет секцию [dependencies] и загружает все крейты (пакеты), которые отсутствуют. Кроме того, загружаются пакеты, от которых зависит загружаемый пакет. После загузки пакетов Rust компилирует их и затем компилирует проект.

И таким образом, после запуска проекта мы увидим на консоли некоторое случайное число.

Если после последнего запуска никаких изменений в файл Cargo.toml не было произведено, то Cargo ничего заново не загружает и не компилирует, а использует ранее загруженные и скомпилированные пакеты. Если в код не было внесено никаких изменений, то при запуске через Cargo он также не перекомпилируется.

Cargo.lock и обновление зависимостей

Стоит отметить, что при первом построении проекта создается файл Cargo.lock. Cargo определяет все версии зависимостей, соответствующие критериям, а затем записывает их в файл Cargo.lock. При втором и последующих построениях проекта Cargo увидит, что файл Cargo.lock уже существует, и будет использовать указанные там версии, а не выполнять всю работу по определению версий заново. Это позволяет автоматически создавать воспроизводимую сборку.

Однако что, если вышла новая версия пакета (например 0.8.6), и мы хотим использовать ее вместо старой? В этом случае нам достаточно изменить версию пакета в Cargo.toml и выполнить команду:

cargo update

Эта команда игнорирует файл Cargo.lock и определяет все последние версии, указанные в Cargo.toml. Затем Cargo запишет эти версии в файл Cargo.lock. В противном случае по умолчанию Cargo будет искать только версии выше 0.8.5 и ниже 0.9.0. И при следующем построении проекта Cargo обновит реестр доступных крейтов.

Ручное добавление зависимостей

Второй подход в установке зависимостей заключается выполнении команды:

cargo add [название_пакета]

После cargo add указывается название добавляемого пакета. Например, для работы со случайными числами в Rust есть такой пакет rand. И для его установки мы можем выполнить команду

cargo add rand

После этого в проект будет добавлен соответствующий пакет, а в секции [dependencies] будет указана запись о пакете.

Помощь сайту
Юмани:
410011174743222
Номер карты:
4048415020898850