Предотвращение транзитивных зависимостей composer

18 апр. 2024 г.

Всем привет! Сегодня хотел бы рассказать про инструмент для отслеживания транзитивных зависимостей composer - ComposerRequireChecker.

Проблема транзитивных зависимостей

Понятие транзитивных зависимостей подробно описаны в README пакета.

Прямые зависимости проекта указываются в файле composer.json. У этих пакетов могут также быть свои зависимости - транзитивные, которые устанавливаются автоматически.

Прямые зависимости используются непосредственно в коде проекта. Транзитивные зависимости должны использоваться только в прямых зависимостях. Если транзитивная зависимость используется в коде проекта, то она должна быть добавлена в composer.json, как прямая зависимость.

Реальная проблема может возникнуть при обновлении пакетов с помощью composer update. Список зависимостей пакетов может поменяться, и транзитивная зависимость может быть удалена из проекта. Если транзитивная зависимость используется напрямую в коде, то такой код перестанет работать.

Решение

ComposerRequireChecker решает эту проблему. Он сканирует код проекта и composer.json файл, и находит использование в коде транзитивных зависимостей.

Настройка ComposerRequireChecker

Пакет настраивается с помощью конфигурационного файла composer-require-checker.json. Пример:

{
  "symbol-whitelist": [],
  "scan-files" : [
    "public/index.php",
    "bin/*.php",
    "src/*.php"
  ]
}

Подробнее конфигурация описана в README

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

php composer-require-checker.phar check --config-file=composer-require-checker.json composer.json

Запуск в CI/CD, Github actions

Для постоянного мониторинга транзитивных зависимостей добавим проверку в CI/CD. Пример для github actions:

- name: Run composer require checker
  run: |
      wget https://github.com/maglnet/ComposerRequireChecker/releases/download/4.10.0/composer-require-checker.phar
      php composer-require-checker.phar check --config-file=$(pwd)/composer-require-checker.json composer.json

Пример использования

Пример работы ComposerRequireChecker можно увидеть в проекте placeholder-service.

При настройке пакета я обнаружил несколько транзитивных зависимостей, использующихся в коде проекта. Добавил их в composer.json. Таким образом, ComposerRequireChecker помогает держать зависимости в порядке.

На этом пока все. Спасибо за внимание!