Как вытащить зависимость с разными функциями в Cargo.toml «зависимости» и «dev-зависимости»?

#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" в своем манифесте ящика, чтобы включить желаемое поведение.