setup pre-commit hook jshint

Jea*_*eri 35 git github pre-commit-hook jshint

我最近在github上开了一个项目.我使用Travis在每次提交后设法自动进行测试.但是现在我想用jshint设置一个pre-commit钩子.因此,如果jshint报告错误,则提交失败.但这是否可能,如果是这样,该怎么做?

Jam*_*ice 41

但这可能......

是! 这个有可能.我最近写过这篇文章.请注意,它并不特定于GitHub,一般只是Git - 因为它是一个预提交钩子,它任何数据发送到GitHub 之前运行.

存储库的/.git/hooks目录中任何适当命名的可执行文件都将作为挂钩运行.默认情况下,可能会有一堆示例挂钩.这是一个简单的shell脚本,我将其用作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
Run Code Online (Sandbox Code Playgroud)

您可以将它放在Git hooks目录中名为pre-commit的可执行文件中,它将在每次提交之前运行.

  • 对于那些想知道JSHint的最终版本是什么样的人:http://pastie.org/pastes/8392390/text (3认同)
  • 请注意,grep中存在错误.应该是`"\.js $"` (2认同)

nel*_*nic 41

在Node.js工作流中有一种更简单的方法来进行预提交检查(例如JSHint):

从NPM 安装jshint:

npm install jshint

接下来,如果您还没有.jshintrc文件,请在项目中创建.jshintrc文件.例如:https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

现在安装预提交模块(并将其保存为dev依赖项):

npm install pre-commit --save-dev

接下来,您需要定义将在package.json中为JSHint运行的任务(脚本)

例如:

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

然后你注册你想要在提交前运行的脚本(也在package.json中),例如:

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

这使您可以在预提交工作流程中进行多次检查.(我们有检查以确保团队成员代码符合JSHint,代码样式和测试覆盖率为100%)

有关更详细的教程,您可以与您的团队分享:https://github.com/nelsonic/learn-pre-commit


igo*_*gor 16

某些更改@詹姆斯阿勒代斯脚本来满足JSHint.感谢您的原始代码.

#!/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
Run Code Online (Sandbox Code Playgroud)