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
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.
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
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
Hallo. Wissen Sie, wie Sie den Ordner einrichten Ich Wana scannen? – AlexeiBerkov
@AlexeiBerkov fragen Sie über welchen Ordner Sie will 'jshint' scannen? siehe: http://jshint.com/docs/cli/ – nelsonic
@nelsonic Ist Pre-Commit-Hook nur mit einem Satz von Regeln von JShint funktioniert? Kann ich einen anderen Linter verwenden? – RicardoGonzales
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
Sieht gut aus! :) Das ist aber nur * nix. – igor
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 ? –
nur eine andere Sache. Wenn ich/bin/sh entferne, funktioniert der Hook von der Kommandozeile. Aber ich kann noch committen :( –
@JeanlucaScaljeri - Haben Sie es für JSHint geändert? In seinem aktuellen Zustand sind die Strings, nach denen es sucht, spezifisch für JSLint. –