Okarin note

頭の整理もかねて色々と書いていきます

huskyを使ってeslintとprettierを強制する

今まで手動でeslintとprettierをやっていたんですが漏れたり、
そもそも手動というのが辛すぎるのでコミット時に自動で実行してほしいなーと思ったのでやってみました。

eslintやprettierをコミット時に実行するモジュールとして「lint-staged」を使いました。
つまり、huskyを使ってlint-stagedをコミット時に実行するようにして、eslintとprettierを強制するわけですね!

huskyとは?

typicode.github.io

huskyはGit hooksが簡単にできるパッケージです。
Git hooks とはコミットやプッシュなどの特定のアクションが発生したときにスクリプトを実行する仕組みになります。

lint-stagedとは?

github.com

lint-stagedはステージングしたファイルに対し、特定のコマンドが実行できるパッケージです。 例えば、Node.jsのnpmスクリプトに定義しているスクリプトを実行できるのでとても便利です!

設定してみる

環境

  • WIndows11

huskyの設定

husky のインストール

npm i -D husky

husky の初期化

npx husky install

lint-stagedの設定

lint-stagedのインストール

npm i -D lint-staged

package.jsonスクリプト設定を追加する

"scripts": {
    ...,
    "lint-staged": "lint-staged"
  },
  "lint-staged": {
    "*.{js,ts,jsx,tsx}": [
      "npx eslint . --fix",
      "npx prettier --write ."
    ]
  },
}

hooks の登録

コミット時に動くスクリプトの設定

npx husky add .husky/pre-commit "lint-staged"

実行してみた

 git commit                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  > husky-sample@1.0.0 lint-staged                                                                                                                                                                                                                                          > lint-staged                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       [STARTED] Preparing lint-staged...                                                                                                                                                                                                                                        [SUCCESS] Preparing lint-staged...                                                                                                                                                                                                                                        [STARTED] Running tasks for staged files...                                                                                                                                                                                                                               [STARTED] package.json — 23 files                                                                                                                                                                                                                                         [STARTED] *.{js,ts,jsx,tsx} — 5 files                                                                                                                                                                                                                                     [STARTED] npx eslint . --fix                                                                                                                                                                                                                                              [SUCCESS] npx eslint . --fix                                                                                                                                                                                                                                              [STARTED] npx prettier --write .                                                                                                                                                                                                                                          [SUCCESS] npx prettier --write .                                                                                                                                                                                                                                          [SUCCESS] *.{js,ts,jsx,tsx} — 5 files                                                                                                                                                                                                                                     [SUCCESS] package.json — 23 files                                                                                                                                                                                                                                         [SUCCESS] Running tasks for staged files...                                                                                                                                                                                                                               [STARTED] Applying modifications from tasks...                                                                                                                                                                                                                            [FAILED] The following paths are ignored by one of your .gitignore files:                                                                                                                                                                                                 [FAILED] node_modules                                                                                                                                                                                                                                                     [FAILED] Use -f if you really want to add them.                                                                                                                                                                                                                           [STARTED] Cleaning up temporary files...                                                                                                                                                                                                                                  [SUCCESS] Cleaning up temporary files...                                                                                                                                                                                                                                  Aborting commit due to empty commit message.
PS D:\git\husky-sample> 
PS D:\git\husky-sample>
PS D:\git\husky-sample> git commit -m "test: husky"

> husky-sample@1.0.0 lint-staged
> lint-staged

[STARTED] Preparing lint-staged...
[SUCCESS] Preparing lint-staged...
[STARTED] Running tasks for staged files...
[STARTED] package.json — 23 files
[STARTED] *.{js,ts,jsx,tsx} — 5 files
[STARTED] npx eslint . --fix
[SUCCESS] npx eslint . --fix
[STARTED] npx prettier --write .
[SUCCESS] npx prettier --write .
[SUCCESS] *.{js,ts,jsx,tsx} — 5 files
[SUCCESS] package.json — 23 files
[SUCCESS] Running tasks for staged files...
[STARTED] Applying modifications from tasks...
[FAILED] The following paths are ignored by one of your .gitignore files:
[FAILED] node_modules
[FAILED] Use -f if you really want to add them.
[STARTED] Cleaning up temporary files...
[SUCCESS] Cleaning up temporary files...
[main 1b63285] test: husky
 23 files changed, 8548 insertions(+), 1 deletion(-)