Как настроить запуск линтера перед коммитом?

Для настройки запуска линтера перед коммитом можно использовать Git hooks:
  1. Установить линтер (например, ESLint для JavaScript, Flake8 для Python).
  2. Инициализировать Git репозиторий.
  3. Создать файл .git/hooks/pre-commit (если его нет) и сделать его исполняемым (chmod +x .git/hooks/pre-commit).
  4. В файл .git/hooks/pre-commit добавить скрипт, который будет запускать линтер и проверять код. Если линтер возвращает ошибки, скрипт должен завершиться с ненулевым кодом (например, exit 1), чтобы предотвратить коммит. Пример:
    #!/bin/sh
    # Run linter
    npx eslint .
    
    # Check if there were any linting errors
    if [ $? -ne 0 ]; then
      echo "Linting failed.  Please fix the errors before committing."
      exit 1
    fi
    
    exit 0
    
  5. Для автоматизации и упрощения настройки можно использовать инструменты, такие как Husky и lint-staged. Они позволяют легко управлять Git hooks и запускать линтер только на измененных файлах.

Настройка запуска линтера перед коммитом в Git

Для автоматического запуска линтера перед каждым коммитом в Git можно использовать Git hooks, в частности, pre-commit hook. Этот хук срабатывает непосредственно перед созданием коммита. Если он завершается с ненулевым кодом возврата (ошибка), коммит будет отменен.

Основные шаги:

  1. Найдите директорию .git/hooks в вашем репозитории. Если ее нет, создайте её.
  2. Создайте файл с именем pre-commit (без расширения) в директории .git/hooks.
  3. Сделайте файл pre-commit исполняемым. В терминале выполните:
    chmod +x .git/hooks/pre-commit
  4. Редактируйте файл pre-commit и добавьте в него скрипт, который запускает ваш линтер. Пример:

Пример скрипта pre-commit (для ESLint с npm):

#!/bin/sh
# Скрипт для запуска ESLint перед коммитом

# Запускаем ESLint для всех измененных JavaScript файлов
echo "Running ESLint..."
git diff --cached --name-only --diff-filter=ACM | grep '\.js$' | xargs -n 1 eslint

# Проверяем код возврата ESLint
if [ $? -ne 0 ]; then
  echo "ESLint found errors.  Please fix them before committing."
  exit 1
fi

echo "ESLint passed successfully."
exit 0

Пояснения к примеру:

  • #!/bin/sh: Указывает интерпретатор скрипта (bash).
  • git diff --cached --name-only --diff-filter=ACM: Получает список измененных файлов, подготовленных к коммиту. --cached означает, что рассматриваются только проиндексированные (staged) изменения. --name-only выводит только имена файлов. --diff-filter=ACM фильтрует файлы по статусу (A - added, C - copied, M - modified).
  • grep '\.js$': Фильтрует список, оставляя только файлы с расширением .js.
  • xargs -n 1 eslint: Передает каждый файл из списка аргументом в команду eslint.
  • if [ $? -ne 0 ]; then ... fi: Проверяет код возврата последней команды (ESLint). Если код возврата не равен 0 (ошибка), выводится сообщение об ошибке и скрипт завершается с кодом 1, что отменяет коммит.

Важно:

  • Адаптируйте скрипт под ваш линтер и систему сборки. Например, если вы используете Prettier, измените команду eslint на команду prettier --write или аналогичную.
  • Убедитесь, что линтер установлен и доступен в вашем окружении. Проверьте, что команда линтера, указанная в скрипте, корректно выполняется из командной строки в контексте вашего проекта.
  • Рекомендуется использовать менеджера пакетов для установки линтера (npm, yarn, pip и т.д.). Это упрощает управление зависимостями и обеспечивает воспроизводимость сборки.
  • Для глобальной настройки hooks можно использовать шаблоны. Это позволяет автоматически создавать hooks в новых репозиториях.
  • Существуют инструменты для управления Git hooks, например, Husky и lint-staged. Они упрощают настройку и обеспечивают более гибкую конфигурацию. Рекомендуется изучить эти инструменты, особенно для крупных проектов.
  • Учитывайте производительность. Запуск линтера для каждого коммита может занять некоторое время. Оптимизируйте скрипт и настройки линтера, чтобы минимизировать задержку.
  • Предоставьте пользователю возможность пропустить проверку. Иногда может потребоваться сделать коммит, даже если линтер выдает ошибки (например, для срочного исправления бага). Можно добавить в скрипт опцию, позволяющую пропустить проверку линтером (например, с помощью переменной окружения или аргумента командной строки).

Пример использования Husky и lint-staged (рекомендуемый подход):

  1. Установите Husky и lint-staged:
    npm install husky lint-staged --save-dev
  2. Настройте Husky для автоматической установки Git hooks:
    npx husky install
  3. Добавьте скрипт подготовки husky в ваш package.json:
    {
      "scripts": {
        "prepare": "husky install"
      }
    }
  4. Настройте lint-staged в вашем package.json:
    {
      "lint-staged": {
        "*.js": "eslint --fix"  // Запускает ESLint и пытается автоматически исправить ошибки
      }
    }
  5. Создайте или обновите .husky/pre-commit:
    #!/bin/sh
    . "$(dirname "$0")/_/husky.sh"
    
    npx lint-staged
    

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

В заключение: Настройка запуска линтера перед коммитом помогает поддерживать консистентность и качество кода в репозитории. Выберите подходящий подход в зависимости от вашего проекта и потребностей.

0