Пиков / КАПО
Как читать авторский курс и нормативные материалы

Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.

П21. Conan graph и package identity

Цель

Получить из Conan-проекта граф зависимостей в JSON и убедиться, что компоненты имеют устойчивую идентичность — name/version, из которой строится PURL pkg:conan/..., а не безымянный pkg:generic/.... Проверяемый результат: JSON-граф на диске и таблица «компонент → версия → PURL», где у каждой строки заполнены имя и версия.

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

# 1. граф зависимостей всего проекта в машинном виде (Conan 2.x)
conan graph info . --format=json > conan-graph.json

# 2. список узлов графа: ref (name/version), package_type
#    (jq показывает ключи nodes; ref содержит идентичность пакета)
jq '.graph.nodes | to_entries[] | {ref: .value.ref, type: .value.package_type}' conan-graph.json

# 3. для одного пакета — проверить идентичность напрямую
conan list "openssl/*" -r conancenter

Что Conan добавляет к C/C++ Без пакетного менеджера у C/C++ библиотеки нет устойчивого ключа — генератор фактов вынужден ставить pkg:generic/openssl без гарантии версии. Conan хранит name, version, user, channel и recipe revision, поэтому из его графа выводится нормальный pkg:conan/openssl@3.2.1. Это и есть «package identity», ради которой делается практика.

Что вы должны увидеть

В conan-graph.json — узлы с заполненным ref (фрагмент после jq):

[
  { "ref": "myapp/1.0", "type": "application" },
  { "ref": "openssl/3.2.1", "type": "shared-library" },
  { "ref": "zlib/1.3.1", "type": "static-library" }
]

Узел 0 всегда conanfile самого проекта; остальные — зависимости с name/version. Ориентир: число узлов с непустым ref равно числу записей в requires/tool_requires рецепта плюс их транзитивные зависимости (обычно 3–15 для тестового проекта).

Из ref строится PURL для SBOM:

Компонент ref в Conan PURL
OpenSSL openssl/3.2.1 pkg:conan/openssl@3.2.1
zlib zlib/1.3.1 pkg:conan/zlib@1.3.1

Где приватные qualifiers Если в ref есть user/channel (например openssl/3.2.1@mycorp/stable), PURL получит приватные qualifiers (?user=mycorp&channel=stable), которые ломают публичный матчинг. Это вход в П24. PURL нормализация и private qualifiers.

Если не получилось

Критерий зачёта

Показать преподавателю: conan-graph.json и таблицу «компонент → version → PURL» минимум для трёх зависимостей, где видно, что Conan дал реальную версию и устойчивый pkg:conan/.... Отдельно отметить любой ref с user/channel как кандидата на нормализацию в П24. PURL нормализация и private qualifiers.

Нормативная связка

Устойчивая идентичность компонента (имя+версия+PURL) — это полнота идентификаторов SBOM по BSI TR-03183-2 v2.1.0 и базовый элемент SBOM по CISA Minimum Elements for SBOM. Без неё матчинг на уязвимости даёт false negative — см. модуль М04. Управляемость состава — требование ГОСТ Р 56939-2024. Смежные практики модуля М09: П20. CMake dependency graph, П22. ELF dynamic dependencies, П24. PURL нормализация и private qualifiers. Шаблон: Паспорт open source библиотеки.