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

Правила обнаружения файлов (Discovery)

Правила этой группы сообщают о выборе файлов самим прогоном, а не о коде, который он проанализировал. Фильтр, который ничего не убрал, выглядит ровно как отсутствие фильтра: отчёт покрывает файлы, которые автор собирался исключить, и каждое число в нём посчитано по набору, о котором никто не просил.


Непривязанное исключение

Rule ID: discovery.unmatched-exclude

Что измеряется

Каждое значение --exclude и каждая запись exclude: в qmx.yaml сверяется с каталогами, которые прогон действительно обошёл. Значение, не убравшее ни одного каталога, сообщается.

Почему это важно

Без этого канала промахнувшееся исключение и его отсутствие дают побайтно одинаковый вывод. В отчёте нет ничего, что сказало бы автору: --exclude=vendor не сработал, потому что прогон и так начинался ниже vendor/, а exclude: [tests] перестал совпадать, когда каталог переименовали в test/. Исключаемые файлы анализируются, дают находки, а исключение остаётся в конфигурации и выглядит работающим.

Область и severity

Канал сообщается на уровне проекта, severity warning.

Он судится только на прогоне, чьи пути покрывают всё, что composer.json проекта объявляет production-кодом, — корни psr-4 и psr-0, записи classmap и files наравне. На более узком прогоне — по одному подкаталогу, по git-срезу — паттерн не привязывается просто потому, что названный им код лежит вне среза. Это выбор вызывающего, а не ошибка автора, поэтому правило молчит, а не пересказывает вызывающему его же сужение. Проект, чей манифест не объявляет production-автозагрузки вовсе — нет composer.json, он не парсится или в нём нет ни одной production-секции, — не даёт проверке знаменателя, и там правило тоже молчит.

Паттерн судится по всему дереву проекта, а не по анализируемым путям. exclude: [tests], написанный для qmx check ., ничего не убирает под qmx check src/, но названный им каталог на месте — и правило молчит. Сообщается только паттерн, который не убрал бы ни одного каталога нигде в проекте.

Правило ID Что обнаруживает
Непривязанное исключение discovery.unmatched-exclude Паттерн исключения, не убравший ни одного каталога

Пример

bin/qmx check src/ --exclude=Generated

Когда каталога Generated нигде в проекте нет:

[project] discovery.unmatched-exclude
  The exclude pattern "Generated" matched no directory anywhere in the project,
  so nothing was left out for it. Every file it was written to skip was
  measured, and this report covers them.

Опции

Опция По умолчанию Описание
enabled true Включает или выключает правило

Конфигурация

# qmx.yaml
rules:
  discovery.unmatched-exclude:
    enabled: true
bin/qmx check src/ --disable-rule=discovery.unmatched-exclude