首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >赫斯基钩子合并后检查package.json上是否有任何更改,如果检测到更改,则执行npm install

赫斯基钩子合并后检查package.json上是否有任何更改,如果检测到更改,则执行npm install
EN

Stack Overflow用户
提问于 2021-11-19 05:40:19
回答 1查看 319关注 0票数 0

我想让钩子做一些事情,比如在合并分支之后运行NPM install,但只有在修改package.json文件的情况下才会这样

代码语言:javascript
运行
复制
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

differenceCode=$git diff HEAD^ HEAD --exit-code -- ./package.json

echo "test - $?"

if [ "$?" != 0 ]; then 
npm install
fi

我可以从bash运行git diff HEAD^ HEAD --exit-code -- ./package.json,当package.json中有变化时,也可以用echo $?显示1,否则返回0。

但是,当我在合并后文件中包含该命令并触发合并后事件时,它显示:

代码语言:javascript
运行
复制
diff: unknown option -- exit-code
diff: Try 'diff --help' for more information.
husky - post-merge hook exited with code 2 (error)

任何人都可以帮助我做这个。

EN

回答 1

Stack Overflow用户

发布于 2021-11-19 06:12:54

你写道:

代码语言:javascript
运行
复制
differenceCode=$git diff HEAD^ HEAD --exit-code -- ./package.json

在你的脚本中。(为什么你要在git前面放一个美元符号$?)

这是您的问题的直接来源。$git是一个未设置的变量;在sh中,未设置的变量扩展为零;因此您正在运行以下命令:

代码语言:javascript
运行
复制
diff HEAD^ HEAD --exit-code -- ./package.json

而不是命令:

代码语言:javascript
运行
复制
git diff HEAD^ HEAD --exit-code -- ./package.json

如果您移除了杂散的$标志,那么这个问题就会消失。

您的后续操作:

代码语言:javascript
运行
复制
echo "test - $?"

将显示您运行的命令的退出代码(如果它被执行)。它没有被执行这一事实表明:

代码语言:javascript
运行
复制
. "$(dirname "$0")/_/husky.sh"

必须设置了-e选项(“出错时退出”)。如果它做到了这一点,你就不需要后续测试了。但是这里还有一个错误:

代码语言:javascript
运行
复制
echo "test - $?"

if [ "$?" != 0 ]; then 
npm install
fi

您需要删除echo命令,因为echo本身就是一个命令,因此,它会设置$?最后一个命令退出状态变量。因此,如果echo成功-它几乎总是成功的-它会将$?设置为零。

如果像看起来那样设置了-e,那么如果$?不是零,我们就不会得到这样的结果。由于设置了-e,因此不要让git diff命令导致脚本提前退出,这一点很重要。要解决此问题,请将整个序列替换为:

代码语言:javascript
运行
复制
if git diff HEAD^ HEAD --exit-code -- ./package.json; then
    # ... code to handle a zero exit code here
else
    # ... code to handle a nonzero exit here
fi

现在,即使使用-e set,该测试也可以工作。

您可以通过编写以下代码来简化这一过程,因为您在then部分中没有什么可做的:

代码语言:javascript
运行
复制
if ! git diff HEAD^ HEAD --exit-code -- ./package.json; then
    npm install
fi

一旦你这样做了,你可以通过编写以下代码来简化这一步:

代码语言:javascript
运行
复制
git diff HEAD^ HEAD --exit-code -- ./package.json || npm install

但主要要做的事情是:

$;

  • move
  1. git diff命令删除到if测试中。

这些都是必需的;其他的都是可选的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70030353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档