web-dev-qa-db-ja.com

セットアップのプリコミットフックjshint

私は最近 github上のプロジェクト を開始しました。 Travisを使用してコミットするたびに自動テストをセットアップできました。しかし、今私はjshintでもpre-commitフックをセットアップしたいと思います。したがって、jshintがエラーを報告した場合、コミットは失敗するはずです。しかし、これは可能ですか?可能であれば、これを行う方法は?

35

しかし、これは可能ですか...

はい!これは可能です。私 最近それについて書いた 。これはGitHubに固有のものではなく、一般にGitのみであることに注意してください。これはプリコミットフックであるため、データがGitHubに送信される前にbefore実行されます。

リポジトリの/。git/hooksディレクトリにある適切な名前の実行可能ファイルは、フックとして実行されます。デフォルトでは、多くのサンプルフックがすでにそこにあるでしょう。 これは単純なシェルスクリプトです JSLintのプリコミットフックとして使用します(代わりにJSHintを使用するように非常に簡単に変更できます):

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

これをGitフックディレクトリのpre-commitという名前の実行可能ファイルに置くだけで、すべてのコミットの前に実行されます。

41
James Allardice

Node.jsワークフローにコミット前のチェック(JSHintなど)を行う簡単な方法があります:

インストール jshint NPMから:

npm install jshint

次に、プロジェクト内に。jshintrcファイルをまだ作成していない場合は作成します。例: https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

pre-commit moduleをインストールします(そして、dev依存関係として保存します):

npm install pre-commit --save-dev

次に、JSHintに対して実行されるタスク(スクリプト)をpackage.jsonに定義する必要があります

例えば:

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

次に、実行前に実行するスクリプトを登録します(これもpackage.jsonにあります)。

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

これにより、コミット前のワークフローで複数のチェックを行うことができます。 (チームメンバーのコードがJSHint、コードスタイル、およびテストカバレッジが100%に準拠していることを確認するためのチェックがあります)

チームと共有できる詳細なチュートリアルについては、以下を参照してください。 https://github.com/nelsonic/learn-pre-commit

42
nelsonic

JSHint に対応するための@James Allardiceスクリプトのいくつかの変更。元のコードをありがとう。

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

@igorに似たスクリプトで、いくつかの改善点があります。

  • カラーインジケーター
  • --diff-filterなし、grepを内部で使用
  • コミット前の呼び出しを回避するためのヘルプメッセージ(gitスタイル)

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