[Перевод] Управление пакетами C ++ с помощью Conan: Введение

Прим. пер.: Перевод и примеры исправлены, дополнены и адаптированы с учётом современных версий Conan 2, инструментов сборки и библиотек.


Управление зависимостями C++ может оказаться непростой задачей. Зачастую разработчику приходится самостоятельно заботиться о загрузке исходных кодов, интеграции готовых к использованию двоичных файлов, сборке, установке и связывании библиотек. В этой статье я расскажу вам о Conan — менеджере пакетов C/C++ с открытым исходным кодом, который отлично справляется с этими задачами.

Conan — это свободный менеджер пакетов с открытым исходным кодом (MIT), разработанный для C и C++. Он похож на NuGet и npm для .NET и JavaScript соответственно. Он может работать в любой операционной системе, поддерживающей Python. К ним относятся Linux, Mac, а также Windows.

Поскольку для C++ пока не существует стандартного менеджера пакетов, Conan пытается стать им. В последнее время этот инструмент привлёк больше внимания сообщества и завоевал доверие крупных компаний, таких как Huawei, Keysight и Mercedes-Benz [1].

В этой статье я сначала покажу вам, как настроить Conan. Затем я приведу пример, чтобы продемонстрировать, как этот инструмент работает на практике.

Установка

Распространенным и рекомендуемым способом установки Conan, например в Ubuntu, является использование pip:

$ pip3 install conan

Также допустимы следующие варианты:

После завершения установки вы можете убедиться, что Conan работает нормально, введя команду:

$ conan --help

Примечание: в некоторых операционных системах после установки требуется перезагрузка.

Конан в действии

Чтобы увидеть, как можно использовать Conan для получения и сборки пакетов, давайте рассмотрим простой проект на C++, который зависит от сторонней библиотеки. Например, следующий исходный код зависит от SQLite. Он пытается открыть базу данных SQLite под названием «test.db». Если он не находит её, то создаёт новый файл базы данных с таким же названием. Если код не может открыть или создать файл, он выводит сообщение об ошибке SQLite.

#include <iostream>
#include <sqlite3.h>

int main() 
{
  sqlite3 *db;
  int rc = sqlite3_open("test.db", &db);
  if (SQLITE_OK == rc) {
      std::cout << "Opened database successfully \n";
      sqlite3_close(db);
  } else {
      std::cout << "Can't open database: " << sqlite3_errmsg(db) << "\n";
  }
  return 0;
}

Чтобы собрать исходный код, нам нужно использовать Conan, который получит для нас пакет SQLite. Сначала нам нужно узнать название и версию пакета, который мы хотим использовать. Следующая команда выведет список всех sqlite3 пакетов, доступных на удалённом сервере conancenter:

$ conan remote list
conancenter: https://center2.conan.io [Verify SSL: True, Enabled: True]

$ conan search sqlite3* --remote=conancenter
Connecting to remote 'conancenter' anonymously
Found 34 pkg/version recipes matching sqlite3* in conancenter
conancenter
  sqlite3
    sqlite3/3.36.0
    sqlite3/3.37.2
    sqlite3/3.38.5
    sqlite3/3.39.0
    sqlite3/3.39.1
    sqlite3/3.39.2
    sqlite3/3.39.3
    sqlite3/3.39.4
    sqlite3/3.40.0
    sqlite3/3.40.1
    sqlite3/3.41.1
    sqlite3/3.41.2
    sqlite3/3.42.0
    sqlite3/3.43.0
    sqlite3/3.43.1
    sqlite3/3.43.2
    sqlite3/3.44.0
    sqlite3/3.44.1
    sqlite3/3.44.2
    sqlite3/3.45.0
    sqlite3/3.45.1
    sqlite3/3.45.2
    sqlite3/3.45.3
    sqlite3/3.46.0
    sqlite3/3.46.1
    sqlite3/3.47.0
    sqlite3/3.47.1
    sqlite3/3.47.2
    sqlite3/3.48.0

Давайте выберем самую новую версию 3.48.0. Далее нам нужно создать файл conanfile.txt и указать полное название пакета. Также нам нужно указать генератор. Секция [generators] позволяет генерировать файлы, которые компиляторы или системы сборки будут использовать для поиска зависимостей и сборки проекта. В данном случае, поскольку наш проект основан на CMake, мы будем использовать CMakeDeps для генерации информации о том, где установлены файлы библиотеки SQLite, и CMakeToolchain для передачи информации о сборке в CMake с помощью файла CMake toolchain. Файл conanfile.txt должен выглядеть следующим образом:

