Edited at

【PHP】さくっとスタイル・フォーマットチェック

More than 1 year has passed since last update.


前置き

ルールが整っていない現場に入ったときに、

コードのスタイルやフォーマットなどで指摘を受けたくないので、

レビュー前に最低限のチェックができる環境を作りたい。

・・エディタに任せるのが一番だと思いますが。


概要

[1]Dockerコンテナにphing入れる

[2]対象ソースのディレクトリを共有にしてコンテナ起動

[3]中に入ってphing実行

※phpcsとphpmdをとりあえず入れていますが、目的に応じて追加したりしてください


実施


dockerいれる

【さらっとだけ覚えたい】Docker入門


ホストに必要なファイルを配置

以下をどこかに配置してください。

[1]Dockerfile

[2]composer.json

[3]build.xml(phing用)

[4]ruleset.xml(phpmd用)

phpcsはPSR2、phpmdのチェックルールに不満がなければ、

下記をコピペでおつかいいただけるかと。


Dockerfile

FROM centos:6.7

RUN yum update -y
RUN yum install -y yum-plugin-ovl

# Japanese Support
RUN yum -y groupinstall "Japanese Support"
RUN echo "LANG=\"ja_JP.UTF-8\"" > /etc/sysconfig/i18n
RUN source /etc/sysconfig/i18n

# ntp
RUN cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# php
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN yum install -y --enablerepo=remi php php-xml

# composer
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
RUN chmod 777 /usr/local/bin/composer

# create phing dir
RUN mkdir -p /phing/src
RUN mkdir -p /phing/phpmd

ADD ./composer.json /phing/composer.json

RUN cd /phing && composer install --dev

RUN ln -s /phing/vendor/phing/phing/bin/phing /usr/local/bin/phing
RUN ln -s /phing/vendor/squizlabs/php_codesniffer/scripts/phpcs /usr/local/bin/phpcs
RUN ln -s /phing/vendor/phpmd/phpmd/src/bin/phpmd /usr/local/bin/phpmd
RUN chmod 777 /usr/local/bin/phing
RUN chmod 777 /usr/local/bin/phpcs
RUN chmod 777 /usr/local/bin/phpmd

ADD ./build.xml /phing/build.xml
ADD ./ruleset.xml /phing/ruleset.xml



composer.json

{

"require-dev": {
"squizlabs/php_codesniffer": "2.*",
"phpmd/phpmd" : "@stable",
"phing/phing": "2.*"
}
}


build.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- buildタスクをデフォにしておく -->
<project name="phing" default="build">

<!-- ソース置き場などはプロパティとして使用する -->
<property name="myDir" value="/phing" />
<property name="targetDir" value="/phing/src/" />

<!-- buildタスク -->
<target name="build" depends="phpcs,phpmd" />

<!-- 静的解析ツールの設定 -->
<target name="phpcs">
<phpcodesniffer standard="PSR2" file="${targetDir}" allowedFileExtensions="php" />
</target>

<target name="phpmd">
<phpmd rulesets="ruleset.xml">
<fileset dir="${targetDir}">
<include name="**/*.php" />
</fileset>
<formatter type="html" outfile="${myDir}/phpmd/phpmd.html"/>
<formatter type="text" outfile="${myDir}/phpmd/phpmd.txt"/>
</phpmd>
</target>
</project>



ruleset.xml

<?xml version="1.0"?>

<ruleset name="My first PHPMD rule set"
xmlns="http://pmd.sf.net/ruleset/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
http://pmd.sf.net/ruleset_xml_schema.xsd"

xsi:noNamespaceSchemaLocation="
http://pmd.sf.net/ruleset_xml_schema.xsd"
>
<description>
My custom rule set that checks my code...
</description>

<rule ref="rulesets/cleancode.xml" />
<rule ref="rulesets/codesize.xml" />
<rule ref="rulesets/controversial.xml" />
<rule ref="rulesets/design.xml" />
<rule ref="rulesets/naming.xml" />
<rule ref="rulesets/unusedcode.xml" />
</ruleset>



コンテナ起動

docker build -t phing:latest .

docker run -itd --name phing --volume ソースのあるディレクトリ:/phing/src phing
docker exec -it phing /bin/bash


チェック

cd /phing

phing

※phpmdの結果は/phing/phpmd配下に吐くように設定してます


おまけ


静的解析ツールの単体実施


phing

phing タスク



phpcs

phpcs --standard=PSR2 src/



phpmd

phpmd [ファイル名|ディレクトリ] [レポートフォーマット(text or xml)] [ルール]


phpmdルール
説明

cleancode
汚いコードに指摘

codesize
メソッドやクラスの大きさに対して指摘

controversial
キャメルケースを勧める

design
ソフトウェアデザインに関連した指摘

naming
命名ルール

unusedcode
使われていないコードの指摘