- PVSM.RU - https://www.pvsm.ru -
Все, кто плотно сидит на C++ и использует Conan, знают: сам по себе пакетный менеджер — это только полдела. Настоящее веселье начинается, когда нужно раскатать одинаковые настрйки на всю команду и десяток CI-нод. Репозитории, профили, хуки, кастомные настройки всё это хозяйство нужно как-то синхронизировать.
Раньше у нас был conan config install, который тянул конфиги из git-репозитория или zip-архива. Решение рабочее, но с душком: попробуйте воспроизвести сборку двухлетней давности, если за это время мастер-ветка с конфигами улетела далеко вперед.
В Conan версии 2.x (и последних минорных обновлениях) завезли киллер-фичу: conan config install-pkg. Теперь конфигурация — это полноценный пакет. Давайте разберемся, почему это меняет правила игры.
Команда conan config install git@github.com/myorg/conan-config.git проста как валенок. Но у нее есть фатальные недостатки:
Сложность версионирования: Переключаться между ветками или тегами через аргументы командной строки неудобно.
Отсутствие прослеживаемости (traceability): В lock-файле проекта никак не отражалось, какая именно версия конфига использовалась для сборки бинарника.
Гетерогенные среды: Если у вас часть разработчиков на Windows, а часть на Linux, приходилось городить скрипты внутри репозитория с конфигами, чтобы не подсунуть «никсовые» настройки в PowerShell.
С приходом install-pkg мы упаковываем настройки в стандртный Conan-пакет. Это значит, что для конфигов теперь работают версии, семантическое версионирование (SemVer), диапазоны (version ranges) и, самое главное, ревизии.
Рецепт (conanfile.py [1]) для конфигурации выглядит до смешного просто. Главное — указать package_type = "configuration"
from conan import ConanFile
from conan.tools.files import copy
import os
class MyGlobalConfig(ConanFile):
name = "my_team_config"
version = "1.2.0"
package_type = "configuration"
# Если нужно разделять конфиги по ОС
settings = "os"
def package(self):
# Копируем профили, хуки и глобальный conf
subdir = "win" if self.settings.os == "Windows" else "nix"
copy(self, "*", src=os.path.join(self.source_folder, subdir),
dst=self.package_folder)
Заливаем это в свой Artifactory как обычную библиотеку:
conan export-pkg . -s os=Linux
conan upload my_team_config/1.2.0 -r my_remote
Вместо того чтобы прокидывать ветки гита, вы используете привычный синтаксис:
conan config install-pkg "my_team_config/[>=1.2 <2]"
Если в репозитории выйдет патч 1.2.1, команда обновления сама подтянет актуальные настройки.
Это то, чего нам не хватало. Теперь, когда вы создаете lock-файл для проекта, Conan записывает туда не только верси библиотек (OpenSSL, Boost и т.д.), но и точную ревизию пакета конфигурации.
Если через три месяца прилетит баг, вы сможете развернуть окружение с точно такими же хуками и профилями, какие были в момент релиза.
В Conan есть хитрая настройка core.package_id:config_mode. Если её включить, версия вашего конфига начнет влиять на package_id всех собираемых пакетов.
# В вашем global.conf
core.package_id:config_mode=minor_modeУстановили конфиг версии 1.2.0 — собрали бинарники. Обновились до 1.3.0 (где, допустим, изменились флаги компилятора по умолчанию) — Conan поймет, что старые бинарники больше не валидны, и инициирует пересборку. Это уровень контроля, недоступный при обычном config install.
Автоматизация через conanconfig.yml
Чтобы не заставлять разработчиков вбивать длинные команды, в корне проекта (или репозитория с конфигами) можно положить файл conanconfig.yml:
Установили конфиг версии 1.2.0 — собрали бинарники. Обновились до 1.3.0 (где, допустим, изменились флаги компилятора по умолчанию) — Conan поймет, что старые бинарники больше не валидны, и инициирует пересборку. Это уровень контроля, недоступный при обычном config install.
Чтобы не заставлять разработчиков вбивать длинные команды, в корне проекта (или репозитория с конфигами) можно положить файл conanconfig.yml:
Теперь достаточно просто написать:
packages:
- my_team_config/[>=1.0]
- custom_hooks/1.2@enterprise/stable
urls:
- https://my-artifactory.local/api/conan/repo
Теперь достаточно просто написать:
conan config install-pkg
Conan сам найдет файл, сходит в нужные репозитории и раскатает настройки. А если добавить к этому .conanrc с определением conan_home = ./.conan, можно добиться полной изоляции окружения для каждого конкретного проекта.
Переход от Git-ориентированного конфига к пакетному — это логичный шаг в эволюции Conan. Мы получаем:
Единый механизм доставки (тот же Artifactory, те же права доступа).
Прозрачное управление зависимостями через диапазоны версий.
Гарантию того, что "бинарник вчера" и "бинарник сегодня" собраны в идентичной среде
Автор: Broski790
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/c-3/445655
Ссылки в тексте:
[1] conanfile.py: http://conanfile.py
[2] Image: https://sourcecraft.dev/
[3] Источник: https://habr.com/ru/articles/1003146/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1003146
Нажмите здесь для печати.