设置预提交钩子jshint



我最近在github上开始了一个项目。我已经成功地在每次提交后使用Travis设置了自动测试。但是现在我想用jshint设置一个预提交钩子。因此,如果jshint报告错误,则提交应该失败。但是,这是可能的吗?如果是,如何做到这一点呢?

有一个更简单的方法在你的Node.js工作流中做预提交检查(例如JSHint):

安装jshint:

npm install jshint

下一步创建。如果您还没有jshintrc文件,请在您的项目中添加。例如:https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

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

npm install pre-commit --save-dev

接下来,您需要在package.json

中定义将为JSHint运行的任务(脚本)。

e。g:

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

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

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

这允许你在你的预提交工作流中有不止一个检查。(我们有检查确保团队成员的代码符合JSHint,代码风格和测试覆盖率是100%)

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

但这是可能的吗?

是的!这是可能的。我最近写了一篇文章。注意,它不是GitHub所特有的,只是Git的通用钩子——因为它是一个预提交钩子,它在任何数据发送到GitHub之前运行

/目录中任何适当命名的可执行文件。Git/hooks目录将作为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 "t33[32mJSLint Passed: ${file}33[0m"
    else
        echo "t33[31mJSLint Failed: ${file}33[0m"
        pass=false
    fi
done
echo "nJavaScript validation completen"
if ! $pass; then
    echo "33[41mCOMMIT FAILED:33[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 "33[42mCOMMIT SUCCEEDED33[0mn"
fi

你可以简单地把它放在一个名为pre-commit的可执行文件中,它会在每次提交之前运行。

对@James Allardice脚本进行了一些更改以适应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

与@igor的脚本相似,但有一些改进:

  • 颜色指示
  • 帮助信息(git风格)避免预提交调用

#!/bin/sh
#
# Run JSHint validation before commit.
RED='33[0;31m'
REDBOLD='33[1;31m'
ORANGE='33[0;33m'
NC='33[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

最新更新