如何使外壳不可知论成为赫斯基钩?
Posted
技术标签:
【中文标题】如何使外壳不可知论成为赫斯基钩?【英文标题】:How to make shell agnostic a Husky hook? 【发布时间】:2021-07-15 19:01:06 【问题描述】:这是预提交钩子
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
lerna run --concurrency 1 --stream precommit --since HEAD --exclude-dependents
失败是因为
.husky/pre-commit: 4: lerna: not found
husky - pre-commit hook exited with code 127 (error)
但是如果我把它改成 ZSH 就可以了(总是调用 husky.sh 脚本)
#!/bin/zsh
编辑:添加 husky.sh 脚本
#!/bin/sh
if [ -z "$husky_skip_init" ]; then
debug ()
[ "$HUSKY_DEBUG" = "1" ] && echo "husky (debug) - $1"
readonly hook_name="$(basename "$0")"
debug "starting $hook_name..."
if [ "$HUSKY" = "0" ]; then
debug "HUSKY env variable is set to 0, skipping hook"
exit 0
fi
if [ -f ~/.huskyrc ]; then
debug "sourcing ~/.huskyrc"
. ~/.huskyrc
fi
export readonly husky_skip_init=1
sh -e "$0" "$@"
exitCode="$?"
if [ $exitCode != 0 ]; then
echo "husky - $hook_name hook exited with code $exitCode (error)"
exit $exitCode
fi
exit 0
fi
如何使它与外壳无关?我正在使用 lerna monorepo
【问题讨论】:
如果我们不知道husky.sh
中的内容,我不知道我们应该如何回答这个问题。 minimal reproducible example 需要足够完整才能自行测试。
(请注意,husky.sh
如果不与/bin/sh
一起工作,则名称错误——如果它使用zsh-isms,则应为husky.zsh
,@987654330 @ 如果它使用 bashism 等;husky.sh
表示与 all POSIX 系列 shell 兼容——一组包括 ash、dash、bash 和 ksh,但 不 zsh除非在兼容模式下运行)。
(...关于/bin/sh
的问题不应标记为bash
;/bin/sh
是 POSIX sh -- 即使它是 bash 或 zsh 的符号链接,它也会是bash 或 zsh 以 POSIX sh 兼容模式运行,因此应使用sh
标签)。
无论如何,husky.sh
负责编辑 PATH 以包含lerna
的位置(或定义lerna
函数)?如果不是,我们需要从一个完全不同的方向开始寻找(很可能是 shell 初始化代码——依赖于ZSH_ENV
,f/e 的执行)
这绝对不是 POSIX 兼容的代码——readonly
不存在于 POSIX sh 规范中。我会猜测,尽管这只是一个猜测,. ~/.huskyrc
是您真正需要的部分。但如果你想让它便携,请取出readonly
s。
【参考方案1】:
有问题的代码使用readonly
命令。这不是 POSIX sh 规范的一部分。
因此,在基线 POSIX shell 上,readonly hook_name="$(basename "$0")"
根本不能保证设置 hook_name
。取出readonly
。 (另外,我建议不要依赖$0
的行为;如BashFAQ #28 中所述,这是不可靠的)。
export readonly
也不是 POSIX-y;把readonly
也拿出来。
考虑完全放弃husky.sh
,直接在"$HOME/.huskyrc"
采购。
【讨论】:
【参考方案2】:这应该可行:
npx lerna run --concurrency 1 --stream precommit --since HEAD --exclude-dependents
【讨论】:
【参考方案3】:使用此命令对我有用:-
git commit -m "message" --no-verify
【讨论】:
绕过 Husky 并不能解决这个主题的问题。以上是关于如何使外壳不可知论成为赫斯基钩?的主要内容,如果未能解决你的问题,请参考以下文章