🐶

huskyを使わずにpre-commitを実行する

2020/12/23に公開

huskyをこれまでlint-stagedと合わせてよく使ってきたのですが、huskyはver.5からこれまでとは少し異なるライセンスとなるそうです。pre-commitフックしか使っていないし、GitのHooksディレクトリを変更できることを知ったので、huskyを使わずにこれまでと同じ挙動を実現できるんじゃないか、とふと考えて試してみたくなったので試してみました。

まずpre-commitのスクリプトを書きます。lint-stagedを実行したいのでそれを呼ぶコマンドを書いているだけです。(これくらい単純だとsetすら必要なさそう……)

.hooks/pre-commit
#!/bin/bash

set -eo pipefail

# "$(npm bin)/lint-staged" でもよかったかも?
"$(git rev-parse --show-toplevel)/node_modules/.bin/lint-staged"

忘れないように実行権限をつけておきます。

Terminal
$ chmod +x .hooks/pre-commit

huskyと同じようにモジュールのインストール時にGitがHooksを実行してくれるようにします。GitのHooksを配置するディレクトリは標準では.git/hooksとなっていますが、core.hooksPathを指定することで好きなディレクトリに変更できます[1]

package.json
{
  ...
  "scripts": {
    "prepare": "[ -n \"$CI\" ] || git config core.hooksPath .hooks 2>/dev/null"
  }
  ...
}

これで一応実現できました(手元の環境では思った通りの動作をしました)。ただ、yarn addなどモジュールを追加するたびにgit config core.hooksPath .hooksが実行されるので、もう少し賢いBashスクリプトを書いた方が良いのかもしれません……(でもコードが長くなるし……)

脚注
  1. https://git-scm.com/docs/githooks ↩︎

Discussion