Флаг --fix-dry-run

Флаг --fix-dry-run в CLI ESLint используется для моделирования автоматических исправлений без внесения изменений в файловую систему. Он запускает механизм фиксов (fixers), вычисляет потенциальные правки к коду и возвращает результат так, как если бы они были применены, но фактически не переписывает исходные файлы.

Основная цель заключается в разделении этапов анализа и модификации кода. В отличие от стандартного режима автоматического исправления, здесь происходит исключительно вычисление трансформаций, что делает режим безопасным для предварительной оценки изменений в больших кодовых базах и в CI-средах.


Механизм работы фиксов

Внутри ESLint каждая ошибка правила может содержать функцию fix(), которая описывает, как преобразовать исходный код. При обычном запуске с --fix эти изменения применяются напрямую к файлам.

При использовании --fix-dry-run процесс останавливается на этапе формирования набора изменений:

  1. Выполняется парсинг исходного кода в AST.
  2. Применяются правила линтинга.
  3. Для нарушений, поддерживающих автоисправление, формируются фиксы.
  4. Выполняется расчет итогового «исправленного состояния» кода.
  5. Результат выводится в stdout или через выбранный formatter.
  6. Запись в файлы не производится.

Таким образом, создается виртуальная версия результата работы --fix.


Отличие --fix и --fix-dry-run

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

Режим Формирование фиксов Изменение файлов Назначение
--fix Да Да Автоматическое исправление кода
--fix-dry-run Да Нет Предварительный просмотр исправлений

--fix ориентирован на перезапись исходников, тогда как --fix-dry-run ориентирован на анализ потенциальных изменений.


Формат выходных данных

В зависимости от выбранного formatter-а ESLint вывод может различаться, но наиболее информативным считается JSON-формат.

При использовании JSON formatter-а результат содержит:

  • список файлов
  • перечень сообщений об ошибках
  • информацию о фикcах
  • итоговые версии кода (если поддерживается formatter)

Пример логической структуры:

{
  "filePath": "src/app.js",
  "messages": [
    {
      "ruleId": "semi",
      "message": "Missing semicolon",
      "line": 12,
      "column": 25,
      "fix": {
        "range": [120, 120],
        "text": ";"
      }
    }
  ],
  "output": "const a = 1;"
}

Поле output в контексте --fix-dry-run отражает предполагаемый результат применения фиксов, но файл src/app.js остается неизменным.


Внутреннее представление изменений

Каждый фикс в ESLint представляет собой операцию над диапазоном символов исходного текста:

  • range: границы замены
  • text: вставляемый фрагмент

При наличии нескольких фиксов система применяет стратегию объединения изменений, чтобы избежать конфликтов. В dry-run режиме происходит тот же процесс, но итоговая композиция не записывается в файловую систему.


Поведение при конфликтующих исправлениях

Если несколько правил предлагают пересекающиеся изменения:

  • фикс с более высоким приоритетом может перекрывать другой
  • часть исправлений может быть отброшена
  • итоговый output отражает результат разрешения конфликтов

При этом логика разрешения конфликтов идентична обычному --fix, так как используется один и тот же механизм планирования фиксов внутри ESLint.


Использование в анализе изменений

--fix-dry-run применяется для получения информации о потенциальных трансформациях кода без риска изменения репозитория. Это позволяет оценивать:

  • объем автоматических исправлений
  • влияние новых правил на существующий код
  • количество строк, которые будут затронуты
  • потенциальные конфликты фиксов

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


Поведение в больших кодовых базах

В монорепозиториях или проектах с тысячами файлов ESLint выполняет следующие оптимизации:

  • кэширование AST для ускорения повторного анализа
  • ленивое вычисление фиксов
  • агрегация результатов по файлам

--fix-dry-run не снижает объем вычислений по сравнению с --fix, так как этап генерации фиксов выполняется полностью, однако отсутствует операция записи на диск, что уменьшает I/O нагрузку.


Влияние конфигурации правил

На поведение --fix-dry-run напрямую влияет конфигурация правил:

  • правила с fix: true участвуют в генерации изменений
  • правила без фиксов только диагностируют ошибки
  • plugin-правила могут добавлять собственные трансформации AST

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


Ограничения режима

Несмотря на сходство с --fix, dry-run имеет ряд ограничений:

  • отсутствие реального изменения файлов исключает проверку побочных эффектов файловой системы
  • формат вывода зависит от выбранного formatter-а и может не включать полный diff
  • некоторые интеграции IDE могут игнорировать dry-run результат
  • невозможность цепочного применения фиксов через внешние инструменты

Интеграция в CI/CD процессы

В системах непрерывной интеграции ESLint --fix-dry-run используется как промежуточный шаг между проверкой качества кода и автоматическим форматированием:

  • генерация отчета о возможных исправлениях
  • сравнение состояния кода между ветками
  • контроль допустимого объема автофиксов

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


Поведение с различными форматтерами

Вывод --fix-dry-run зависит от выбранного форматтера:

  • stylish — человекочитаемый список изменений
  • json — структурированные данные для автоматической обработки
  • checkstyle — интеграция с внешними системами анализа

В формате JSON наиболее полно отражается состояние потенциальных изменений, включая итоговый код и метаданные фиксов, что делает его предпочтительным для автоматизированных систем поверх ESLint.