如何使外壳不可知论成为赫斯基钩?

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 是您真正需要的部分。但如果你想让它便携,请取出readonlys。 【参考方案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 并不能解决这个主题的问题。

以上是关于如何使外壳不可知论成为赫斯基钩?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建项目外壳

如何从外壳识别 Android 设备的分区?

如何从子进程设置父进程的外壳环境

如何检查是不是启用了 Java Access Bridge? (电源外壳)

如何正确清理文件名(防止外壳注入)?

编写基本外壳