GitコミットのためのPHP CS Fixerワークフロー自動化

私たちは皆、PHPコードスタイルフィクサーを使用しています。みんなそれが大好きです!しかし、変更をプッシュする前に毎回「composer fix」ボタンをクリックするのは好きではありません。きっとLefthookユーティリティを気に入ると思います。なぜなら、それはPHPプロジェクトで最も頻繁なアクションの一つを自動化するからです。

PHP CS fixer visualisation
Уявлення PHP CS Fixer у поєднанні з LeftHook з точки зору ШІ

早かれ遅かれ、すべての開発者は自動コード修正ツールの喜びを知ることになるでしょう。これは時間を節約し、コードの品質を向上させます。しかし、時間が経つにつれて、誰もがそのようなプロセスを自動化する問題に直面します。私たちは、基本的なことに時間を無駄にし、手動でコード修正のワークフローをトリガーするのが好きではありません。

私の旅路

さまざまなツールを試しました。直接.git/hooksディレクトリにコミットすることから、Huskyまで。プロジェクトでのコード修正の自動化のための完璧なソリューションを探していました。そのような目的で最も人気のあるツールの一つがHuskyです。

なぜHuskyが好きではないのか?

  • 複雑なセットアップ。 Huskyの設定は多くのステップを経る必要があり、設定を簡素化するための豊富な機能がすぐには利用できません。

  • Node.js環境。 そんなシンプルなツールでもNodeJSのインストールが必要です。これはインストールと使用中にパフォーマンスのオーバーヘッドを引き起こします。

  • 依存関係の管理。 Huskyをインストールするには、NPMPNPM、またはBunのいずれかのパッケージマネージャーが必要です。これらは不要なものをデスクトップに増やし、ツールのセットアップをより複雑にします。

自分にとって完璧な解決策を見つけた

GitHubのリポジトリリストを眺めていると、Lefthookという究極の開発者ツールを発見しました。では、なぜこれを気に入ったのでしょうか?

  • コンパイルされた言語を使用

    • 優れたパフォーマンス

    • パッケージマネージャーやランタイムが不要

    • 煩わしさなくどんな環境にも統合可能

    • 単一のバイナリとして提供

  • 設定ファイルにYAML構文を使用。 YAMLは、ほとんどのプロジェクトのCIワークフローで使用される設定ファイルの有名なマークアップです。例えばGitHub Actionsがあります。これはほとんどのオープンソースプロジェクトで使用されています。

  • ほとんどのセットアップはビルトインユーティリティで設定可能。 Lefthookは豊富な設定オプションを持っています。自動コード修正やコードリントなどの基本的なタスクを設定するために、Gitの内部を知る必要はありません。

  • 優れた モノレポ サポート

PHP CS Fixerを使用したLefthookの設定

こんな短いアクションに対しては前置きが長すぎました。この記事を書いている時点で、Lefthookの最新バージョンは1.6.4です。では、ステップバイステップで進めましょう。

  • Readmeに記載されているように、PHP Code Style Fixerをインストールして設定します。

  • インストールガイドに記載されている任意の方法でLefthookをインストールします。macOSでは、brewパッケージマネージャーを使用してインストールします:brew install lefthook

  • プロジェクトのルートにlefthook.ymlという名前の設定ファイルを作成します。注意! モノレポを使用していても、Gitリポジトリのルートに配置する必要があります。

  • lefthook.ymlファイルに以下の内容を記入します。

    pre-commit:
      commands:
        web-cs-fixer:
          tags: style fixer
          glob: "*.php"
          stage_fixed: true
          run: vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php --allow-risky=yes fix {staged_files}
    

変更を適用するためにlefthook installコマンドを実行します。注意! Lefthookは内部でGitフックを使用しているため、設定ファイルを更新した後は再度lefthook installを実行する必要があります。

これで完了です。コーディングをお楽しみください!

プロパティの説明

  • {staged_files}テンプレートは、変更されたファイルのリストを提供するための組み込み変数です。

  • globプロパティは、コマンドを実行したいファイルをフィルタリングするために使用されます。

    • *.phpは、PHP CS FixerがPHPファイルのみに対して実行され、他の拡張子との競合を避けることを意味します。
  • stage_fixedは私のお気に入りの部分です。変更されたファイルを再びGitに追加してくれます(git addコマンドを実行する必要がありません)。

  • runには、各コミットの前に実行したいコマンドが含まれています。

モノレポのセットアップ

私のプロジェクトの一つでは、Dockerのモノレポジトリデザインを使用しています。コンテナの一つはPHP Symfonyアプリケーションです。そのような場合の簡単な解決策があります。

モノレポでPHP CS Fixerを実行するために、設定にはrootプロパティがあります。プロジェクトのルートにあるlefthook.ymlを以下の設定で更新します。

pre-commit:
  commands:
    web-cs-fixer:
      tags: style fixer
      root: "path/to/docker_containers/php_web_app/"
      glob: "*.php"
      stage_fixed: true
      run: vendor/bin/php-cs-fixer --config=.php-cs-fixer.dist.php --allow-risky=yes fix {staged_files}

path/to/docker_containers/php_web_app/をあなたのPHPプロジェクトディレクトリのパスに置き換えてください。注意! パスは末尾にスラッシュ '/' が必要です。