MENU

PhpStormでCodeSnifferを設定し使ってみる(Windows版)

更新日:2019/08/24

 

最近WordPressのプラグインを作成し始めました。
最終的にはWordPressの公式ディレクトリに登録しようと思うので、WordPress コーディング規約を守らないといけません。

 

そこでCodeSnifferをインストールし、普段使っているPhpStormで使用できるように設定を行いました。

 

■お願い
去年ECMAScript2020を頑張って日本語訳しましたが、誰も見てくれません・・・
誰かみて!!
【JavaScript】 学習のためECMAScript2020を日本語訳してみました

仕方がないけれど、Composerをインストールする

 

調べてみると、PHP CodeSnifferをインストールするには、Composerが必要なようです。

 

 

まじかー


 

Windowsではあまり使わないので入れたくないのですが、仕方がありません。
入れます。

 

ComposerのWindowsへのインストールは、長くなるので、こちらの記事に分けました。

 

 

CodeSnifferをインストール

ではサクッと、CodeSnifferをインストールしてみましょう。

 

コマンドプロンプトから、次のコマンドを実行します。

 

squizlabs/PHP_CodeSniffer | GitHubにある、Composerでのインストール方法をそのまま実行します。

 

> composer global require "squizlabs/php_codesniffer=*"
Changed current directory to C:/Users/aaaa/AppData/Roaming/Composer
./composer.json
has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing squizlabs/php_codesniffer (3.4.2): Downloading (100%)
Writing lock file
Generating autoload files

 

少し時間がかかります…

 

 

CodeSnifferどこにダウンロードされた?


 

どうやら、C:\Users\ユーザーフォルダ\AppData\Roaming\Composer\vendorにダウンロードされたようです。

 

実際に動作するか確認してみましょう。

 

