Конфигурация¶
Qualimetrix работает из коробки с разумными настройками по умолчанию. Файл конфигурации позволяет настроить пороговые значения, отключить правила и исключить пути, чтобы адаптировать инструмент под ваш проект.
Файл конфигурации¶
Создайте файл qmx.yaml в корне проекта. Qualimetrix автоматически ищет этот файл.
Также можно указать файл явно:
Секции конфигурации¶
Пути для анализа (paths)¶
Директории для анализа:
Примечание
Если вы передаёте пути через аргументы командной строки (например, vendor/bin/qmx check src/ lib/), они имеют приоритет над конфигурационным файлом.
Исключения (exclude)¶
Директории, которые полностью пропускаются. Файлы в этих директориях не анализируются вообще:
Включение сгенерированных файлов (include_generated)¶
По умолчанию файлы с аннотацией @generated в первых 2 КБ автоматически пропускаются при анализе. Чтобы включить их:
Эквивалент в CLI: --include-generated
Исключение путей из отчёта (exclude_paths)¶
Паттерны путей для подавления нарушений. В отличие от exclude, эти файлы всё равно анализируются (их метрики собираются), но нарушения не выводятся в отчёт. Поддерживаются префиксы директорий и glob-паттерны:
exclude_paths:
- src/Entity # префикс: все файлы в src/Entity/
- src/Metrics/*Visitor.php # glob: только файлы визиторов
Исключение неймспейсов (exclude_namespaces)¶
Подавление нарушений для классов из определённых неймспейсов (сопоставление по префиксу). Как и exclude_paths, файлы всё равно анализируются и метрики собираются, но нарушения не выводятся. Применяется ко всем правилам глобально:
Это полезно, когда целые поддеревья неймспейсов не должны генерировать нарушения. Для исключений на уровне отдельного правила используйте exclude_namespaces внутри конфигурации правила (см. ниже).
Также доступна как CLI-опция: --exclude-namespace (объединяется с YAML-конфигурацией).
Правила (rules)¶
Управление активными правилами и настройка пороговых значений.
Полное отключение правила:
Переопределение пороговых значений:
Каждое правило определяет уровни серьёзности. Когда метрика превышает порог, фиксируется нарушение соответствующего уровня. Например, правило цикломатической сложности имеет пороги для методов:
Это означает: выдавать предупреждение (warning), когда цикломатическая сложность метода достигает 15, и ошибку (error), когда достигает 25.
Сокращённая запись threshold:
Если вам нужен простой порог "прошёл/не прошёл" (все нарушения — ошибки), используйте threshold вместо отдельных warning и error:
rules:
complexity.cyclomatic:
method:
threshold: 15 # warning=15 и error=15 → все нарушения становятся ошибками
Это эквивалентно warning: 15 + error: 15. Полезно в CI, где нужен бинарный результат.
Ограничение
Нельзя смешивать threshold с явными ключами warning/error в одном правиле. Используйте либо threshold, либо пару warning/error.
Для правила design.type-coverage доступны специализированные варианты: param_threshold, return_threshold, property_threshold.
Вычисляемые метрики (computed metrics) также поддерживают threshold.
Исключение неймспейсов из правила:
Любое правило может исключить конкретные неймспейсы по префиксу. Нарушения из совпадающих неймспейсов подавляются:
rules:
complexity.cyclomatic:
exclude_namespaces:
- App\Tests
- App\Legacy
method:
warning: 15
error: 25
coupling.cbo:
exclude_namespaces:
- App\Tests
exclude_paths:
- src/Infrastructure/DependencyInjection
Это полезно, когда определённые неймспейсы (например, тесты, сгенерированный код, legacy-модули) не должны вызывать нарушения для конкретного правила, но при этом всё равно анализируются для сбора метрик.
Исключение путей из правила:
Любое правило может исключить конкретные файлы по префиксу пути или glob-паттерну. Нарушения из совпадающих файлов подавляются:
rules:
coupling.cbo:
exclude_paths:
- src/Metrics # префикс: все файлы в src/Metrics/
- src/Metrics/*Visitor.php # glob: только файлы визиторов
Работает совместно с exclude_namespaces -- оба фильтра применяются. В отличие от глобального exclude_paths, эта опция на уровне правила влияет только на конкретное правило, а не на все.
Переопределение порогов для символа через @qmx-threshold:
Помимо общих для проекта порогов в YAML, можно переопределять пороги для отдельных классов или методов с помощью аннотаций @qmx-threshold прямо в исходном коде:
/**
* @qmx-threshold complexity.cyclomatic method.warning=20 method.error=40
*/
class ComplexStateMachine
{
// Методы этого класса используют повышенные пороги сложности
}
Полный синтаксис и примеры смотрите в разделе Baseline > @qmx-threshold.
Отключение правил (disabled_rules)¶
Отключение конкретных правил или целых групп:
Эквивалент в CLI: --disable-rule=code-smell.boolean-argument --disable-rule=duplication
Только указанные правила (only_rules)¶
Запустить только указанные правила (все остальные отключаются):
Эквивалент в CLI: --only-rule=complexity.cyclomatic --only-rule=complexity.cognitive
Условие завершения с ошибкой (fail_on)¶
Управление тем, какие уровни серьёзности приводят к ненулевому коду завершения:
fail_on: error # Завершение с ошибкой только при error (по умолчанию)
# fail_on: warning # Завершение с ошибкой и при warning
# fail_on: none # Никогда не завершаться с ошибкой из-за нарушений
Примечание
По умолчанию fail_on установлен в error. Предупреждения по-прежнему отображаются в выводе, но не приводят к ненулевому коду завершения. Для старого поведения (падение при предупреждениях) используйте fail_on: warning.
Исключение измерений здоровья (exclude_health)¶
Исключить конкретные измерения здоровья из оценки. Исключённые измерения не отображаются в сводке здоровья и не влияют на общую оценку:
Эквивалент в CLI: --exclude-health=typing --exclude-health=maintainability
Лимит памяти (memory_limit)¶
Лимит памяти PHP для анализа. По умолчанию используется значение memory_limit из php.ini.
Эквивалент в CLI: --memory-limit=1G
Формат вывода (format)¶
Формат отчёта по умолчанию:
Кэширование (cache)¶
Управление кэшированием AST для ускорения повторных запусков:
Эквивалент в CLI: --no-cache для отключения, --cache-dir=DIR для изменения директории.
Параллельная обработка (parallel)¶
Количество параллельных воркеров для анализа файлов:
parallel:
workers: 4 # Фиксированное количество воркеров
# workers: 0 # Отключить параллелизм (однопоточный режим)
По умолчанию Qualimetrix автоматически определяет оптимальное количество воркеров по числу ядер CPU. Эквивалент в CLI: --workers=4
Совет
Используйте workers: 0 для отладки или в окружениях без ext-parallel.
Определение неймспейсов (namespace)¶
Стратегия определения соответствия неймспейсов и директорий:
namespace:
strategy: chain # По умолчанию: chain (сначала psr4, затем tokenizer)
# strategy: psr4 # Только PSR-4 (требует composer.json)
# strategy: tokenizer # Парсинг неймспейса из PHP-токенов
composer_json: composer.json # Путь к composer.json для PSR-4
Связанность (coupling)¶
Настройка префиксов неймспейсов фреймворка для метрики CBO (Coupling Between Objects). Зависимости от неймспейсов фреймворка отслеживаются отдельно как cbo_app и ce_framework:
Если framework-namespaces не указаны, cbo_app равен cbo (без эффекта).
Агрегация (aggregation)¶
Управление группировкой неймспейсов для агрегированных метрик:
aggregation:
prefixes:
- App\Domain
- App\Infrastructure
auto_depth: 2 # Автоопределение глубины группировки
Пресеты¶
Пресеты — это именованные наборы конфигурации, которые применяют предопределённые настройки: пороговые значения, отключённые правила, поведение при ошибках — одним флагом. Вместо ручной настройки десятков параметров выберите пресет, соответствующий зрелости вашего проекта.
| Пресет | Описание |
|---|---|
strict |
Строгие пороговые значения для новых проектов. Устанавливает fail_on: warning |
legacy |
Ослабленные пороговые значения для легаси-кодовых баз. Отключает шумные правила |
ci |
Явный режим CI. Устанавливает fail_on: error |
# Использовать один пресет
vendor/bin/qmx check src/ --preset=strict
# Комбинировать несколько пресетов
vendor/bin/qmx check src/ --preset=strict,ci
# Использовать пользовательский файл пресета
vendor/bin/qmx check src/ --preset=./my-preset.yaml
Порядок приоритетов: Пресеты применяются после обнаружения composer.json, но до qmx.yaml. Ваш файл конфигурации всегда переопределяет значения из пресетов.
Несколько пресетов: При комбинировании пресетов они объединяются слева направо — последующие пресеты переопределяют предыдущие, за исключением списковых ключей вроде disabled_rules, которые накапливаются. Например, --preset=legacy,ci даёт ослабленные пороговые значения с поведением CI при ошибках.
Внимание
only_rules не накапливается между пресетами — значение из последнего пресета полностью заменяет предыдущие. Это сделано намеренно: only_rules — это ограничивающий фильтр, и объединение расширяло бы область действия.
Пользовательские пресеты: Любой YAML-файл со структурой qmx.yaml можно использовать как пресет. Передайте путь к файлу вместо имени встроенного пресета.
Полный пример¶
# Или начните с пресета и настройте:
# vendor/bin/qmx check src/ --preset=strict
paths:
- src/
exclude:
- vendor/
- tests/Fixtures/
exclude_paths:
- src/Entity
- src/DTO
exclude_namespaces:
- App\Tests
include_generated: false
format: summary
fail_on: error
cache:
enabled: true
dir: .qmx-cache
parallel:
workers: 4
coupling:
framework-namespaces:
- Symfony
- Doctrine
exclude_health:
- typing
disabled_rules:
- code-smell.boolean-argument
- duplication
rules:
complexity.cyclomatic:
exclude_namespaces:
- App\Tests
exclude_paths:
- src/Generated
method:
warning: 15
error: 25
size.method-count:
warning: 25
error: 40
Параметры CLI имеют приоритет¶
Параметры командной строки всегда имеют приоритет над значениями из конфигурационного файла. Например:
# В конфиге указано paths: [src/], но CLI переопределяет
vendor/bin/qmx check lib/
# Добавить дополнительные исключения поверх конфига
vendor/bin/qmx check src/ --exclude-path='src/Generated/*'
Это позволяет экспериментировать без редактирования файла конфигурации.
Валидация конфигурации¶
Qualimetrix валидирует конфигурационный файл и сообщает о типичных ошибках понятными сообщениями.
Неизвестные ключи¶
Любой нераспознанный ключ — на верхнем уровне или внутри секции — вызывает ошибку с подсказкой:
Invalid configuration in qmx.yaml:
Unknown key "workes" in "parallel" section. Did you mean "workers"?
Ошибки типов¶
Если значение имеет неверный тип, вы получите понятное сообщение вместо молчаливого отката на значение по умолчанию:
Неизвестные имена правил¶
Опечатки в именах правил в секции rules: отклоняются:
Tip
Установите значение ~ (YAML null) или оставьте пустым, чтобы явно использовать значение по умолчанию — это всегда допустимо.
Что дальше?¶
Смотрите справочник параметров CLI для полного списка параметров командной строки.