2016-05-12 14 views
12

Chciałbym zainstalować hak git pre-commit (który lity kod), gdy ktoś instaluje my-package.Jak zainstalować git hooks na "npm install"?

Próbowałem dodać postinstall skrypt:

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

to działa świetnie. Gdy ktoś uruchomi npm install, zostanie zainstalowany hak pre-commit.

Jednak jeśli another-package zależy my-package, bieganie npm install dla another-package uruchamia skrypt postinstall a także, co jest niepożądane.

Jaki jest najczystszy sposób na uniknięcie tego niepożądanego afektu?

+0

Wygląda to na problem XY. Pytasz o Y, ale aby uzyskać odpowiedzi, które będą przydatne w szerszym obrazie, powinieneś podać nam informacje na temat X. Dlaczego w pierwszej kolejności powinna być zainstalowana git hook? – Louis

+0

@Louis Chciałbym wymusić na użytkownikach kodowanie ich kodu przed zatwierdzeniem. Mogłem poprowadzić użytkowników do uruchomienia 'npm run install-git-hooks' po uruchomieniu' npm install', ale chciałbym to zautomatyzować. –

+0

Aby być uczciwym, większość pakietów npm, które mają jakąś procedurę poinstalacyjną, musisz uruchomić na swoim projekcie, musisz to zrobić ręcznie. typings, jspm, jaśmin ... itd. –

Odpowiedz

5

Możesz użyć modułu npm ghooks i dodać go jako zależność od dev. Można skonfigurować, co należy uruchomić przed zatwierdzeniem w pakiecie.json, tak:

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

Hacky, ale może pracować dla ciebie.

Sztuką jest zidentyfikowanie (w skrypcie), czy jest to zależność podrzędna lub zależność od root dla instalacji NPM. Po prostu sprawdź, czy istnieje ../../package.json. Jeśli tak, to jest zależność i powinieneś pominąć instalowanie haków.

Należy zauważyć, że łamie się wszelkie spójne reguły instalacji, co jest dokładnie sprzeczne z duchem skryptów instalacyjnych. Ma to na celu zainstalowanie haków po stronie klienta, którym nie można zaufać w żaden sposób, jeśli konieczne jest wymuszenie lintingu, należy to zrobić po stronie serwera, gdzie może po prostu odrzucić kod, który nie jest zgodny.

Potencjalnie problem ten byłby lepiej rozwiązany, jak wspomniałeś, poprzez użycie go jako niestandardowego skryptu instalacyjnego i zajmowanie się tylko dodatkowym obciążeniem komunikacyjnym.