2013-03-29 11 views
34

Ich habe vor kurzem eine project on github gestartet. Ich habe es geschafft, nach jedem Commit mit Travis einen automatischen Test einzurichten. Aber jetzt möchte ich auch einen Vorab-Hook mit jshint einrichten. Wenn also jshint Fehler meldet, sollte das Commit fehlschlagen. Aber ist das möglich, und wenn ja, wie?Setup vor dem Haken Hook jshint

Antwort

38

Aber ist das möglich ...

Ja! Das ist möglich. I recently wrote about it. Beachten Sie, dass es nicht spezifisch für GitHub, sondern nur für Git ist - da es sich um einen Pre-Commit-Hook handelt, wird ausgeführt, bevor alle Daten an GitHub gesendet werden.

Alle entsprechend benannten ausführbaren Dateien im Verzeichnis /.git/hooks Ihres Repositorys werden als Hooks ausgeführt. Dort wird es wahrscheinlich bereits eine Reihe von Beispiel-Hooks geben. Here's a simple shell script, die ich als JSLint verwenden pre-commit Haken (man könnte es ändern sehr leicht mit JSHint anstatt zu arbeiten):

#!/bin/sh 

files=$(git diff --cached --name-only --diff-filter=ACM | grep "\.js$") 
if [ "$files" = "" ]; then 
    exit 0 
fi 

pass=true 

echo "\nValidating JavaScript:\n" 

for file in ${files}; do 
    result=$(jslint ${file} | grep "${file} is OK") 
    if [ "$result" != "" ]; then 
     echo "\t\033[32mJSLint Passed: ${file}\033[0m" 
    else 
     echo "\t\033[31mJSLint Failed: ${file}\033[0m" 
     pass=false 
    fi 
done 

echo "\nJavaScript validation complete\n" 

if ! $pass; then 
    echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again.\n" 
    exit 1 
else 
    echo "\033[42mCOMMIT SUCCEEDED\033[0m\n" 
fi 

Sie einfach, dass in einer ausführbaren Datei pre-commit Namen setzen können in Ihrem Git Hooks Verzeichnis, und es wird vor jedem Commit ausgeführt.

+0

thnx viel !! Ich muss jedoch etwas falsch machen, weil ich es nicht zur Arbeit bringen kann. Ich habe die Datei innerhalb .git/hooks erstellt und es ausführbar gemacht. Jetzt, wenn ich eine Datei mit "zu vielen Fehlern" festlege, begehe ich sie einfach. Außerdem, wenn ich den Haken manuell starte, werde ich im/bin/sh gefangen. Wenn ich nun "exit" tippe, bekomme ich die Meldung "COMMIT FAILED". Irgendwelche Vorschläge ? –

+0

nur eine andere Sache. Wenn ich/bin/sh entferne, funktioniert der Hook von der Kommandozeile. Aber ich kann noch committen :( –

+0

@JeanlucaScaljeri - Haben Sie es für JSHint geändert? In seinem aktuellen Zustand sind die Strings, nach denen es sucht, spezifisch für JSLint. –

15

Einige Änderungen an @James Allardice Skript, um JSHint unterzubringen. Danke für den ursprünglichen Code.

#!/bin/sh 
# 
# Run JSHint validation before commit. 

files=$(git diff --cached --name-only --diff-filter=ACMR -- *.js **/*.js) 
pass=true 


if [ "$files" != "" ]; then 
    for file in ${files}; do 
     result=$(jshint ${file}) 

     if [ "$result" != "" ]; then 
      echo "$result" 
      echo "\n" 
      pass=false 
     fi 
    done 
fi 


if $pass; then 
    exit 0 
else 
    echo "" 
    echo "COMMIT FAILED:" 
    echo "Some JavaScript files are invalid. Please fix errors and try committing again." 
    exit 1 
fi 
37

Es gibt eine einfache Weise tun pre-commit Kontrollen (zB JSHint) in Ihrem Node.js Workflow:

installieren jshint von NPM:

npm install jshint

Als nächstes erstellen Sie eine .jshintrc Datei in Ihrem Projekt, wenn Sie noch keine haben. zB: https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

Jetzt pre-commit Modul installieren (und als Entwickler Abhängigkeit speichern):

npm install pre-commit --save-dev

Als nächstes müssen Sie die Aufgabe (Skript) definieren, die für JSHint werden laufen in Ihrem package.json

zB:

{ "scripts": { "jshint": "jshint -c .jshintrc --exclude-path .gitignore ." } }

dann registrieren Sie die Skripte, die Sie (auch in package.json) zB pre-commit ausgeführt werden soll:

"pre-commit": [ "jshint", "coverage", "etc" ]

diese Weise können Sie mehr als nur einen Scheck in Ihrem pre-commit Arbeitsablauf. (Wir haben überprüft Teammitglieder Code, um sicherzustellen, entspricht JSHint, Code-Stil und Testabdeckung ist 100%)

Für eine detaillierte Anleitung Sie mit Ihrem Team sehen teilen können: https://github.com/nelsonic/learn-pre-commit

+0

Hallo. Wissen Sie, wie Sie den Ordner einrichten Ich Wana scannen? – AlexeiBerkov

+0

@AlexeiBerkov fragen Sie über welchen Ordner Sie will 'jshint' scannen? siehe: http://jshint.com/docs/cli/ – nelsonic

+0

@nelsonic Ist Pre-Commit-Hook nur mit einem Satz von Regeln von JShint funktioniert? Kann ich einen anderen Linter verwenden? – RicardoGonzales

2

Ein ähnliches Skript der @ Igors ein mit einigen Verbesserungen:

  • Farbindikatoren
  • keine --diff-Filter, grep insead
  • Hilfemeldung (git-Stil) verwendete Anruf pre-commit zu vermeiden

#!/bin/sh 
# 
# Run JSHint validation before commit. 

RED='\033[0;31m' 
REDBOLD='\033[1;31m' 
ORANGE='\033[0;33m' 
NC='\033[0m' # No Color 

files=$(git diff --cached --name-only | grep .js) 
pass=true 
totalErrors=0 

if [ "$files" != "" ]; then 
    for file in ${files}; do 
     result=$(jshint ${file}) 
     if [ "$result" != "" ]; then 
      echo "${RED}$result${NC}" 
      pass=false 
      totalErrors=$((totalErrors+1)) 
     fi 
     echo "" 
    done 
fi 

if $pass; then 
    exit 0 
else 
    echo "${ORANGE}===== ${totalErrors} JSHint Error${NC}" 
    echo "" 
    echo "${REDBOLD}COMMIT FAILED: Some JavaScript files are invalid. Please fix errors and try committing again.${NC}" 
    echo "" 
    echo " (use -n option \"git commit -n -m <message>\" to avoid call pre-commit hook and JSHint check)" 
    echo "" 
    exit 1 
fi 
+0

Sieht gut aus! :) Das ist aber nur * nix. – igor