LoginSignup
7
5

More than 5 years have passed since last update.

Phanの実行環境をDockerで作ってみた

Last updated at Posted at 2016-11-22

こんにちは。型システムは静的型付け派です。

やりたいこと

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を利用します。

php7/Dockerfile

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

docker-compose.yml
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.logphan.logファイルに残します。ログファイルが作成されるディレクトリはコンテナ内であれば/codeディレクトリに、マウント元のホストであれば/path/to/myproductになります。

.phan/config.php

今回はlibディレクトリだけを検索する、最低限の内容だけ作成しました。ファイルはホストの/path/to/myproduct/.phan/config.phpに保存します。

config.php
<?php
return [
    'directory_list' => [
        'lib/',
    ],
    "exclude_analysis_directory_list" => [
    ],
];

実行方法

docker-compose upで実行します。

感想

小さいソースで試したところ、PHPDocの書き方でエラーになると予想した箇所がエラーにはならなかったので、検査内容を理解していく所からになりました。

言い訳になりますが、今回は様子見で試しただけです。本当に。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5