2016-05-12 29 views
12

Ich möchte einen pre-commit Git-Hook installieren (der den Code einfängt), wenn jemand my-package installiert.Wie installiere ich git Hooks bei "npm install"?

Ich versuchte, ein postinstall Skript hinzuzufügen:

"scripts": { 
    "postinstall": "./scripts/install-git-hooks" 
} 

Dies funktioniert gut. Wenn jemand npm install ausführt, wird der Haken pre-commit installiert.

Wenn jedoch another-package auf my-package abhängt, npm install für another-package läuft, läuft das postinstall Skript als auch, was unerwünscht ist.

Was ist der sauberste Weg, um diesen unerwünschten Effekt zu vermeiden?

+0

Dies sieht aus wie ein XY-Problem. Sie fragen nach Y, aber um Antworten zu erhalten, die im größeren Bild nützlich sein werden, sollten Sie uns Informationen über X geben. Warum sollte Ihr Paket Git-Hooks überhaupt installieren? – Louis

+0

@Louis Ich möchte Benutzer erzwingen, ihren Code vor dem Festschreiben zu fusseln. Ich könnte Benutzer dazu bringen, "npm run install-git-hooks" auszuführen, nachdem sie "npm install" ausgeführt haben, aber ich möchte dies automatisieren. –

+0

Um fair zu sein die meisten Npm-Pakete, die einige Nachinstallationsroutine haben, müssen Sie auf Ihrem Projekt laufen, haben Sie es manuell tun. typings, jspm, Jasmin ... etc, usw. –

Antwort

5

Sie können das ghooks npm-Modul verwenden und es als Dev-Abhängigkeit hinzufügen. Sie können konfigurieren, was vor dem Festschreiben in Ihrem package.json wie folgt ausgeführt werden soll:

[...] 
"config": { 
    "ghooks": { 
     "pre-commit": "npm test" 
    } 
} 
[...] 
3

Hacky, aber könnte für Sie arbeiten.

Der Trick besteht darin, (innerhalb des Skripts) zu identifizieren, ob es sich um eine Unterabhängigkeit oder eine Stammabhängigkeit für die NPM-Installation handelt. Überprüfen Sie einfach, ob ../../package.json existiert. Wenn dies der Fall ist, handelt es sich um eine Subabhängigkeit, und Sie sollten die Installation der Hooks überspringen.

Es sollte beachtet werden, dass Sie alle konsistenten Installationsregeln brechen, was genau dem Geist der Installationsskripten widerspricht. Dies bedeutet, clientseitige Hooks zu installieren, die auf keinen Fall vertrauenswürdig sind. Wenn Sie das Linting erzwingen wollen, sollte dies serverseitig geschehen, wo es Code ablehnen kann, der nicht konform ist.

Möglicherweise wäre dieses Problem besser gelöst, als Sie es erwähnten, indem Sie es als ein benutzerdefiniertes Installationsskript verwenden und einfach mit dem zusätzlichen Kommunikationsaufwand umgehen.