#rust #rust-cargo
#Ржавчина #ржавчина-груз
Вопрос:
Мне трудно понять запись функций в Rust toml.
Допустим, у меня есть зависимость (в данном случае sqlx), говорящая
sqlx = { version = "0.4.0-beta.1", default-features = false, features = [ "runtime-tokio", "macros", "json", "mysql" ] }
В книге Rust говорится о функциях:
Cargo поддерживает функции, позволяющие выражать:
- параметры условной компиляции (можно использовать через атрибуты cfg);
- необязательные зависимости, которые улучшают пакет, но не являются обязательными; и
- кластеры необязательных зависимостей, таких как postgres-all, которые будут включать пакет postgres, пакет postgres-macros и, возможно, другие пакеты (такие как библиотеки-макеты времени разработки, средства отладки и т. Д.).
Функция пакета — это либо необязательная зависимость, либо набор других функций.
Что это значит в моем случае? Должен ли я устанавливать, т. Е. Вводить, например, «runtime-tokio» в качестве дополнительной зависимости в моем Cargo.toml или sqlx уже поставляется с «runtime-tokio»?
Кстати, что такое cfg-атрибуты?
Комментарии:
1. doc.rust-lang.org/reference/…
2. Включение функции позволяет cargo использовать все зависимости, необходимые для этой функции. Вам больше ничего не нужно делать.
Ответ №1:
Всякий раз, когда вы указываете функции для зависимости, вы просите Cargo скомпилировать эту зависимость по-другому, способом, который ящик выбрал для предоставления в качестве опции. Часто, но не всегда, функция называется так же, как и ящик, от которого она может зависеть (для обеспечения, например, реализаций признаков).
Должен ли я устанавливать, т. Е. Вводить, например, «runtime-tokio» в качестве дополнительной зависимости в моем Cargo.toml или sqlx уже поставляется с «runtime-tokio»?
Нет; Cargo.toml for sqlx
позаботится об указании необходимых зависимостей для любой комбинации функций.
что такое cfg-атрибуты?
Атрибуты — это то, что написано #[attribute_name_here]
, например #[test]
, и #[derive(Debug)]
. Атрибут #[cfg(...)]
разрешает условную компиляцию, то есть сообщает компилятору притворяться, что определенные части исходного кода не существуют.
Часто функция имеет два эффекта:
- Он включает необязательную зависимость (это указано
Cargo.toml
либо явно в[features]
разделе, либо неявно функцией, имеющей то же имя, что и зависимость от ящика). - Это приводит к тому, что код в crate, который использует эту зависимость, компилируется (а не игнорируется) с использованием условной компиляции.