Прочитать на английском

Поделиться через


Обзор vcpkg

vcpkg — это бесплатный и открытый диспетчер пакетов C/C++, поддерживаемый корпорацией Майкрософт и сообществом C++, работающим в Windows, macOS и Linux. Это средство C++ на самом сердце и написано с помощью скриптов C++ и CMake. Он предназначен для решения уникальных точек боли с помощью управления библиотеками C/C++.

Почему vcpkg?

  • Более 2300 библиотек с открытым исходным кодом для выбора в курированном реестре обычно создаются для проверки совместимости ABI
  • Создание собственного реестра пользовательской библиотеки с помощью собственных пакетов пользовательской библиотеки
  • Согласованный кроссплатформенный интерфейс для Windows, macOS и Linux
  • Легко добавлять библиотеки в проект с любой системой сборки и проекта
  • Сборка зависимостей из исходного или скачиваемого предварительно проверенного двоичных файлов ABI с более чем 70 конфигурациями, доступными по умолчанию, и бесконечной настройкой для конкретных требований
  • Предотвращение конфликтов версий и проблем с бриллиантами между зависимостями с помощью уникальной структуры управления версиями
  • Для пользователей MSBuild и CMake: автоматическая интеграция с средой сборки для простого приобретения зависимостей
  • Доверенные студенты, разработчики с открытым исходным кодом, хоббисты и профессионалы, включая некоторые из крупнейших предприятий

Функции vcpkg

Порты и триплеты

Порт vcpkg — это рецепт сборки версии, который создает пакет. Наиболее распространенный тип пакета — библиотека C/C++, состоящая из заголовков, исходного кода и двоичных файлов.

Триплет записывает целевую среду сборки (ЦП, ос, компилятор, среду выполнения и т. д.) в одном удобном имени. vcpkg предоставляет более 70 тройных по умолчанию, но вы также можете определить свой собственный.

Чтобы установить пакет в системе, vcpkg запускает файл рецепта порта, который является скриптом CMake. Скрипт может содержать шаги для скачивания исходного кода или запуска сборки в системе. Во время сборки vcpkg использует сведения в триплете, чтобы убедиться, что созданный пакет соответствует требуемой конфигурации.

Двоичное кэширование

Хотя vcpkg создает библиотеки из источника всякий раз, вы можете создать резервные копии встроенных пакетов в двоичном кэше. Это позволяет другим компьютерам разработчика или непрерывной интеграции ссылаться на эти предварительно созданные пакеты, не выполняя новую сборку каждый раз. vcpkg определяет, требуется ли перестроение, проверив, содержит ли кэш действительный существующий пакет с соответствующими двоичными файлами.

Манифесты

Вы можете объявить прямые зависимости и добавить дополнительные функции или ограничения версий в файл манифеста. Файлы манифестов можно проверить в системе управления версиями и предоставить к ней общий доступ.

Управление версиями

vcpkg имеет уникальный способ обработки версий пакетов. Файл манифеста может ссылаться на одну базовую версию по умолчанию. Базовые показатели позволяют управлять зависимостями без конфликтов без конфликтов с полной воспроизводимостью. Кроме того, вы по-прежнему можете иметь более расширенный контроль, закрепляя отдельные версии пакетов.

Реестры

Реестр — это коллекция портов и доступных версий, которые может установить пользователь vcpkg. vcpkg предоставляет управляемый реестр библиотек с открытым исходным кодом по умолчанию. Вы также можете создать собственные реестры для настроек, исправлений или частных библиотек.

Кэширование активов

Кэширование активов позволяет vcpkg работать в воздушных и автономных средах, обеспечивая непрерывность бизнеса, даже если удаленный узел исчез или скомпрометирован. В нем используются зеркальные копии загрузки для отправки и восстановления ресурсов, таких как исходный код и средства сборки.

vcpkg по сравнению с другими диспетчерами пакетов

vcpkg по сравнению с NuGet

