eslint在git上预调试

eslint pre-commiot on git

本文关键字:调试 git eslint      更新时间:2023-10-06

如何在添加阶段的文件上运行预提交脚本esint?

我在hooks文件夹中有.eslintrc文件。

我还有脚本:

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
function lintit () {
  a=("${(f)$(git diff --name-only | grep -E '(.js)$')}")
  e=$(eslint -c eslint.json $a)
  echo $e
  if [[ "$e" != *"0 problems"* ]]; then
    echo "ERROR: Check eslint hints."
    exit 1 # reject
  fi
}
lintit

但它并没有完成我在.eslinc文件中的eslint。

谢谢!

我看到您的脚本有两个(可能的)问题:

  • 文件可能没有设置可执行标志
  • 您的子shell表达式错误

除非在unixoid系统上有适当的可执行标志,否则Git不会执行。

$ chmod ug+x .git/hooks/pre-commit

如果您还没有看到任何错误消息,则可能是由于此原因。

但是,这是不正确的,这是一个语法错误:

a=("${(f)$(git diff --name-only | grep -E '(.js)$')}")
e=$(eslint -c eslint.json $a)

更好:

a="$( git diff --name-only | grep -E '(.js)$' )"
e=$( eslint -c eslint.json $a )

进一步改进

简化结果检查

如果发现错误,esint将以负(非零)退出代码退出。

eslint ${ESLINT_CONF} $( ... )
if [ $? -ne 0 ]; then
    echo "eslint is unhappy."
    exit 1
fi

如果不需要echo,那么在最后一行有eslint语句就足够了,因此shell将使用该命令的退出代码退出。

但是,使用退出代码的缺点是,由于esint确实在警告时使用正代码(零)退出,因此您将无法检测到警告。在这种情况下,您仍然需要匹配警告。

不仅检查已修改的文件

您的git diff表达式找不到新文件。您可能需要使用git status

git status --porcelain | awk '{print $2}'  | grep -E '(.js)$'

最终脚本

#!/bin/sh
ESLINT_CONF=".eslintrc.json"
eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print $2}' | grep -E '(.js)$' ) >/dev/null
if [ $? -ne 0 ]; then
    echo "ERROR: Check eslint hints."
    exit 1
fi
exit 0

或者,简化。。。

#!/bin/sh
ESLINT_CONF=".eslintrc.json"
eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print $2}' | grep -E '(.js)$' ) >/dev/null

或者,通过检查警告。。。

#!/bin/sh
ESLINT_CONF=".eslintrc.json"
RES="( eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print $2}' | grep -E '(.js)$' ) )"
if [ $? -ne 0 ] || [[ "${RES}" != *"0 warning"* ]]; then
    echo "ERROR: Check eslint hints."
    exit 1
fi

删除>/dev/null(脚本1和2)或echo "${RES}"(脚本3)以显示esint的输出。