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 で、初期値の設定と選択状態のクリア