ざっとlint系を揃えたので、pre-commit のタイミングでlintをかけるようにしてみます。
・standardとsnazzyでjsのlint結果をeslint風にする
・stylelintでscssのlintを行う
・haml-lintでrubocopのlintをviewに対しても実行する
どのライブラリを使うか
選択肢は以下のようなものがあります(他にもあるかもですが)。
・lefthook (Github Star: 2.8k)
・Husky (Github Star: 29.9k)
・pre-commit (Github Star: 10.1k)
lefthookはgo製で高速かつ設定がsimpleです。
Huskyも導入しやすく、nodeだけのプロジェクトで使ってたりします。
pre-commitは、公式や3rd partyが用意している公開リポジトリのscriptを利用できたりします。ただ、公開されているものが古くて動かなかったりする問題があったりします。
またscriptを共通化して複数プロジェクトで使える機能もあります。(lefthookも似たような機能があった気がしますが)
過去に使ってみた感想ですが、lintなどのバイナリをプロジェクト管理している(Gemfileやpackage.jsonで管理)ものがあると、
pre-commit用のツールとで2重管理になっちゃうので、pre-commitに寄せるのが良さそうだと思いました。
(もしくはpre-commitでは、プロジェクト管理しているツールを参照するscriptを独自に用意するという方法もあります。)
ケースバイケースという感じでしょうか。
今回は要件も特にないので、高速で使いやすいlefthookを利用します。
evilmartians/lefthook: Fast and powerful Git hooks manager for any type of projects.
Installation
公式 に記載がありますが、npm、brew、gemなど色々用意されてます。
手元はrubyのプロジェクトなので、gemで入れます。
Settings
$ lefthook install -f'
すれば、lefthook.yml が作成されるので、実施したいことを個別に記載すればokです。
pre-commitだけ設定します。必要ならpre-pushを入れても良いかもです。
# lefthook.yml pre-commit: parallel: true commands: eslint: glob: "*.{js,ts,jsx,tsx}" run: yarn standard {staged_files} | yarn snazzy haml-lint: glob: "*.{haml}" run: bundle exec haml-lint {staged_files} rubocop: tags: backend style glob: "*.rb" exclude: "application.rb|routes.rb" run: bundle exec rubocop --force-exclusion {staged_files} stylelint: glob: "*.{css,scss}" run: yarn stylelint {staged_files}
若干rubocopのexcludeのところが、rubocop.ymlと重複しそうで微妙ですが、良い方法が見つけれなかった。
See Also
・standardとsnazzyでjsのlint結果をeslint風にする
・stylelintでscssのlintを行う
・haml-lintでrubocopのlintをviewに対しても実行する