Перейти к содержанию

Разрешение зависимостей в окружении сборки

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

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

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

Параметры разрешения зависимостей в окружении, пути к пакетному менеджеру и параметры выполнения регулируются следующими параметрами в команде scan:

  • --dotnet-resolve / --dotnet-path / --dotnet-args
  • --go-resolve / --go-path
  • --gradle-resolve / --gradle-path / --gradle-args
  • --maven-resolve / --maven-path / --maven-args
  • --npm-resolve / --npm-path / --npm-args
  • --poetry-resolve / --poetry-path / --poetry-args
  • --sbt-resolve / --sbt-path / --sbt-args
  • --yarn-resolve / --yarn-path / --yarn-args
  • --pip-resolve / --pip-path / --pip-args
  • --composer-resolve / --composer-path / --composer-args
  • --pnpm-resolve / --pnpm-path / --pnpm-args
  • --conda-resolve / --conda-lock-path / --conda-args

Пример команды:

./johnny \
scan dir . \
--api_token <api_token> \
--api_url <api_url> \
--dotnet-resolve \
--dotnet-path <path/to/dotnet>

При необходимости перечисленные параметры можно добавить в конфигурационный файл агента.

Поддерживаемые экосистемы

.NET

Базовый манифест, который берется за основу при разрешении зависимостей: .csproj.

Для проектов .NET агент выполняет команду:

dotnet restore

После чего анализируется файл obj/project.assets.json, содержащий полную информацию о зависимостях и их версиях. Выполняется в каталоге, в котором расположен .csproj файл.

Go

Базовые манифесты, которые берутся за основу при разрешении зависимостей: go.mod, go.sum.

Агент использует данные из файлов go.mod и go.sum, добавляя записи из go.sum, которые отсутствуют в go.mod (только строки без постфикса /go.mod). Затем выполняется:

go mod graph

Полученный список пар parent → child используется для построения дерева зависимостей. При отсутствии указания родителя используется команда:

go mod why <package>

Если родительская связь не установлена, зависимость исключается с предупреждением.

Gradle

Базовые манифесты, которые берутся за основу при разрешении зависимостей: build.gradle, build.gradle.kts.

Для разрешения зависимостей в Gradle по умолчанию необходимо задать следующее значение:

--gradle-path ./gradlew

С заданным значением сначала выполняется пользовательская задача:

./gradlew CodeScoring_All_Dependencies --configuration <конфигурация>

Если задача отсутствует, используется стандартная команда:

./gradlew dependencies --configuration <конфигурация>

Агент анализирует консольный вывод и формирует граф зависимостей.

Maven

Базовый манифест, который берется за основу при разрешении зависимостей: pom.xml.

Для проектов Maven используется команда:

mvn dependency:tree -f <pom.xml> -DoutputFile=<tmpdir/mdt.json>

Агент парсит файл mdt.json, содержащий полную структуру зависимостей. При наличии файла maven-dependency-tree.txt он будет обработан как самостоятельный lock-файл, и резолв не будет выполняться.

npm

Базовый манифест, который берется за основу при разрешении зависимостей: package.json.

Агент выполняет:

npm install

Далее анализируется сформированный файл package-lock.json, фиксирующий дерево зависимостей и используемые версии.

pnpm

Базовый манифест, который берется за основу при разрешении зависимостей: package.json.

Выполняется команда:

pnpm install

Анализируется lock-файл pnpm-lock.yaml, в котором содержатся данные обо всех зависимостях.

yarn

Базовый манифест, который берется за основу при разрешении зависимостей: package.json.

Выполняется команда:

yarn install

Агент парсит файл yarn.lock, содержащий информацию о зависимостях и их версиях.

pip

Для Python-проектов используется команда:

pip freeze

Результат команды фиксирует список установленных зависимостей и их версии. В результатах указывается фиктивный файл codescoring_pip_for_freeze.

Poetry

Базовый манифест, который берется за основу при разрешении зависимостей: pyproject.toml.

Выполняются две команды:

poetry debug resolve --tree
poetry debug resolve

Первый вывод содержит дерево с констрейнтами, второй — конкретные версии. Агент сопоставляет данные и формирует итоговый граф.

sbt (Scala)

Базовый манифест, который берется за основу при разрешении зависимостей: build.sbt.

Для Scala используется команда:

sbt dependencyTree

Анализируется консольный вывод, содержащий структуру зависимостей проекта.

Swift

Базовый манифест, который берется за основу при разрешении зависимостей: Package.swift.

Для Swift-экосистемы агент выполняет:

swift build --package-path <путь_к_Package.swift>

Далее парсится файл Package.resolved, содержащий зафиксированные версии пакетов.

Composer (PHP)

Базовый манифест, который берется за основу при разрешении зависимостей: composer.json.

Выполняется команда:

composer install

Агент анализирует файл composer.lock, в котором зафиксировано состояние зависимостей.

Conda

Базовые манифесты, которые берутся за основу при разрешении зависимостей: environment.yml, environment.yaml, meta.yml, meta.yaml.

Для проектов, использующих Conda, агент выполняет:

conda-lock -f <environment.yml> --filename <tmpdir/conda-lock.yml>

После этого анализируется файл conda-lock.yml, в котором зафиксированы все зависимости проекта.