Rust. Решение проблемы: Could not find directory of OpenSSL installation...

Пример ошибки:

warning: openssl-sys@0.9.106: Could not find directory of OpenSSL installation...
error: failed to run custom build command for `openssl-sys v0.9.106`

Решение: cargo add openssl -F vendored


Почему это происходит?

Крейт openssl-sys (часто является зависимостью библиотек работающих с http таких, как actix) требует наличия OpenSSL в системе. Если он не установлен или компилятор не может его обнаружить (например, из-за неправильных путей), сборка прерывается. Особенно часто это случается:

Какие решения существуют?

Поиск в интернете приводит на StackOverflow где предлагается две категории решений:

  1. Установка OpenSSL в систему

    # Ubuntu/Debian
    sudo apt install libssl-dev
    
    # macOS (via Homebrew)
    brew install openssl
    
  2. Укажите путь через OPENSSL_DIR Если OpenSSL установлен, но не обнаружен, задайте переменную окружения:

    # Пример для Linux/macOS
    export OPENSSL_DIR=/usr/local/opt/openssl@1.1
    
    # Для Windows (в PowerShell)
    $env:OPENSSL_DIR = "C:\OpenSSL-Win64"
    

По моему мнению это ошибочное решение. Так как у проекта создаются неявные зависимости, которые напрямую требуется устанавливать вручную каждому участнику команды. Это накладывает дополнительные проблемы в виде необходимости поддержания в актуальном состоянии скриптов сборок и документации.

Однако, зачем нам подключать зависимости через механизмы операционной системы, если у нас уже есть под рукой менеджер зависимостей cargo, который уже может решить нашу проблему “из коробки”.

Единственно верное решение ошибки

Мы воспользуемся cargo как менеджером зависимости. И вместо того, что бы устанавливать OpenSSL как глобальную зависимость на уровне всей системы, мы установим зависимость как локальную для проекта

cargo add openssl -F vendored

Ожидаемым результатом является расширение Cargo.toml файла например вот так:

[dependencies]
openssl = { version = "0.10.71", features = ["vendored"] }

Что делает vendored?

Флаг активирует возможность крейта openssl скачать исходный код OpenSSL локально и автоматически компилировать его. Это:

Какой недостаток у этого решения?

При первых сборках или check’ах проекта сборка будет немного дольше. Т.к. мы компилируем не только код нашего проекта, но и код самого OpenSSL. Однако при последующих сборках благодаря эта проблема решается благодаря инкрементальному кешированию.