🐶
huskyを使わずにpre-commitを実行する
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スクリプトを書いた方が良いのかもしれません……(でもコードが長くなるし……)
Discussion