[requires]
sqlite3/3.48.0

[generators]
CMakeDeps
CMakeToolchain

Помимо conanfile.txt, для сборки нашего проекта нам нужен профиль Conan. Профили Conan позволяют пользователям определять набор конфигураций для таких параметров, как компилятор, конфигурация сборки, архитектура, общие или статические библиотеки и т. д. По умолчанию Conan не пытается автоматически определить профиль, поэтому нам нужно его создать. Чтобы Conan попытался определить профиль на основе текущей операционной системы и установленных инструментов, выполните:

$ conan  detect --force

Это определит операционную систему, архитектуру сборки и настройки компилятора на основе среды. Это также установит конфигурацию сборки как Release по умолчанию. Созданный профиль будет сохранен в домашней папке Conan с именем default и будет использоваться Conan во всех командах по умолчанию, если только в командной строке не указан другой профиль. Примером вывода этой команды для Linux может быть:

$ conan profile detect --force
detect_api: Found cc=gcc- 14.2.1
detect_api: gcc>=5, using the major as version
detect_api: gcc C++ standard library: libstdc++11

Detected profile:
[settings]
arch=x86_64
build_type=Release
compiler=gcc
compiler.cppstd=gnu17
compiler.libcxx=libstdc++11
compiler.version=14
os=Linux

Последний файл, который нам нужно создать, — это CMakeLists.txt. В приведённом ниже примере есть все необходимые настройки для запуска нашего проекта.

cmake_minimum_required (VERSION 3.30)
project(TestConan CXX)

set(CMAKE_CXX_STANDARD 17)
find_package(SQLite3 REQUIRED)

add_executable(testConan test_conan.cpp)
target_link_libraries(testConan SQLite::SQLite3)

Теперь, когда наш проект готов, следующим шагом будет установка и сборка библиотеки зависимостей SQLite. Для этого нам нужно запустить команду установки Conan, которая создаст новый каталог с именем build. Для этого введите следующее:

$ conan install . --output-folder=build --build=missing

Как вы можете видеть, произошло несколько событий:

Далее давайте соберём исходный код. Я бы хотел использовать систему сборки Ninja (подробнее о Ninja в этой статье). Для создания введите следующие команды:

$ cd build
$ cmake .. -G Ninja -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release
$ ninja

В папке должен быть создан исполняемый файл testConan. Вы можете запустить его для тестирования программы. Наберите:

$ ./testConan
Opened database successfully

Вы должны увидеть, что программа выводит правильное сообщение и в папке build был создан новый файл базы данных с именем «test.db».

Полезные команды

Ссылки

@Tantrido
21.02.2025 00:35 UTC
Первоисточник

Комментарии

@
21.02.2025 15:37 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@bulba15
18.04.2025 07:36 UTC
0

как вариант еще попробовать NIX SHELL там еще проще ,тоже с конаном намучался , кучу ошибок споймал ,несколько часов потратил и все надоело пошел в nix

18.04.2025 10:25 UTC
0

Интересно, но до конана пока не дотягивает: Nix runs on Linux and macOS.

@comargo
21.02.2025 18:36 UTC
+1

В файле conanfile.txt забыли layout указать. Без него немножко грустно становится

@Tantrido
21.02.2025 20:24 UTC
+1

Да, с ним интереснее:

[layout]
cmake_layout

Тогда папку вывода указывать не нужно:

conan install . --build=missing
cd build
cmake .. -G Ninja -DCMAKE_TOOLCHAIN_FILE="./Release/generators/conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release
ninja

Тогда Conan и CMake файлы раскидываются по отдельным папкам и не мешаются с исполняемым файлом проекта.

23.02.2025 16:42 UTC
0

Ну и тут же,
1) после conan install файлы пресетов создаются, так что можно сделать `cmake --preset conan-release` (если я не путаю)
2) и ни кто не мешает сделать `conan build .` что при необходимости выполнит другие команды конана (включая install) если они прописаны в conanfile.py (не txt, а именно py который позволяет сделать более глубокую логику)

