こんにちは。型システムは静的型付け派です。
やりたいこと
Phan静的解析がもたらす大PHP型検査時代を見て、どんな結果を得られるのかを試してみました。
実行環境は
Phanの動作にはPHP 7.0が必要で、php-astも要求されます。また、検査対象のアプリケーションが拡張モジュールに依存する場合は、それもインストールしておいた方が無難です。
と言うことなので、扱いやすいようにDockerで作りました。今回は拡張モジュールは導入ません。利用するコンテナは一つですが、dockerコマンドの実行時のオプションを忘れてしまうので、docker-composeを利用します。
今回の環境
- Docker
- Docker on Mac 1.12.1
- コンテナのOS
- CensOS7
- php
- 7.0.13-1.el7.remi.x86_64
- php-ast
- v0.1.2
- Phan
- 0.6
Dockerfile
コンテナは扱い慣れた CentOS7をベースにします。PHP7が必要なので ソースからのコンパイルもアリなのですが、今回は Remiを利用します。
from centos:7
ENV PHAN_VERSION=0.6
# needs php7
RUN yum install -y epel-release wget;
# needs php-ast
RUN yum install -y git ;\
yum groupinstall -y "Development Tools" ;
# git clone php-ast
RUN cd /usr/local/src ;\
git clone https://github.com/nikic/php-ast.git
# install php7 from remi repositroy
RUN rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm ; \
rpm -ivh ./remi-release-7.rpm ; \
yum install -y --enablerepo=epel,remi,remi-php70 php70 php-devel php70-php-pdo ; \
sed -i '/^# vim:ts=4:sw=4$/i\source \/opt\/remi\/php70\/enable' /etc/bashrc
# install php-ast
RUN cd /usr/local/src ;\
cd php-ast ;\
phpize ;\
./configure ;\
make ; \
make install ; \
echo 'extension="/usr/lib64/php/modules/ast.so"' > /etc/opt/remi/php70/php.d/20-ast.ini
# install Phan
RUN mkdir -p /usr/local/phan/bin; \
wget https://github.com/etsy/phan/releases/download/${PHAN_VERSION}/phan.phar -O /usr/local/phan/bin/phan.phar
Dockerfileでは行っていることです。
1. yumでファイルの取得に必要なwgetとgitと php-astをコンパイルするために"Development Tools"をインストールします。
3. RemiからPHPをインストールします。
4. /etc/bashrc
で/opt/remi/php70/enable
を読み込むことで、コンテナ内でbashを利用した時にphpコマンドにパスが通っている状態にします。
5. php70-php-pdo
はPhanがSQLite3を使っているためです。
6. php-ast をコンパイルして、モジュールを有効にします。
7. Phanをphar形式でダウンロードし、作成したディレクトリ /usr/local/phan/bin
に置いておきます。
docker-compose
version: '2'
services:
php7:
build: php7
volumes:
- /path/to/myproduct:/code
working_dir: /code
command: /opt/remi/php70/root/usr/bin/php /usr/local/phan/bin/phan.phar --progress-bar -ophan.log
volumesオプション
実行時にはDockerのホストディレクトリにあるソースファイルをコンテナがマウントして、検査を実行します。
commandオプション
Phanが実行していることが分かるように --progress-bar
オプションを指定し、実行結果は-ophan.log
でphan.log
ファイルに残します。ログファイルが作成されるディレクトリはコンテナ内であれば/code
ディレクトリに、マウント元のホストであれば/path/to/myproduct
になります。
.phan/config.php
今回はlib
ディレクトリだけを検索する、最低限の内容だけ作成しました。ファイルはホストの/path/to/myproduct/.phan/config.php
に保存します。
<?php
return [
'directory_list' => [
'lib/',
],
"exclude_analysis_directory_list" => [
],
];
実行方法
docker-compose up
で実行します。
感想
小さいソースで試したところ、PHPDocの書き方でエラーになると予想した箇所がエラーにはならなかったので、検査内容を理解していく所からになりました。
言い訳になりますが、今回は様子見で試しただけです。本当に。