lefthookでgit hooksのタイミングでlintを行う

ざっと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に対しても実行する