こんにちは。よっしーです(^^)
今日は、dockerで構築した開発環境において、psalmを導入した手順をご紹介します。
実行環境
この記事は、特定の開発環境を前提として書かれています。もし興味がある場合は、その開発環境を構築するための説明が書かれている記事を参考にしてください。該当記事は下記になります。
ただ、この記事で紹介している修正内容がたくさんあるので、その修正を反映した最新版のプログラムをダウンロードして、参照することをおすすめします。該当のプログラムの詳細については、下記のページで確認できます。
背景
Psalmは、PHPの静的解析ツールの一つであり、PHPコードの品質向上やバグの早期発見に役立ちます。具体的には、以下のようなメリットがあります。
- コード品質の向上 Psalmは、PHPコードの静的解析を行い、コード品質を向上させることができます。例えば、未定義の変数を使用した場合や、存在しないメソッドを呼び出した場合など、エラーを検出することができます。また、型の不一致や、不正な型キャストなども検出することができます。
- バグの早期発見 Psalmは、コード内のエラーを検出することができるため、バグを早期に発見することができます。これにより、デバッグの時間を短縮することができます。
- リファクタリングの支援 Psalmは、コードの解析を行うことにより、コードのリファクタリングを支援することができます。例えば、コード内で使用されていない変数やメソッドを検出することができます。また、型の不一致や、不正な型キャストなどを検出することにより、コードの安全性を向上することができます。
以上のように、Psalmを導入することで、PHPコードの品質向上やバグの早期発見、リファクタリングの支援など、さまざまなメリットを得ることができます。
ディレクトリ構造
ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新、削除になります。
.
├── LICENSE
├── Makefile
├── README.md
└── app
├── apache-exporter
├── compose.yml
├── flyway
├── grafana
├── influxdb
├── k6
├── memcached
├── memcached-exporter
├── nginx
├── nginx-exporter
├── phan
├── php-fpm
├── php-fpm-exporter
├── phpstan
├── mongo
├── mysql
├── mysqld-exporter
├── prometheus
├── phpstan
│ ├── .gitignore
│ ├── Dockerfile
│ ├──psalm.xml
│ └── log
│ └── .gitkeep
├── redis
├── redis-exporter
├── schemaspy
├── web
└── xhgui
compose.yml
下記の内容をファイル(compose.yml) 318-326 行目に追加します。
psalm-cmd:
build: ./psalm
container_name: psalm
volumes:
- ./php-fpm/CodeIgniter-3.1.13/application:/app/src
- ./psalm/psalm.xml:/app/psalm.xml
profiles:
- psalm
psalm/Dockerfile
下記の内容で新規ファイル(psalm/Dockerfile) を作成します。
FROM ghcr.io/webfactory/psalm:latest
psalm/psalm.xml
下記の内容で新規ファイル(psalm/psalm.xml) を作成します。
<?xml version="1.0"?>
<psalm
errorLevel="2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
xmlns:xi="http://www.w3.org/2001/XInclude"
>
<projectFiles>
<directory name="src" />
</projectFiles>
</psalm>
設定内容については、下記の公式サイトにあります。
psalm/log/.gitkeep
空で新規ファイル(psalm/log/.gitkeep) を作成します。
Makefile
下記の内容をファイル(Makefile) 72-77 行目に追加します。
# 静的解析の実施
.PHONY: run_psalm
run_psalm:
cd $(WOKR_DIR) \
&& docker compose run --rm psalm-cmd > ./psalm/log/analysis_$(RUN_DATETIME).log
動作確認
下記のコマンドを実行して、サービスを起動します。
make run_psalm
下記のファイルができていることを確認します。
app/psalm/log/analysis_(実行日時).log
ただ、makeコマンドを実行すると下記のようにエラーが表示されますが、原因解明には至っていないです。気になる方は、docker compose コマンドを実行してもらえればと思います。makeコマンドで実行した結果とdocker compose コマンドで実行した結果は同じでした。
% make run_psalm
make: *** [run_psalm] Error 1
解説
psalmについて
Psalmは、PHPの静的解析ツールで、PHPコードの品質を向上させ、バグの発生を防止することを目的としています。以下に、Psalmの特徴や使い方について説明します。
特徴:
- PHPDocをベースに構築された静的解析エンジンを使用しており、型の解析やコードの潜在的な問題を検出することができます。
- エラーを返すだけでなく、解決策も提供することができます。例えば、型の不一致を検出した場合、適切な型ヒントの追加を提案することができます。
- 設定ファイルを使用して、解析対象とするファイルやディレクトリ、除外するファイルやディレクトリなどを指定することができます。
Psalmは、PHPアプリケーションの品質を向上させるための強力なツールであり、開発効率の向上やバグの減少など、多くのメリットを提供しています。
psalm/psalm.xml
<?xml version="1.0"?>
<psalm
errorLevel="2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
xmlns:xi="http://www.w3.org/2001/XInclude"
>
<projectFiles>
<directory name="src" />
</projectFiles>
</psalm>
このコードは、Psalmの設定ファイル psalm.xml
の例です。以下に各要素の説明を示します。
<?xml version="1.0"?>
XML宣言。XMLのバージョンを指定しています。
<psalm>
設定ファイルのルート要素です。xmlns:xsi
、xmlns
、xsi:schemaLocation
、xmlns:xi
属性があります。
errorLevel="2"
エラーレベルを指定しています。ここでは、レベル2のエラーを出力するように設定しています。エラーレベルは、0から8の範囲で設定できます。0はエラーを無視することを意味し、8は全てのエラーを出力することを意味します。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
名前空間 xsi
を定義しています。この名前空間は、XMLスキーマインスタンスの定義に使用されます。
xmlns="https://getpsalm.org/schema/config"
名前空間 psalm
を定義しています。これにより、このファイル内のすべての要素が psalm
名前空間に属することになります。
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
XMLスキーマ定義ファイルの場所を指定しています。ここでは、config.xsd
ファイルが vimeo/psalm
パッケージに含まれていることを前提に、相対パスで指定しています。
xmlns:xi="http://www.w3.org/2001/XInclude"
名前空間 xi
を定義しています。これは、XInclude機能を使用するために必要です。
<projectFiles>
プロジェクトのファイルを指定する要素です。ここでは、src
ディレクトリ以下のファイルを対象としています。
<directory name="src" />
projectFiles
要素内の directory
要素です。name
属性に対象のディレクトリ名を指定しています。上記の例では、src
ディレクトリを指定しています。
このように、設定ファイルには、エラーレベルの設定や解析対象のファイル・ディレクトリの指定など、さまざまな設定を記述することができます。
おわりに
今日は、dockerで構築した開発環境にpsalmを導入しました。ぜひ、品質向上等に使用してみてください。
今回使用したファイルは下記のGitHubにタグ付けしています。
もし、質問等あればコメントください。確認後、ご連絡いたします。随時、エンジニア案件も相談可能ですので、よろしくお願いいたします。
また明日お会いしましょう!
コメント