Нужно ли устанавливать функции rust crate отдельно?

#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, который использует эту зависимость, компилируется (а не игнорируется) с использованием условной компиляции.