composer-bin-pluginが便利だったので触ってみました
composer-bin-plugin を触ってみた話ୈ137ճ PHPษڧձˏ౦ژHideki Kinjyotwitter: @o0h_ / github: o0h
View Slide
ࣗݾհ• ίωώτגࣜձࣾ• αʔόʔαΠυΤϯδχΞ• ओʹCakePHPͳͲ
(本題に⼊る前に)お約束
OyakusokuphperkaigiのLTでは ドラを鳴らしてしまったので、 今⽇は時間を守るぞ!! (ご迷惑をおかけしました)
今⽇のお話
composer-bin-plugin
おしながき- [ ] みなさんComposer使っていますか- [ ] Composerを使っていて、 こんな「困った!」ありませんか- [ ] composer-bin-pluginが そんな悩みを解決してくれるかもしれません
§1 みなさんComposer使っていますか
この中で、 Composer使っているよ〜 という⽅は どのくらいいますか?
\は〜い/
たくさん いらっしゃいますね〜
- [x]みなさんComposer使っていますか〜FIN〜
§2 Composerを使っていて、 こんな「困った!」ありませんか
⾒覚えありませんか
依存パッケージの ver.のコンフリクト⾟い
composer利⽤時に (稀に)困るやつ• (⼤体において) semantic versioningに則り “緩め”に指定されているので、 利⽤可能なバージョンが決定できるのだけど• たま〜にぶつかったりしますよね
vendorBBBYZ[d͍ͩ͘͞BBBYZ[?͍ͩ͘͞つまり・・?package-a͑ʔɺࠔΔʙკpackage-b
vendorBBBYZ[d͍ͩ͘͞BBBYZ[?͍ͩ͘͞つまり・・?package-a͑ʔɺࠔΔʙკpackage-b名前解決可能な形に ファイルを配置・共存できない
vendorBBBYZ[d͍ͩ͘͞BBBYZ[?͍ͩ͘͞つまり・・?package-a͑ʔɺࠔΔʙკpackage-bcomposerがタジタジしちゃう!
せめて・・・• (アプリケーション本体から利⽤されない) CLI利⽤想定のツールについては• php-cs-fixerとか rectorとか• もっとストレスフリーに利⽤したい・・!
という時に、 composer-bin-plugin
- [x]Composerを使っていて、 こんな「困った!」ありませんか〜FIN〜
§3 composer-bin-pluginが そんな悩みを解決してくれるかもしれません
composer-bin-plugin•• `vendor`ディレクトリを 複数扱えるようにしてくれるユーティリティ• virtualenv的な• 例えば「phpcs⽤のvendor」「phpmd⽤のvendor」などが組める
vendor0,ʂvendorBBBYZ[d͍ͩ͘͞つまり・・?BBBYZ[?͍ͩ͘͞package-bpackage-avendor0,BBBYZ[͍ͩ͘͞package-c0,ʂ
vendor0,ʂvendorBBBYZ[d͍ͩ͘͞つまり・・?0,ʂBBBYZ[?͍ͩ͘͞package-bpackage-avendor0,BBBYZ[͍ͩ͘͞package-c⽤途ごとに 「vendor dir」「composer.lock」を 掘ってしまえ、という発想
使い⽅• Install (global)• composer global require bamarni/composer-bin-plugin• Install (in-project)• composer require --dev bamarni/composer-bin-plugin
使い⽅• Usage• `Composer [global] bin $任意の名前空間名command `• composer global bin cs require friendsofphp/php-cs-fixer rector/rector
使い⽅• Usage• `Composer [global] bin $任意の名前空間名command `• composer global bin cs require friendsofphp/php-cs-fixer rector/rector• これで「cs」という隔離された名前空間に php-cs-fixerとrectorが設置される
実際の様⼦~/.composer $ tree -L 2 vendor-binvendor-bin└── cs├── composer.json├── composer.lock└── vendor• `vendor-bin` の下に `cs` ディレクトリが掘られている
実際の様⼦$ tree -L 2 vendor-binvendor-bin├── cs│ ├── composer.json│ ├── composer.lock│ └── vendor└── metrics├── composer.json├── composer.lock└── vendor• 別に`metrics` 空間を掘ってみると・・?• composer global bin metrics require phpmetrics/phpmetrics
実際の様⼦• 実⾏ファイルは(defaultだと) vendorディレクトリ下にsymlinkが貼られる =「いつもみたいな感じ☆」で使える!!$ ls vendor/binpdepend php-parse phpcs phpmetrics psyshphp-cs-fixer phpcbf phpmd phpstan rector
こんなとこも 気が利いていました• 特殊な名前 `all` => vendor-binに⼊っているものを⼀括操作• composer bin all install• composer bin all update• `bin/` 下のsymlinkが衝突したら ⾃動で作成を省略してくれるみたい
どうやって動いているの?• https://github.com/bamarni/composer-bin-plugin/blob/v1.3.0/src/BinCommand.php#L104をざっくり⾒た感じだと• 名前空間に対応したディレクトリに移動して• 「普通にComposer.json(lock)を読みとる(`Factory ::getComposerFile()`)」ように振る舞う
- [x]composer-bin-pluginが そんな悩みを解決してくれるかもしれません〜FIN〜
まとめ!• あくまで`bin-plugin`なので、 局所的な⽤途想定になるかなーという所感 (vendorにおくもの、vendor-binに置くものを分ける)• 逆に⾔うと 「アプリケーションコード」が「CLI⽤のコマンド」の依存に 煩わされなくなる・・!• 初めて知った時の「便利そう!!」と 中⾝を⾒た時の「単純!!!」というギャップが⾯⽩かった
͓͖߹͍͍͖ͨͩ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ
参考リンク• Packagist https://packagist.org/packages/bamarni/composer-bin-plugin• 私が知ったキッカケの記事 https://www.dereuromark.de/2018/03/14/cakephp-3-6-is-coming/