husky + lint-staged + PHP-CS-Fixer で commit 時に PHP ファイルを自動整形する
はじめに
PHP ファイルを Git リポジトリに登録(commit)する時に、PHP-CS-Fixer で自動整形を必須にする方法を調べた。
.git/hooks/pre-commit でも実現できるが、できればチームメンバー内で共有したい(git clone (してゴニョゴニョ)するだけで使えるようにしたい)ので、もう少し突っ込んで調べてみた。
TL;DR
husky+lint-staged+php-cs-fixerでコミット時の自動整形を実現可能huskyを使うと、package.jsonで クライアントサイドの Git hooks(pre-commit など)を利用できるlint-stagedを使うと、ファイル種別ごとにコマンドを実行できるhusky+lint-stagedで、*.phpの commit 時にphp-cs-fixerを実行する
目次
環境・条件
1 | $ sw_vers |
詳細
検証に使ったリポジトリ: 17number/php-auto-format-with-husky-example
セットアップ
インストール
husky, lint-staged のインストール(npm)
1 | $ npm i -D husky lint-staged |
friendsofphp/php-cs-fixer のインストール(composer)
1 | $ composer require --dev friendsofphp/php-cs-fixer |
package.json 変更
pre-commitフックでlint-stagedを実行するようにして、lint-stagedで.phpファイルに対してphp-cs-fixer fixで整形し、- 整形後のファイルを
git addで commit 前にステージングする
1 | "devDependencies": { |
.gitignore 変更
php-cs-fixer を実行すると、.php_cs.cache が生成されるので、.gitignore に追加
1 | $ echo .php_cs.cache >> .gitignore |
検証
適当なサンプルコードで動作を検証する。
1 |
|
上記内容で sample.php を作成し git add でステージング。git diff --cached で見ると以下の状態、紛うことなきクソコード。
1 | diff --git a/sample.php b/sample.php |
このまま git commit -m でコミットすると、husky → lint-staged → php-cs-fixer と動作して、整形されたコードがコミットされる。
1 | $ git commit -m "chore: do php-cs-fixer on pre-commit" |
実際にコミットされたファイルは下記、(中身は無いが) php-cs-fixer による恩恵を何も意識せずに受けれていることが分かる。
1 |
|
複数ファイルでも動作できるようにする
これで万事 OK かと思ったが、そうはいかなかった。
試しに複数ファイルをコミットしてみると For multiple paths config parameter is required. と怒られてしまう。
1 | $ git status |
複数ファイルをコミット(して php-cs-fixer による整形)するためには、コンフィグファイルを用意してオプションを追加する必要がある。
Config file を参考に、以下の内容で .php_cs.dist を作成。ひとまずデフォルトルールで動作させたいので、setRules はコメントアウトする。
1 |
|
package.json を修正して、コンフィグファイルを指定する。
1 | "lint-staged": { |
コミットしてみる。
1 | $ git commit -m "chore: multiple file test" |
複数ファイルでも問題なく動作するようになった。
まとめ
husky+lint-staged+php-cs-fixerでコミット時の自動整形を実現可能huskyを使うと、package.jsonで クライアントサイドの Git hooks(pre-commit など)を利用できるlint-stagedを使うと、ファイル種別ごとにコマンドを実行できるhusky+lint-stagedで、*.phpの commit 時にphp-cs-fixerを実行する
その他・メモ
今回の記事は以下の2サイトの内容を(部分的に)組み合わせただけ、先人に感謝。
- husky + lint-staged で品質を保つ - ナデズダ・ゴボリン🖥
- gitのpre-commit hookを使って、綺麗なPHPファイルしかコミットできないようにする - MANA-DOT
(今回は php-cs-fixer しか使っていないが) 以下の参考サイトにも出てくる通り、php -l でのシンタックスチェックなどもう少し厳密なチェックをすると良さそう。
PHP 以外でも普通に使えると思う。
参考文献
- husky - npm
- lint-staged - npm
- FriendsOfPHP/PHP-CS-Fixer: A tool to automatically fix PHP Coding Standards issues
- husky + lint-staged で品質を保つ - ナデズダ・ゴボリン🖥
- gitのpre-commit hookを使って、綺麗なPHPファイルしかコミットできないようにする - MANA-DOT
- hootsuite/pre-commit-php
- allysonsilva/php-pre-commit
関連記事
- webpack & Babel を使って Chrome 拡張機能を開発するためのテンプレート(Hot Reload 付き)
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)
- axios で unable to verify the first certificate の対応方法
- npm や yarn でインストールした husky が動かない問題の対応方法
- Git で package-lock.json がコンフリクトした時の解決方法
- Vue.js で FontAwesome を使う方法
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア