VS CodeでDrupalコーディング規約の検出と整形を行う

VS Code上でDrupalのコーディング規約を検出/整形するためには、

- ComposerでPHP CodeSnifferとDrupalコーディング規約のルールセットのインストール
- [phpcs](https://marketplace.visualstudio.com/items?itemName=shevaua.phpcs)と[phpcbf](https://marketplace.visualstudio.com/items?itemName=persoderlind.vscode-phpcbf)(VS Codeの拡張機能)のインストール

の二つの作業が必要。（VS Codeの設定ファイルでphpcs/phpcbfの実行パスを入力する必要があるため）

### Composerで必要なライブラリをインストールする

Drupalのコーディング規約をPHP CodeSnifferで検出するために、drupal/coderをインストールする。

```shell-session
$ composer global require drupal/coder
```

drupal/coderをインストールすると、依存関係としてsquizlabs/php_codesnifferも一緒にインストールされていることがわかる。

```shell-session
$ composer global show -P

dealerdirect/phpcodesniffer-composer-installer /Users/hikarumaruyama/.composer/vendor/dealerdirect/phpcodesniffer-composer-installer
drupal/coder                                   /Users/hikarumaruyama/.composer/vendor/drupal/coder
phpstan/phpdoc-parser                          /Users/hikarumaruyama/.composer/vendor/phpstan/phpdoc-parser
sirbrillig/phpcs-variable-analysis             /Users/hikarumaruyama/.composer/vendor/sirbrillig/phpcs-variable-analysis
slevomat/coding-standard                       /Users/hikarumaruyama/.composer/vendor/slevomat/coding-standard
squizlabs/php_codesniffer                      /Users/hikarumaruyama/.composer/vendor/squizlabs/php_codesniffer
symfony/deprecation-contracts                  /Users/hikarumaruyama/.composer/vendor/symfony/deprecation-contracts
symfony/polyfill-ctype                         /Users/hikarumaruyama/.composer/vendor/symfony/polyfill-ctype
symfony/yaml                                   /Users/hikarumaruyama/.composer/vendor/symfony/yaml
```

squizlabs/php_codesnifferによってphpcs/phpcbfコマンドが提供される。
便利そうなので、phpcs/phpcbfコマンドが使えるようにパスを通す。

```shell-session
$ export PATH="$PATH:$HOME/.composer/vendor/bin" # 実際は.zshrcファイルに追記
$ phpcs -h # パスが通っているか確認
$ phpcbf -h # パスが通っているか確認
```

インストール済みの規約一覧の中に、`Drupal`、`DrupalPractice`が含まれているか確認する。

```
$ phpcs -i

The installed coding standards are MySource, PEAR, PSR1, PSR2, PSR12, Squiz, Zend, Drupal and DrupalPractice
```

phpcsコマンドを実行する際のオプションを、設定ファイルとして[phpcs.xml.dist](https://github.com/pfrenssen/coder#store-settings-in-a-phpcsxmldist-file)に書き起こすことができる。例えば、*.moduleファイルはデフォルトでは無視されてしまうため、`--extensions`オプションで指定する必要がある。phpcs.xml.distファイルはDrupalのプロジェクトルート直下に配置する。

```xml:phpcs.xml.dist
<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="myproject">
  <description>PHP CodeSniffer configuration for myproject development.</description>
  <file>.</file>
  <arg name="extensions" value="php,module,inc,install,test,profile,theme,css,info,txt,md,yml"/>
  <rule ref="Drupal"/>
  <rule ref="DrupalPractice"/>
</ruleset>
```

### VS Codeでの設定

二つの拡張機能をVS Codeにインストールする。
- [phpcs](https://marketplace.visualstudio.com/items?itemName=shevaua.phpcs)
- [phpcbf](https://marketplace.visualstudio.com/items?itemName=persoderlind.vscode-phpcbf)

VS Codeの設定ファイルで次のように設定する。ユーザー設定で事故ると怖いのでワークスペース内で設定して挙動を確認することにする。ワークスペースで設定を上書きするには、Drupalのプロジェクトルートディレクトリ直下に .vscode/settings.json ファイルを作成して行う。

```json-doc
{
  // ...省略...
  // phpcs. see https://www.drupal.org/docs/develop/development-tools/configuring-visual-studio-code#s-drupal-code-standards-configuration
  "phpcs.enable": true,
  "phpcs.standard": "Drupal,DrupalPractice",
  "phpcs.executablePath": "/Users/hikarumaruyama/.composer/vendor/bin/phpcs",
  // phpcbf
  "phpcbf.standard": "Drupal,DrupalPractice",
  "phpcbf.executablePath": "/Users/hikarumaruyama/.composer/vendor/bin/phpcbf",
  "[php]": {
    "editor.defaultFormatter": "persoderlind.vscode-phpcbf"
  },
  // ...省略...
}
```

これで設定完了。VS Codeを再起動して、コーディング規約から外れた記述を行なった際に、ハイライト赤く表示されていればOK。自動整形は `Shift` + `Option` + `F`のショートカットキーで行える。
![Screen Shot 0004-07-23 at 22.03.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79577/0204829b-0df6-fd2f-9d6f-a4b7d1add8c7.png)

## 参考
- https://www.drupal.org/docs/contributed-modules/code-review-module/installing-coder-sniffer
- https://www.drupal.org/docs/contributed-modules/code-review-module/php-codesniffer-command-line-usage
- https://github.com/pfrenssen/coder#store-settings-in-a-phpcsxmldist-file
- https://www.drupal.org/docs/develop/development-tools/configuring-visual-studio-code
- https://www.mochiya.ad.jp/blog/drupal_knowledge/detail/drupal-coding-standards