めんどくさくない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 con(cid:238)g -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

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