NuGet — это диспетчер пакетов .NET, который часто используется для разработки C/C++, особенно для решений MSBuild, содержащих проекты .NET. Как правило, команда Microsoft C++ не рекомендует использовать NuGet для разработки C/C++, так как NuGet имеет несколько ограничений:

  • Вкусы компиляции. Так как NuGet не может создавать пакеты из источника на лету, необходимо предоставить предварительно созданные двоичные файлы для сопоставления всех возможных ограничений двоичного интерфейса приложения (ABI) для всех пользователей. Пользователь отвечает за правильное построение пакетов. Также трудно различать двоичные файлы из-за отсутствия соответствующих метаданных. Это приводит к тому, что пользователь помещает архитектуру, операционную систему и сведения компилятора в имя пакета. Это нежелательно, так как ограничения на архитектуру, ОС и сведения компилятора не могут быть применены во время приобретения пакета.
  • Двоичный файл и источник. NuGet разработан с нуля, чтобы обеспечить относительно небольшие предварительно созданные двоичные файлы. Разработчикам необходимо иметь доступ к исходному коду, чтобы обеспечить совместимость ABI, производительность, целостность и отладку.
  • Нет поддержки Пакета NuGet PackageReference. Пакет NuGet PackageReference не поддерживается для .vcxproj файлов и не планируется добавлять его в будущем из-за технических и архитектурных различий между проектами C++ и .NET MSBuild. Это означает, что пользователи NuGet C++ не получат преимущества от таких функций, как использование глобального кэша и ссылки на зависимости в простых терминах MSBuild с доступом к условной логике.
  • Транзитивное отслеживание ABI. vcpkg перестраивает зависимости с открытым кодом, затронутые изменением в определенном пакете. Например, если новое обновление выпущено для Boost, vcpkg перестраивает все зависимости boost и библиотеки, зависящие от Boost, чтобы убедиться, что они по-прежнему работают. Запросы на вытягивание для обновления библиотек в репозитории vcpkg не объединяются до тех пор, пока не будут устранены конфликты времени сборки.

vcpkg по сравнению с системными диспетчерами пакетов

Существует множество системных диспетчеров пакетов для Linux, macOS и Windows, которые можно использовать для получения библиотек C/C++ и управления ими. Эти диспетчеры пакетов обычно отлично подходят для управления приложениями. Но из-за универсальной природы их поддержки они часто не могут предоставлять полезные функции особенно для разработчиков C/C++. Хотя ваш пробег будет отличаться, и некоторые системные диспетчеры пакетов предоставляют некоторые из этих функций, ни один из них не имеет всех следующих значений:

  • Распространяемые ресурсы разработчика: vcpkg может получить распространяемые ресурсы разработчика, чтобы помочь в отладке.
  • Предварительно созданные пакеты и сборка из источника: vcpkg может создавать пакеты из источника на основе пользовательских требований. Нет необходимости иметь дело с предварительно созданными предварительно скомпилированных пакетов, чтобы получить их для работы.
  • Управление версиями на уровне каталога: vcpkg позволяет зависеть от набора версий совместимых пакетов, а не от микроуправляемых отдельных версий пакетов. Вы по-прежнему можете сделать это по мере необходимости, но интерфейс по умолчанию предназначен для простого начала работы.
  • Несколько копий одной и той же библиотеки в одной системе: можно установить несколько копий одной зависимости в одной системе с vcpkg, в то время как системные диспетчеры пакетов могут установить одну версию в одно, системное расположение. Это усложняет ситуацию при наличии нескольких проектов в зависимости от разных версий библиотеки.
  • Размер каталога: так как vcpkg специализирован для C/C++, он имеет очень большую коллекцию библиотек C/C++ по сравнению с системными диспетчерами пакетов, и она активно поддерживается. Как правило, вы, скорее всего, найдете полезные и актуальные библиотеки для разработки C++.
  • Поддержка кроссплатформенных пакетов: диспетчеры пакетов системы предоставляют пакеты, заблокированные в определенной системе. Если вам нужно выбрать несколько вариантов операционной системы, вам потребуется найти другой диспетчер пакетов для второй системы. В отличие от этого, vcpkg — это кроссплатформенный диспетчер пакетов. Таким образом, вам просто нужно соответствующим образом настроить целевые сборки.

Существуют ситуации, когда системный диспетчер пакетов абсолютно имеет смысл:

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

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

Начало работы с vcpkg

Чтобы попробовать vcpkg, ознакомьтесь с нашими вводными руководствами:

Если система сборки не является CMake или MSBuild, vcpkg также поддерживает ручную интеграцию с предпочтительной средой.