Git Hooks mit Husky

26.4.2020

Was sind git hooks

Mit Git Hooks hat man die Möglichkeit vor und nach bestimmten Schritten im Git Prozess einzugreifen und zusätzliche Skripte auszuführen, Dateien anzupassen und Commits abzubrechen. Bei Interesse kann man hier noch mehr über Git Hooks erfahren.

Wieso braucht man ein weiteres Tool

Das Problem mit Git Hooks ist, dass diese nicht in einem Projekt abgelegt und in anderen Umgebungen wiederverwendet werden. Aus diesem Grund wird ein Tool benötigt, welches genau das machen kann. Das ist zum Beispiel dann nützlich, wenn man sich auf bestimmte Konventionen geeinigt hat und sicherstellen möchte, dass diese auch eingehalten werden.

Was kann Husky

Mit Husky kann man sehr bequem Git Hooks versionieren. Dazu legt man im einfachsten Fall in der package.json des Projekts einen neuen Bereich an und gibt dort die gewünschten Hooks und Skripte an.

Husky unterstützt alle git-scm Dokumentierten Hooks.

Beispiel anhand von Conventional Commit Message

Um das Ganze plastischer zu gestalten wird im Folgendem gezeigt, wie man die Einhaltung von Conventional Commits mit Husky einfordern kann.

Installation

Neben Husky wird CommitLint zum Überprüfen der Commit Message verwendet. Als Erstes werden diese beiden Tools im Projekt installiert.

npm i --save-dev @commitlint/cli @commitlint/config-conventional husky 

Konfiguration

Man könnte einen husky Bereich in der package.json einführen. Meine Empfehlung ist es aber, eine .huskyrc.json Datei im Wurzelverzeichnis anzulegen und dort die Konfiguration einzufügen. Dadurch wird die package.json nicht unnötig aufgebläht und man weiß sofort, dass und wo Husky konfiguriert ist. Die Konfiguration sieht wie folgt aus:

{
  "hooks": {
    "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
  }
}

Damit wird ausgedrückt, dass bei der Git Hook commit-msg der Befehl commitlint -E HUSKY_GIT_PARAMS ausgeführt wird. Damit commitlint auch Conventional Commits überprüft muss noch eine Datei commitlint.config.js ebenfalls im Wurzelverzeichnis mit folgendem Inhalt angelegt werden:

module.exports = {
  extends: ['@commitlint/config-conventional']
};

Hier wird lediglich definiert, dass das Modul @commitlint/config-conventional verwendet werden soll. Bei Bedarf könnte man in dieser Datei auch einzelne Regeln ein- oder ausschalten.

Damit ist die Konfiguration erledigt.

Verwendung

Wird das Projekt nun ausgecheckt und npm install ausgeführt, so wird die Hook von Husky installiert. Beim nächsten Commit, welcher nicht Conventional Commit entspricht, wird der Commit abgebrochen und eine Fehlermeldung (auf Englisch) ausgegeben.

Bei Anpassungen der Husky Git Hooks muss npm rebuild ausgeführt werden, um diese neu zu installieren.

Fazit

Git Hooks sind fantastisch wenn man alleine arbeitet. Sobald mehrere Personen an einem Projekt arbeiten und die Hooks weiterhin gelten sollen, sollte man Husky einsetzen.

Ein weiterer großer Vorteil ist es, dass man keine Shell Skripte für Hooks schreibt, sondern die Technologien verwendet, mit denen man als Webentwickler bereits näher an der Husky Konfigurationsweise ist.

Alles in Allem ist Husky eine wunderbare Ergänzung für einen modernen Entwicklungsprozess.

dog

woof!

Tags