もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

php-cs-fixerでPSR2を守らせつつインデントはタブにしたい

概要

今携わっているプロジェクトのコードが、だいぶ昔のソースコードで、かつ色んな人が触っているから書き方がバラバラという、まぁなるべくしてなったレガシーコードでした。

せっかくなので、php-cs-fixerを導入して、PSR2を守らせたコードにしたいと奮起して導入まではしたのですが、厄介な問題がありました。

インデントがタブだった。

↑のせいで、rules=PSR2とかってやると、ほぼほぼ全部のコードが修正入れられてしまい、レビューが死んでしまいます。

なんとかPSR2を守らせつつ、インデントはタブでやりたい!

と思い、csfixerのコードをおってると、なんのことはない以下が、そうでした。

setIndent("\t")

楽勝でしたねw

せっかくなんで、簡単に作った設定ファイルを貼っておきます。

<?php

return PhpCsFixer\Config::create()
    ->setRiskyAllowed(true)
    ->setIndent("\t")
    ->setRules([
        '@PSR2'                    => true,
        'array_syntax'             => ['syntax' => 'short'],
        'blank_line_before_return' => true,
        'function_typehint_space'  => true,
        'method_separation'        => true,
        'binary_operator_spaces'   => [
            'align_double_arrow' => true,
            'align_equals'       => true
        ],
    ])
    ->setFinder(PhpCsFixer\Finder::create()
        ->exclude('vendor')
        ->in(__DIR__)
    );

おまけ

みなさんいつcs-fixer流していますか?

自分はコチラの記事を参考にさせてもらい、pre-commitで実行するようにしていますが、これだと個人個人実装する必要あるので、ちょっと面倒だなと思いました。

cs-fixer掛けるとかけた後でcommitを分けられるのはいいんですけどね。

自分はcomposerのscriptに以下の様に書いて、都度実行しています。

    "scripts": {
        "dry-fix": [
            "target_file_list=$(git status -uno --short | grep -E '^ [AUM].*.php$' | cut -c4-); for php_file in $target_file_list; do php-cs-fixer fix --dry-run --diff --config=.php_cs.dist $php_file; done"
        ],
        "fix": [
            "target_file_list=$(git status -uno --short | grep -E '^ [AUM].*.php$' | cut -c4-); for php_file in $target_file_list; do php-cs-fixer fix --config=.php_cs.dist $php_file; done"
        ]
    }

git statusで表示されるphpファイルだけをcs-fixerかけるという感じです。

毎回実行していますが、composer installすればみんな一緒に使えるのでそれで良いかなと。

今回は小ネタでしたが、こんな感じです。