Hur man använder Git hooks för att upptäcka ändringar i en låsfil och visa ett meddelande
När vi arbetar i ett samarbetsteam måste en utvecklare då och då lägga till ett nytt paket till en filial som sedan slås samman till master. Någon kanske är omedveten om det och bara dra master och kör appen bara för att få den att krascha på grund av det saknade paketet. Låt oss se hur vi kan använda Git hooks för att upptäcka ändringar av a package.json
eller a yarn.lock
och visa ett meddelande som uppmanar användaren att installera de saknade beroenden.
Vad är Git hooks?
Git-hooks avfyras när någon Git-händelse inträffar såsom en ny commit, pushing commits till en online-gren, pull commits, checkout en branch eller merge en branch. Dessa processer slutar med 0 när de slutar korrekt eller något annat värde när de slutar felaktigt.
Om den kopplade processen slutar med 0, fortsätter Git-åtgärden. Annars blockeras Git-åtgärden. Till exempel, om du konfigurerar en pre-commit Git-hook för att linta din kod, kommer Git att köra detta när du gör en git commit
. Om linten misslyckas, kommer commit inte att gå igenom.
Git hooks är något integrerat i Git och listan över krokar är mycket omfattande. Till exempel har du pre-push, post-commit, post-checkout, post-merge och många andra Git-hooks.
Kör Git hooks med Husky
För att köra vissa uppgifter när Git-hakarna avfyras kan vi använda Husky- paketet för Node.js. Husky tillåter oss att specificera i en package.json
fil vilka skript som ska köras när en Git hooks avfyras. Installera Husky-paketet med NPM:
npm i -D husky
eller garn:
yarn add -D husky
Nu måste du initiera Husky för Git hooks. Om du använder NPM:
npx husky install
och om du använder Garn
yarn husky install
och det är det, du har nu installerat och konfigurerat Husky för att köra Git hooks. Det är äntligen dags att definiera en krok!
Lägg till en Git-hook för post sammanfogning för att kontrollera ändringar av låsfilen
Vi vill köra lite kod för att varna oss om filen package-lock.json
eller yarn.lock
har ändrats. Detta händer vanligtvis när vi drar master
och dessa filer har ändrats. Vi kan ställa in en krok som ska köras när vi slår ihop en gren.
För att specificera våra Git hooks till Husky definierar vi dem i package.json
filen. Lägg till detta som en nyckel på toppnivå:
"husky": {
"hooks": {
"post-merge": "./githooks/post-merge-hook.sh"
}
}
Vad det här säger är att efter att en gren har slagits samman kör vi det här skriptet. Nu måste vi skapa det. Skapa en mapp, lägg till en fil i den och ställ in den så att den är körbar:
mkdir githooks && cd githooks && touch post-merge-hook.sh && chmod +x post-merge-hook.sh
Om du inte ställer in den på att vara körbar kommer du att stöta på felet "Permission denied" när Husky försöker köra denna Git-hook. Redigera nu filen med Vim eller din favoritredigerare och klistra in detta i den:
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
Detta kommer att skriva ut ett meddelande i lila med orden package-lock.json
och npm install
i orange. Detta skript kontrollerar om package-lock.json
det har uppdaterats och om du vill testa yarn.lock
istället måste du helt enkelt byta ut filnamnet.
Testa låsfiländringskontrollen
Att testa detta är inte alltför komplicerat. Du behöver i princip bara skapa en ny gren, installera något paket så att det package-lock.json
ändras, commit det och byta till den tidigare grenen. Allt som kan göras med detta kommando:
git checkout -b testbranch && npm i -D lint-staged && git add. && git commit -m "test" && git checkout -
Nu måste du slå ihop den med den här grenen
git merge testbranch
Detta kommer att utlösa post-merge-kroken och kommer att köra vårt skript. Du kommer då att se detta meddelande på kommandoraden eftersom det package-lock.json
har ändrats under sammanslagningen:
Upptäcker en låsfiländring i VS-kod
Detta var bara en användning. Git hooks kan användas på många sätt, till exempel för att köra det populära paketet Prettier innan du begår något för att formatera din kod.
Det finns alternativ för just det här fallet, att kontrollera om package-lock.json
den har uppdaterats. Till exempel för VS Code finns det ett snyggt paket Uppdatera NPM-paket som kommer att uppmana dig att uppdatera dina paket om det upptäcker en ändring. Det kommer att köras oavsett om du har ställt in Git-hooks eller inte. En annan trevlig sak är att det kommer att fungera när du byter gren, även utan att slå ihop en av dem i den andra.
Men fördelen med det vi har implementerat här är att det kommer att köras på kommandoraden och det beror inte på en viss kodredigerare. Om du till exempel arbetar med ett projekt med öppen källkod, kanske du vill ställa in det som beskrivs här så att det finns en gemensam grund för alla inblandade utvecklare oavsett deras inställning.