@george3
21.02.2025 20:06 UTC
0

a что еще для linux есть? conan не выглядит для меня как 'простое' решение.

@Tantrido
21.02.2025 20:40 UTC
+1

Вот полный список: https://stackoverflow.com/a/36023212/630169

Из живого есть только vcpkg и Buckaroo, но такого количества и качества поддержки, документации, сообщества, сопровождения, количества пакетов, поддерживаемых платформ, систем сборок и т.п. как у Conan пока не наблюдается и близко! Хотя у vcpkg тоже не слабая документация - тут MS на высоте.

22.02.2025 16:10 UTC
0

Vcpkg хоть и не без недостатков, но по перечисленным параметрам не уступает Conan.

23.02.2025 16:54 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@DungeonLords
22.02.2025 13:42 UTC
0

Почему во всех статьях предполагается, что в системе уже установлен toolchain?.. Canon может сам установить, скажем, clang? То есть могу я указать clang в списке зависимостей (подобно как в данной статье в качестве зависимости указан SQLite)?

@Tantrido
22.02.2025 15:10 UTC
+1

Canon может сам установить, скажем, clang?

Canon не может, а Conan может:
https://docs.conan.io/2/tutorial/consuming_packages/use_tools_as_conan_packages.html

То есть могу я указать clang в списке зависимостей (подобно как в данной статье в качестве зависимости указан SQLite)?

Да можно (см. ссылку выше), в том то и смысл: можно использовать любой компилятор под любую платформу, что и сказано в начале.

Почему во всех статьях предполагается, что в системе уже установлен toolchain?.

Про всё во введении не расскажешь - статья увеличится в несколько раз.

@comargo
23.02.2025 16:51 UTC
+1

теоретически может. Где-то в одном из туториалов было "укажите mingw-gcc как tool, и всё будет установлено и сможете в кросс-компайл." да и cmake они тоже рекомендуют указать как tool.

Только дальше начинаются зависимость на зависимости и зависимостью погоняет. Когда я пытался указать как зависимость Qt - устал компилять, да результата не получил, так как в conan-center хранится ограниченное количество вариантов опций/компиляторов/систем, а того чего нет - приходится на месте строить. А для постройки тянется одно, другое, третье... и еще системные требования. В cross-compile тоже не очень получилось, уже не вспомню почему, но что-то ему не хватило для счастья....

В итоге плюнул, и заявил что Qt должна быть в системе установлена. А те библиотеки, который от нее зависят, вручную переписывал conanfile'ы и в свой репозиторий клал.

В общем идея на пять, а реализация недотягивает.... и винить то в общем-то их не в чем.

@Dimitrii5151
22.02.2025 15:17 UTC
+3

У conan 2 есть как много минусов, так и много плюсов. С одной стороны, он очень гибкий, поэтому не несет в себе ровно один сценарий использования при организации своих проектов/ библиотек, с другой стороны - он показывает к чему нужно стремиться при проектировании многомодульных систем и дает все инструменты для этого.

Да и его поддерживают производители множества библиотек, т.к. выгладывают своевременно новые версии библиотек в conancenter.

Есть репы, которые аккумулируют уже созданные примеры использования.
Пример: https://github.com/Dimitrius-dev/conan2-examples

Мб кому-нибудь полезно, если хочется посмотреть именно на уже собранные шаблоны.

@Playa
22.02.2025 16:20 UTC
+2

давайте рассмотрим простой проект

А давайте не простой? Почти в каждой статье берут сишную(!) либу на два файла и героически используют её API.

Давайте с зависимостями с кучей таргетов и плагинами. И с санитайзерами. А бонусом соберём это всё под Android.

@Tantrido
22.02.2025 16:29 UTC
0

В моём текущем проекте так и есть, но описывать не могу - NDA: Linux, QNX, куча целей, разные toolchain, сотни библиотек, в т.ч. свои закрытые. Однако это уже будет не статья, а большой учебник: вот, например, можно взять отличный учебник от Conan и вперёд: https://docs.conan.io/2/tutorial.html

@Ingulf
29.03.2025 12:12 UTC
0

пока выглядит так, что проще один раз руками поставить зависимость, чем добавлять еще несколько шагов к сборке и еще одну тулзу