Як використовувати перехоплювачі Git для виявлення змін у файлі блокування та показу повідомлення
Коли ми працюємо над спільною командою, час від часу розробнику доводиться додавати новий пакет до гілки, який потім об’єднується з основним. Хтось може не знати про це та просто витягнути майстер і запустити програму лише для того, щоб вона вийшла з ладу через відсутність пакета. Давайте подивимося, як ми можемо використовувати перехоплювачі Git для виявлення змін у a package.json
або a yarn.lock
та відображення повідомлення, яке пропонує користувачеві встановити відсутні залежності.
Що таке хуки Git?
Перехоплювачі Git запускаються, коли відбувається якась подія Git, наприклад новий комміт, надсилання комітів до онлайн-гілки, витягування комітів, перевірка гілки або об’єднання гілки. Ці процеси закінчуються 0, якщо вони завершуються правильно, або іншим значенням, якщо вони завершуються неправильно.
Якщо підключений процес закінчується 0, дія Git продовжується. Інакше дію Git блокується. Наприклад, якщо ви налаштуєте перехоплювач Git перед фіксацією для лінтування вашого коду, Git запустить це, коли ви зробите git commit
. Якщо lint виходить з ладу, фіксація не пройде.
Хуки Git — це те, що інтегровано в Git, і список хуків дуже великий. Наприклад, у вас є pre-push, post-commit, post-checkout, post-merge та багато інших гіків Git.
Запускайте хуки Git за допомогою Husky
Щоб запустити деякі завдання, коли запускаються хуки Git, ми можемо використовувати пакет Husky для Node.js. Husky дозволяє нам вказати у package.json
файлі, які сценарії запускати, коли запускаються перехоплення Git. Встановіть пакет Husky за допомогою NPM:
npm i -D husky
або пряжа:
yarn add -D husky
Тепер вам потрібно ініціалізувати Husky для перехоплювачів Git. Якщо ви використовуєте NPM:
npx husky install
і якщо ви використовуєте Yarn
yarn husky install
і все, тепер ви встановили та налаштували Husky для запуску перехоплювачів Git. Нарешті настав час визначити гачок!
Додайте сповіщення Git для перевірки змін у файлі блокування
Ми хочемо запустити якийсь код, щоб сповістити нас, якщо файли package-lock.json
або yarn.lock
змінилися. Зазвичай це трапляється, коли ми витягуємо master
і ці файли змінюються. Ми можемо налаштувати хук для запуску, коли ми об’єднуємо гілку.
Щоб визначити наші хуки Git для Husky, ми визначаємо їх у package.json
файлі. Додайте це як ключ верхнього рівня:
"husky": {
"hooks": {
"post-merge": "./githooks/post-merge-hook.sh"
}
}
Це говорить про те, що після об’єднання гілки ми запустимо цей сценарій. Тепер ми маємо його створити. Створіть папку, додайте до неї файл і налаштуйте його як виконуваний:
mkdir githooks && cd githooks && touch post-merge-hook.sh && chmod +x post-merge-hook.sh
Якщо ви не налаштуєте його як виконуваний, ви зіткнетеся з помилкою «У дозволі відмовлено», коли Husky спробує запустити цей підхоплювач Git. Тепер відредагуйте файл за допомогою Vim або вашого улюбленого редактора та вставте в нього це:
changedFiles="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"
runOnChange() {
echo "$changedFiles" | grep -q "$1" && echo -e "$2"
}
runOnChange package-lock.json "033[35m*******************************************************************************n* 033[33mpackage-lock.json033[35m has changed. Run033[33m npm install033[35m to update your dependencies. *n*******************************************************************************"
exit 0
Повідомлення буде надруковано фіолетовим кольором зі словами package-lock.json
та npm install
помаранчевим. Цей сценарій перевіряє, чи package-lock.json
було оновлено, і якщо ви хочете перевірити yarn.lock
замість цього, вам доведеться просто замінити назву файлу.
Перевірте перевірку зміни файлу блокування
Перевірити це не надто складно. По суті, вам просто потрібно створити нову гілку, встановити якийсь пакет, щоб package-lock.json
змінити його, зафіксувати його та перейти до попередньої гілки. Все, що можна зробити за допомогою цієї команди:
git checkout -b testbranch && npm i -D lint-staged && git add. && git commit -m "test" && git checkout -
Тепер вам потрібно об’єднати його з цією гілкою
git merge testbranch
Це запустить хук після злиття та запустить наш сценарій. Тоді ви побачите це повідомлення в командному рядку, оскільки package-lock.json
під час злиття було змінено:
Виявлення зміни файлу блокування у VS Code
Це було лише одне використання. Хуки Git можна використовувати багатьма способами, наприклад, щоб запустити популярний пакет Prettier перед тим, як щось зафіксувати для форматування коду.
Для цього конкретного випадку є альтернативи перевірити, чи package-lock.json
було оновлено. Наприклад, для VS Code є чудовий пакет Refresh NPM Packages, який запропонує вам оновити пакети, якщо виявить модифікацію. Він працюватиме незалежно від того, налаштували ви перехоплення Git чи ні. Ще одна приємна річ – це працюватиме, коли ви змінюєте гілки, навіть без злиття однієї з них в іншу.
Однак перевага того, що ми тут реалізували, полягає в тому, що воно запускатиметься в командному рядку і не залежить від конкретного редактора коду. Наприклад, якщо ви працюєте над проектом з відкритим вихідним кодом, ви можете налаштувати те, що тут описано, щоб мати спільну основу для всіх залучених розробників, незалежно від їхніх налаштувань.