Skip to content

めんどくさくないPHP開発ツール導入

公開日:

東京都渋谷区GMO Yours フクラスで開催された『第148回 PHP勉強会@東京』でライトニングトーク(5分)として発表しました。

Download PDF

スライドテキスト

Page 1

めんどくさくない

PHP開発ツール導入

Avoid the hassle and install QA tools in your PHP project

pixiv Inc.

USAMI Kenta

2023-01-18 PHP勉強会@東京

Page 2

お前誰よ

  • うさみけんた (@tadsan) / Zonu.EXE / にゃんだーすわん
  • ピクシブ株式会社 pixiv事業本部 エンジニア
  • 最近はピクシブ百科事典(dic.pixiv.net)を開発しています
  • Emacs Lisper, PHPer
  • Emacs PHP Modeを開発しています (2017年-)

Page 3

さて

Page 4

あなたの会社ではPHPで書かれたツールを利用してますか?

Page 5

えっPHPってホームページを作る言語というかHTMLのテンプレートエンジンじゃないのそんな言語でツールて

Page 6

…ということを思ってるひともまだ居そう

Page 7

わかる

Page 8

が、現実には既にいっぱい使われている

Page 9

PHPのツールはPHPで書こうね

  • Composer … 依存マネージャー(パッケージ管理ツール)
  • PHPUnit … xUnitテスティングフレームワーク
  • PHP-CS-Fixer, PHP_CodeSniffer … コードフォーマッター
  • PHPStan, Psalm … 静的解析ツール (型チェッカー)
  • Deployer … アプリケーションデプロイツール
  • そのほかいろいろ!

Page 10

PHP vs tooling

  • PHPはWebサーバだけでなくコマンドラインで動く
  • PHPのためのCLIアプリケーションフレームワークがある
  • 最近はSymfony Consoleが主流だと思う
  • PHPで書かれたPHPパーサーがある
  • PHPで書けばPHPに詳しいPHPerが貢献できる
  • PHPで書けばライブラリとして相互運用もできる

Page 11

他言語 vs tooling

  • PhpStorm: Java (OSSではない)
  • Intephense: Node.js (npmにあるがOSSでない)
  • php-parser (OSS)
  • PHP Rust Tools (OSS)
  • NoVerify: Go (OSS)
  • VKCOM/php-parser

Page 12

どうやってツールをインストールするか

Page 13

Composer

  • 対象のプロジェクトと依存対象を並列な「パッケージ」として扱える
  • 単体ファイルのcomposerコマンド(composer.phar)として利用できる
  • インストール方法は https://getcomposer.org/doc/00-intro.md に書いてある
  • Windows向けにはインストーラー(Composer-Setup.exe)がある
  • 実行ファイル(bin)も管理でき、プロジェクトの vendor/bin/ に配置されて実行できる (Windowsでも動くように工夫されている!)

Page 14

composer global

  • プロジェクトに依存しないパッケージをインストールできる
  • 基本的にはシステムワイドではなく、 ユーザーごとにインストールされる
  • 場所は composer global config -l などで検索できる
  • インストール先をPATH環境変数に追加すると通常のコマンドとして使える
  • たとえば PATH=$HOME/.composer/vendor/bin:$PATH など

Page 15

Composerで管理する問題

Page 16

依存バージョンが衝突する!

Page 17

Page 18

Page 19

バージョン衝突問題

  • プロジェクト本体で使いたいパッケージとツールが要求するパッケージのバージョンを合わせないといけない
  • PHP-CS-FixerはPHP-ParserやSymfonyパッケージに依存しているので、全部のパッケージを最新に合わせ続けないと簡単に衝突する
  • いろんな事情で古いSymfonyコンポーネントに依存しているライブラリを使わざるを得ない事情があると詰む or バージョン上がらない

Page 20

\(^o^)/

Page 21

解決策はある

Page 22

Pharアーカイブ

  • 複数ファイルのPHPを一個のファイルに固めたもの
  • 普通のスクリプトとして実行できるようにできる
  • プロジェクトメンバー全員に使わせるにはどうすればいいか
  • ダウンロードスクリプトを作成して実行してもらう / ファイル自体をGit追加
  • PhiveというPharインストールツールもある
  • 手動でインストールしないといけないので細かいバージョンが揃わない問題

Page 23

composer bin-plugin

  • https://github.com/bamarni/composer-bin-plugin
  • プロジェクト自体とは隔離したディレクトリでcomposerの依存を管理する
  • プラグイン側でサブディレクトリにインストールしたツールとメインプロジェクト側の vendor/bin/ ディレクトリを同期してくれる
  • 通常の composer install とは別管理なのでちょっとめんどくさい

Page 24

これでいいのでは

Page 25

依存バージョンを合わせられない問題

Page 26

PHPStanの開発者曰く

Page 27

Page 28

PHPStanを入れるならcomposer require --devを使え

Page 29

どういうことか

Page 30

Page 31

依存が… ない…

(PHPのバージョン制約だけ)

Page 32

どういうことか

Page 33

Page 34

ここにコードはない

Page 35

Page 36

GitにPharファイルを直接コミット!?

Page 37

話は長くなるので

Page 38

Page 39

ComposerパッケージはPackagistで検索できる

Page 40

Page 41

Page 42

Page 43

shimとかpharとかdistで検索するとコンフリクトしないバージョンが公開されている(こともある)

Page 44

コンフリクトを避ける上では依存ライブラリの名前空間隔離という技術が不可欠

Page 45

みんなもコンフリクトフリーなツールを量産しよう