Пример ошибки:
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 в системе. Если он не установлен или компилятор не может его обнаружить (например, из-за неправильных путей), сборка прерывается. Особенно часто это случается:
- На Windows без менеджера пакетов.
- В свежих окружениях, где OpenSSL не установлен.
- При кросс-компиляции и статической линковке.
Какие решения существуют?
Поиск в интернете приводит на StackOverflow где предлагается две категории решений:
Установка OpenSSL в систему
# Ubuntu/Debian sudo apt install libssl-dev # macOS (via Homebrew) brew install openssl
Укажите путь через
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 локально и автоматически компилировать его. Это:
- Избавляет от ручной установки OpenSSL.
- Гарантирует совместимость версий.
- Удобно для переносимости (например, в Docker-контейнерах).
Какой недостаток у этого решения?
При первых сборках или check’ах проекта сборка будет немного дольше. Т.к. мы компилируем не только код нашего проекта, но и код самого OpenSSL. Однако при последующих сборках благодаря эта проблема решается благодаря инкрементальному кешированию.