web-dev-qa-db-fra.com

configuration du crochet de pré-validation jshint

J'ai récemment commencé un projet sur github . J'ai réussi à configurer des tests automatiques après chaque validation à l'aide de Travis. Mais maintenant, je voudrais également configurer un hook de pré-validation avec jshint. Donc, si jshint signale des erreurs, la validation devrait échouer. Mais est-ce possible, et si oui, comment faire?

35
Jeanluca Scaljeri

Mais est-ce possible ...

Oui! C'est possible. I a récemment écrit à ce sujet . Notez qu'il n'est pas spécifique à GitHub, juste Git en général - car c'est un hook de pré-validation, il s'exécute avant toutes les données sont envoyées à GitHub.

Tous les fichiers exécutables nommés de manière appropriée dans le répertoire /. Git/hooks de votre référentiel seront exécutés en tant que hooks. Il y aura probablement déjà un tas d'exemples de crochets par défaut. Voici un simple script Shell que j'utilise comme hook de pré-validation JSLint (vous pouvez le modifier très facilement pour travailler avec JSHint à la place):

#!/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

Vous pouvez simplement le mettre dans un fichier exécutable nommé pré-commit dans votre répertoire Git hooks, et il s'exécutera avant chaque commit.

41
James Allardice

Il y a moyen plus facile de faire des vérifications de pré-validation (par exemple JSHint) dans votre flux de travail Node.js:

Installer jshint à partir de NPM:

npm install jshint

Créez ensuite un fichier . Jshintrc dans votre projet si vous n'en avez pas déjà un. par exemple: https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

Maintenant, installez le module pré-commit (et enregistrez-le en tant que dépendance de développement):

npm install pre-commit --save-dev

Ensuite, vous devrez définir la tâche (script) qui sera exécutée pour JSHint dans votre package.json

par exemple:

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

puis vous enregistrez les scripts que vous souhaitez exécuter avant la validation (également dans package.json), par exemple:

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

Cela vous permet d'avoir plus d'un contrôle dans votre flux de travail de pré-validation. (Nous vérifions que le code des membres de l'équipe est conforme à JSHint, le style de code et la couverture de test est de 100%)

Pour un tutoriel plus détaillé que vous pouvez partager avec votre équipe, consultez: https://github.com/nelsonic/learn-pre-commit

42
nelsonic

Quelques modifications au script @James Allardice pour tenir compte de JSHint . Merci pour le code original.

#!/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
16
igor