Операции Перед Коммитом с Husky.NET. Продолжение
Начало
Управляем командой dotnet format с помощью Husky.NET
В приведённом выше примере есть проблема. Т.к. dotnet format изменяет исходные файлы, и учитывая, что моментальный снимок кода уже был создан до выполнения хука, все изменённые файлы не будут частью окончательного коммита! Также
dotnet format выполняет проверку каждого файла в решении, а не только тех, которые являются частью текущего снимка. Так операция может занять много времени. Есть 3 подхода к решению этой проблемы.1. Выполнить git add
Выполнение
git add . после dotnet format сделает все изменения частью коммита, но:-
dotnet format всё ещё будет затрагивать все файлы;-
git add . добавит все изменённые файлы в коммит, а не только те, которые вы хотели добавить (возможно потому что другие изменения должны были быть включены в другой коммит).2. Пробный прогон dotnet format
Флаг
--verify-no-changes команды dotnet format приведёт к возвращению ошибки, если хотя бы один файл необходимо обновить из-за правил форматирования.Таким образом, если есть что форматировать, весь коммит будет отменён. Затем вам придётся запустить
dotnet format для всего решения, исправить ошибки, добавить изменения в git и попробовать сделать коммит ещё раз. Это более длительный процесс, но он позволяет вам иметь полный контроль над отформатированными файлами.Кроме того, вы не рискуете включить в снимок файлы, которые хотите сохранить в промежуточном состоянии, чтобы добавить их в последующий коммит.
3. dotnet format только для файлов коммита с помощью Husky.NET Task Runner
В папке .husky есть файл task-runner.json. Он позволяет создавать собственные сценарии с именем, группой, выполняемой командой и соответствующими параметрами. Изменим его так, чтобы
dotnet format затрагивал только файлы, предназначенные для коммита:{
"tasks": [
{
"name": "dotnet-format-staged-files",
"group": "pre-commit-operations",
"command": "dotnet",
"args": ["format", "--include", "${staged}"],
"include": ["**/*.cs"]
}
]
}Здесь мы указали имя задачи (
dotnet-format-staged-files), команду для запуска (dotnet с параметрами args) и фильтр списка файлов, подлежащих форматированию, используя параметр ${staged}, который заполняется Husky.NET. Мы также добавили задачу в группу pre-commit-operations, которую мы можем использовать для задач, выполняющихся вместе. Так можно запустить отдельную задачу:dotnet husky run --name dotnet-format-staged-files
или группу задач:
dotnet husky run --group pre-commit-operations
Теперь заменим команду
dotnet format в файле pre-commit на одну из приведённых выше, а также добавим флаги --no-restore для сборки и теста, чтобы ускорить их выполнение:#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
echo 'Format'
dotnet husky run --name dotnet-format-staged-files
echo 'Build'
dotnet build --no-restore
echo 'Test'
dotnet test --no-restore
echo 'Completed pre-commit changes'
Да, сборку можно не делать отдельно, т.к. она запускается перед тестами.
И последнее. Если вы захотите сделать коммит без выполнения хука, используйте флаг
--no-verify:git commit -m "my message" --no-verify
Источник: https://www.code4it.dev/blog/husky-dotnet-precommit-hooks/