#rust #rust-cargo #toml
#Ржавчина #ржавчина-груз #toml #rust-cargo
Вопрос:
Предположим, у вас есть зависимость под названием «dep», которая имеет две функции, называемые f1 и f2. Я хочу использовать «dep» с функцией f1, когда я создаю свой ящик в обычном режиме, но использую его с помощью f2 при его создании для тестов. Я знаю, что dev-зависимости — это те, которые нам нужны для тестов, и подумал, что следующая структура для Cargo.toml должна работать:
[dev-dependencies]
dep = { version = "1.0.0", features = ["f2"] }
[dependencies]
dep = { version = "1.0.0", features = ["f1"] }
Однако, похоже, что как только я добавлю «dep» с помощью «f1», компилятор проигнорирует упоминание об одной и той же зависимости в разделе dev-dependencies. С другой стороны, если сделать зависимость «необязательной», это не решит проблему, потому что тогда «dep» вообще не будет использоваться для тестов. Есть какие-нибудь идеи о том, как решить эту проблему или обойти ее красиво?
PS: Я заметил, что проблема отслеживается здесь: https://github.com/rust-lang/cargo/issues/7916 . Так что на данный момент я мог ожидать от респондентов только хороших обходных путей.
Комментарии:
1. Вы пробовали это и сталкивались с проблемами с этим? Мне кажется разумным предположить, что компилятор объединит набор функций по мере необходимости
2. Да, я пробовал, и, как уже было сказано, компилятор, похоже, проигнорировал определение в разделе dev-dependencies .
3. В качестве обходного пути я однажды установил зависимость как необязательную и запустил тесты
cargo test --all-features
.4. В качестве обновления по этому вопросу, похоже, что проблема 7916 была объединена. IIUC, вы также можете использовать распознаватель зависимостей версии 2 , который больше не объединяет dev- и обычные зависимости, если только рассматриваемая цель действительно не нуждается в них.
Ответ №1:
Это возможно с помощью rust 2021 с использованием resolver версии 2. как описано здесь . В частности, в нем говорится следующее:
Функции, включенные в dev-зависимостях, не будут унифицированы, если те же самые зависимости используются в качестве обычной зависимости, если только эти dev-зависимости в настоящее время не создаются
Для этого вам понадобится, чтобы ваш корневой пакет имел edition = "2021"
, затем вы можете использовать resolver = "2"
в своем манифесте ящика, чтобы включить желаемое поведение.