Как запустить ESLint только для измененных файлов

Bash + Git + ESLint

ESLint — необходимый инструмент для JS-разработчика. Хорошо, когда его использование начинается с самого начала проекта. Если же это не так, то будьте готовы к большому количеству ошибок и предупреждений, которые будут найдены в коде (конечно, это зависит от настройки самого ESLint). В большом проекте исправление их всех одним «махом» может занять слишком много времени, потому проще разбить этот процесс на несколько коммитов или просто «подчищать» файлы, которые затрагиваются работой над той или иной задачей. В любом случае, простой запуск eslint ... будет выводить все ошибки в коде проекта. Неплохо было бы запускать ESLint только для файлов, в которых есть изменения и которые еще не попали в коммит.

Если погуглить данный вопрос, то можно найти несколько вариантов вида «установите пакет N» или «добавьте модуль M». А можно обойтись «своими силами»? Конечно можно. Напишем несколько строк на bash, которые сделают за нас всю работу. Далее сразу идет готовое решение, а его разбор будет ниже.

1
2
3
4
prefix="$(echo $(pwd) | sed -e "s|"$(git rev-parse --show-toplevel)"||")/" \
  && prefix=${prefix:1} \
  && files=$(git diff --name-only | grep ".js$" | sed ':a;N;$!ba;s/\n/ /g' - | sed -e "s|"$prefix"||g") \
  && ([[ -z "$files" ]] && echo "No files to check" || ./node_modules/.bin/eslint $(echo "$files"))

Данный скрипт надо запускать из папки, где находится js-код вашего приложения (другими словами, на одном уровне с node_modules)

Что же тут происходит? Давайте разбираться.

В первую очередь, нам надо определить разницу между текущей директорией и корневой директорией репозитория. Это необходимо, так как проекты бывают разные и js-код может быть не в корне, а вложенным. Эта разница будет в переменной prefix. Ее значение получается путем замены в значении из pwd подстроки, полученной из git rev-parse --show-toplevel. Это происходит в первой строке скрипта. Во второй строке мы убираем ведущий / из prefix.

Рассмотрим на примере. Если наш проект находится в директории /home/git/some-name, а код, который надо проверить, находится в /home/git/some-name/ui/nested, то значением prefix будет ui/nested.

Теперь надо получить имена файлов, в которых есть изменения, и которые еще не попали в коммит. Для этого используется git diff --name-only. Так мы получим список имен файлов вида ui/nested/***. Через grep ".js$" отбираем только js-файлы. Далее список файлов надо преобразовать в параметры, которые будут переданы в ESLint. Для этого используем sed два раза — первый раз для того, чтоб преобразовать многострочный результат в одну строку, а второй раз — чтоб убрать значение prefix из имен файлов. Полученный результат записывается в переменную files. Это все происходит в третьей строке скрипта.

Осталось убедиться, что в files что-то есть. Ведь вполне может быть, что измененных файлов не было или что ни один из них не является js-файлом. В случае, если [[ -z "$files" ]] вернет true (это возможно, если в files ничего нет), то выполнится echo "No files to check" и выполнение скрипта будет завершено. Иначе, будет вызван ./node_modules/.bin/eslint, куда будет передан список файлов из files.

Вот и все. Таким образом ESLint проверит только требуемые файлы. Подобным образом можно проверить и ts-файлы с помощью TSLint. Достаточно в третьей строке немного поправить grep на grep ".ts$", а в самом конце вызвать tslint вместо eslint.

, ,

Оставить комментарий

Top ↑ | Main page | Back