>phpcs --version
PHP_CodeSniffer version 3.4.2 (stable) by Squiz (http://www.squiz.net)

 

バージョン情報が表示されれば、インストールされています。

Wordpressプラグインやテーマを開発する場合

Wordpressは独自のコーディング規約があるので、CodeSnifferもそれに合わせたチェックをする必要があります。

 

そのために、Wordpressのコーディング規約をインストールします。
WordPress Coding Standards for PHP_CodeSniffer

 

(1) コマンドプロンプトを開く

 

(2) ダウンロードするフォルダを作成して、その中に移動する。

 

d:\> mkdir wpcs
d:\> cd wpcs

 

(3) composerでダウンロードする

 

d\wpcs > composer create-project wp-coding-standards/wpcs --no-dev
Installing wp-coding-standards/wpcs (2.1.1)
- Installing wp-coding-standards/wpcs (2.1.1): Downloading (100%)
Created project in D:\wpcs\wpcs
Loading composer repositories with package information
Updating dependencies
Package operations: 1 install, 0 updates, 0 removals
- Installing squizlabs/php_codesniffer (3.4.2): Loading from cache
Writing lock file
Generating autoload files

 

Created project in D:\wpcs\wpcs

 

wpcsフォルダの中に、wpcsフォルダができてしまった…

 

ダウンロードしただけだと思うので、 D:\wpcs\wpcsの中身を、 D:\wpcsに移動しました。

 

(4) CodeSnifferに、Wordpressのコーディング規約を認識させる。

 

d:\wpcs>phpcs --config-set installed_paths d:\wpcs <= 規約が入っているパス
Using config file: C:\Users\aaaa\AppData\Roaming\Composer\vendor\squizlabs\php_codesniffer\CodeSniffer.conf

 

Config value "installed_paths" added successfully

 

(5) 確認

 

d:\wpcs>phpcs -i
The installed coding standards are MySource, PEAR, PSR1, PSR12, PSR2, Squiz, Zend, WordPress, WordPress-Core, WordPress-Docs and WordPress-Extra

 

WordPressが追加されていればOK

 

Code SnifferをPhpStormに設定する

(1) 設定画面から、言語フレームワーク > PHP > 品質ツール を選択する。

 

Phpstorm 品質ツール

 

(2) Code Sniffer欄の...をクリックし、Code Sniffer設定画面を開く

 

Phpstorm Quality Tools Code Sniffer設定画面

 

(3) PHP Code Sniffer pathに、「phpcs.bat」を入力

 

 

 

(4) 検証を押し、次のように表示されたらOK

 

OK, PHP_CodeSniffer version X.X.X by Squiz (http://www.squiz.net)

 

表示されない場合、phpcs.batへのパスが通っていない可能性が高い。
パスを通すか、フルパスで指定する。

 

フルパス:
C:\Users\ユーザーフォルダ\AppData\Roaming\Composer\vendor\bin\phpcs.bat

 

(5) Path to phpcbfに、「phpcbf.bat」または、phpcbf.batへのフルパスを指定する。

 

 

(6) 設定画面から、エディター > インスペクション を選択する。

 

Phpstorm インスペクション設定画面

 

(7) 中央の選択欄から、PHP > Quality Tools を開き、「PHP Code Sniffer 検証」にチェックを入れる。

 

Phpstorm Code Sniffer 検証

 

(8) オプションのCoding stabdardから、WordPressを選択する。(Wordpressの規約チェックを行う場合)

 

Phpstorm Code Sniffer WordPress

使ってみる

ここまでの設定を行うと、Code Snifferが自動で検証してくれます。

 

そして表示された、悲しいメッセージ…

 

クライアント

 

phpcs:Too many messages per file,only first 50 errors/warnings are shown

 

ファイルごとのメッセージが多すぎる、最初の50個のエラー/警告のみが表示されます

 

自動で修正する

 

手作業での修正は時間がかかってしまうので、Code Snifferのphpcbfを使って、自動整形を行います。

 

phpcbfコマンドは、Code Sniffer設定画面で、設定してあります。
確認してみてください。

 

自動整形は、コードのクリーンアップで行います。

 

メニュー:コード(C) > コードのクリーンアップ(C)

 

PhpStorm コードのクリーンアップ

 

どの範囲でクリーンアップするか指定する画面がでるので、指定してOKを押します。

 

これで自動整形される…はずです。

 

OneDrive管理下のフォルダはNG

 

私の場合、ソースをOneDrive管理下のフォルダに置き、自動でバックアップできるようにしています。

 

しかしPHPは、OneDrive管理下のフォルダにアクセスできないようです。

 

 

回避策として、一度別のフォルダにコピーしてからphpcbfコマンドを実行し、終わったらもとに戻します。

 

(1) 作業用のフォルダを作成

 

OneDrive外で、確実にアクセスできるフォルダを作成する

 

(2) 次のファイルを、パスの通っているComposer\vendor\binフォルダに作成します。

 

ファイル名:pre_phpcbf.bat

 

@echo off
set FULLPARAM=%*
set BACHTMPDIR=d:\temp\ <=作業フォルダ。適宜変更
call :getfname %*
setlocal ENABLEDELAYEDEXPANSION
set FULLPARAM=!FULLPARAM:%PHPFILEFULL%=%BACHTMPDIR%%PHPFILE%!
set PHPFILEFULL=%PHPFILEFULL:/=\%
@echo on
copy /Y %PHPFILEFULL% %BACHTMPDIR%
call phpcbf.bat %FULLPARAM%
@echo on
copy /Y  %BACHTMPDIR%%PHPFILE% %PHPFILEFULL%
goto :eof

 

:getfname
  set PHPFILEFULL=%~1
  set PHPFILE=%~nx1
  set PHPFILEPATH=%~dp1
  shift
  if not "%~1"=="" goto getfname

 

goto :eof

 

(2) 外部ツールに登録

 

1.設定画面 > ツール > 外部ツール

 

2.+で追加

 

3. ツールの編集画面

 

PhpStorm ツールの編集 CodeSniffer整形設定

 

名前、説明:適当に!

 

プログラム: pre_phpcbf.bat

 

引数:--standard=WordPress --encoding=utf-8 --extensions=php,js,css,inc "$FilePath$"

 

作業ディレクトーリー:作成した作業フォルダ

 

(3) メニュー:ツール > External Tools > 作成したツールを実行

 

PhpStorm 外部ツール 実行

 

(4) phpcbf.batが実行されます。

 

ただし、作成したバッチファイルはCode Snifferの終了コードなどをチェックしていないので、なんらかの問題がでるかもしれません。

 

実行後はソースを確認してください。

 

Code Sniffer設定画面のPHP Code Sniffer pathをpre_phpcbf.batに変更ししてもいいのですが、PhpStormが他にも何か作業をしているようで、時々めちゃくちゃ遅くなります。

 

外部ツールとして使用したほうが、良さそうです。

バッチファイルの解説

蛇足ですが、先ほどのバッチファイルの解説をしておきます。

 

@echo off

 

コマンドのメッセージ出力をオフにします

 

set FULLPARAM=%*

 

コマンドが呼び出された時の、全てのパラメーターを変数に保存しています。

 

phpcbf.bat --standard=WordPress --encoding=utf-8 --extensions=php,js,css,inc c:/user/aaa/OneDrive/xxx.php
青文字部分が保存されます。

 

set BACHTMPDIR=d:\temp\

 

作業フォルダを変数に保存しています。
適宜、変更してください。
(最後の\必須)

 

call :getfname %*

 

保存した全てのパラメーターから、最後のパラメータを取り出すサブルーチンを呼び出しています。

 

setlocal ENABLEDELAYEDEXPANSION

 

遅延環境変数(!)を有効にしています。

 

set FULLPARAM=!FULLPARAM:%PHPFILEFULL%=%BACHTMPDIR%%PHPFILE%!

 

実行時に受け取ったパラメータ列を置換しています。

 

変数の置換:
!環境変数:置換する文字=置換後の文字!

 

FULLPARAM:PhpStormから受け取った、全パラメータ
PHPFILEFULL:最後のパラメーター(c:/user/aaa/OneDrive/xxx.php)
BACHTMPDIR:作業フォルダ(d:\temp\)
PHPFILE:最後のパラメータからファイル名を抽出したもの(xxx.php)

 

つまり、
--standard=WordPress --encoding=utf-8 --extensions=php,js,css,inc c:/user/aaa/OneDrive/xxx.php

--standard=WordPress --encoding=utf-8 --extensions=php,js,css,inc d:\temp\xxx.php
に置換しています。

 

set PHPFILEFULL=%PHPFILEFULL:/=\%

 

c:/user/aaa/OneDrive/xxx.php

c:\user\aaa\OneDrive\xxx.php
に置換しています。

 

@echo on

 

ここから、コマンドのメッセージを出力する。
必要なければ削除

 

copy /Y %PHPFILEFULL% %BACHTMPDIR%

 

PhpStorm上のファイルを、作業フォルダにコピー

 

call phpcbf.bat %FULLPARAM%

 

作業フォルダにコピーしたファイルに対して、phpcbf.batを実行

 

@echo on

 

phpcbf.batでecho offされているので、onしておく。

 

 

copy /Y %BACHTMPDIR%%PHPFILE% %PHPFILEFULL%

 

処理後のファイルを、PhpStorm上にコピー

 

goto :eof

 

処理終了

 

:getfname

 

サブルーチンの開始

 

set PHPFILEFULL=%~1

 

一番目のパラメータをセット

 

set PHPFILE=%~nx1

 

一番目のファイル名をセット。

 

 

set PHPFILEPATH=%~dp1

 

一番目のパスをセット。
/は、\で取得される

 

shift

 

パラメーターをずらす。
(2番目のパラメーターが一番目にずれる。)

 

if not "%~1"=="" goto getfname

 

パラメーターが残っていたら、サブルーチンの最初に戻る

 

goto :eof

 

処理終了。
呼び出し元に戻る。

記事の内容について

 

こんにちはけーちゃんです。
説明するのって難しいですね。


「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。

そんなときは、ご意見もらえたら嬉しいです。

ご意見はこちら。
https://note.affi-sapo-sv.com/info.php

【お願い】

お願い

■このページのURL


■このページのタイトル


■リンクタグ