この記事は、and factory.inc Advent Calendar 2022の 12日目 の記事です。
昨日は、@y-okuderaさんの「スクロールで伸縮するヘッダをSwiftUIで実装する」でした。
はじめに
コミット時にLintを走らせるなど便利なhuskyですが、弊社でも一部のプロダクトで使用することにしました。
私は普段SourceTreeを使っていますが、コミット時にhuskyのpre-commitが失敗するので解決方法を調べてみました。
ちなみに、ターミナルからコミットをする分には問題ありませんでした。
huskyのバージョンは、Ver.8.0.1です。
エラー内容
SourceTreeからコミットしようとすると、以下のようなエラーが発生してコミットすることができません。
git -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree commit -q -F /var/folders/c0/ty42hdr5071fg0zqy1xc3mxh0000gn/T/SourceTreeTemp.1mJRN4
.husky/pre-commit: line 4: npx: command not found
husky - pre-commit hook exited with code 127 (error)
husky - command not found in PATH=/Applications/Sourcetree.app/Contents/Resources/git_local/libexec/git-core:/Applications/Sourcetree.app/Contents/Resources/bin:/Applications/Sourcetree.app/Contents/Resources/git_local/bin:/Applications/Sourcetree.app/Contents/Resources/git_local/gitflow:/Applications/Sourcetree.app/Contents/Resources/git_local/git-lfs:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Completed with errors, see above
npx
が見つからないというエラーメッセージで、実際に PATH=
以降に表示されているパスを確認してもそれっぽいパスはありません。
しかし、ターミナルからは見つかりました。
$ which npx
/Users/[ユーザー名]/.nodebrew/current/bin/npx
ターミナルからのコミットは問題ないことからも、SourceTreeとターミナルとでは環境変数に差があるようです。
解決方法
予想通りとは思いますが、 npx
へのパスを通してあげることで解決します。
ホームディレクトリに .huskyrc
を作成し、そこにnpxへのパスを通せば問題ありませんでした。
$ echo "export PATH=\"$(dirname $(which npx)):\$PATH\"" > ~/.huskyrc
参考:https://github.com/typicode/husky/issues/390#issuecomment-762213421
- npx がどこにあるのかを探して、(which npx)
- ディレクトリ名を表示し、(dirname)
- export文を、(echo "export PATH〜〜〜")
- ~/.huskyrc に出力する。(> ~/.huskyrc)
イシューのコメントでもいくつか投稿されていましたが、単純に以下の指定をしても私の環境ではそのパスにはnpxはないのでうまくいきませんでした。
PATH="/usr/local/bin:$PATH"
なぜホームディレクトリに.huskyrcを置くと大丈夫なの?と思われるかもしれませんが、pre-commitのタイミングでhusky.shを実行しており、そこで以下の指定がされている為だと思います。
if [ -f ~/.huskyrc ]; then
debug "sourcing ~/.huskyrc"
. ~/.huskyrc
fi
ここを改造すれば、.huskyrcの置き場所はホームディレクトリじゃなくてもいけるかもしれませんね。
最後に
エラーが発生しているメンバーもいれば、そうでないメンバーもいるようでした。
また、nvmを使用している場合はnvm.shを実行すると良いというようなイシューのコメントも見かけましたので、各自の開発環境に大きく依存しているんだなと感じています。
特定のプロジェクトの為に、ホームディレクトリにファイルを置くのはちょっとモヤモヤしますが。。。
ある程度大きな規模のプロジェクトになると非エンジニアのかたもGitを操作するようなシーンもあると思いますので、この方法は取りにくいかもしれませんが、あくまで仮の対策という感じで考えていただければと思います。
明日のAdvent Calendarの記事もお楽しみに!