SlideShare a Scribd company logo
Composer bin plugin
ツールの依存管理から解放される
Composer bin pluginとは?
• composerでインストール
するツールを独立して管
理するプラグイン
• 実行ファイルは引き続き
vendor/bin/に設置される
• php-5.5.9より利用可能
https://github.com/bamarni/composer-bin-plugin
依存関係競合とは
https://github.com/FriendsOfPHP/PHP-CS-Fixer https://github.com/spatie/phpunit-watcher
依存関係競合とは
1. phpunit-watcherをインストール
2. php-cs-fixerをインストール
インストール成功
1. php-cs-fixerをインストール
2. phpunit-watcherをインストール
インストール失敗
「spatie/phpunit-watcher version Xはyosymfony/resource-watcher version Yを必要と
している。 yosymfony/resource-watcher version Yはsymfony/finder version Zを必要と
している。しかしsymfony/finderは既にVersion Aがインストールされているため依存を
解決できずインストール失敗」
…と、全バージョンの組み合わせで書いてある。
解決方法
• エラーメッセージや既存パッケージの依存関係を調べる。
• インストールしようとしているパッケージと競合しない既存パッケージのバージョン
を特定する。
• 既存パッケージのバージョンを変更した後、目的のパッケージをインストール
※2022年6月時点の実行結果
依存関係競合とは
https://readouble.com/laravel/9.x/ja/upgrade.html#updating-dependencies
Laravel以外の箇所も書き換えなければ
ならない。
Laravelをアップグレードしたい。
対象はどれ?
具体的にどのバージョン?
依存関係競合とは
対象はどれ?
具体的にどのバージョン?
※あくまでサンプル
2022年6月時点ではこの組み合わせではエラーは発生しない
Vendor binaryとして配布されるツール
• 単独で動作するツールとして作られていることが多い。
• アプリケーション本体と同居させず独立して管理したい。
• 開発環境としてバージョン管理は行いたい。
従来の解決策
• グローバルインストール
composer global require awesome/tool
• ✕ バージョン管理不可(メンバー間のバージョン差異)
• ✕ Docker環境としての配布が困難
• △ 環境構築がひと手間増える
• 専用フォルダにローカルインストール
composer --working-dir=path/to/tool awesome/tool
※php-cs-fixerはこの方法を推奨している
• ○ バージョン管理可能
• ○ Docker環境としての配布が可能
• △ 環境構築がひと手間増える
• △ 標準外フォルダよりツール起動(プロジェクト固有知識)
Composer bin plugin
• ○ 本体とツールとを分離して管理
• ○ バージョン管理可能
• ○ Docker環境としての配布が可能
• ○ 環境構築の手間は変わらない
• ○ 標準フォルダよりツール起動可能
インストール・使い方
• プラグインをrequire-devとしてインストール
• 「名前」を指定してパッケージをインストールできる。
• 「bdd」という名前でphpspecをインストール
• 「etsy-phan」という名前でphanをインストール
• 「phpmetrics」という名前でphpmetricsをインストール
どのように動作するのか?
独立して管理
独立してインストール
ツールの起動は従来のパスより可能
(vendor/binにリンクが配置される)
• ○ 本体とツールとを分離して管理
• ○ バージョン管理可能
• ○ Docker環境としての配布が可能
• ○ 環境構築の手間は変わらない
• ○ 標準フォルダよりツール起動可能
git管理
配下のvendorは
git管理除外
composer.jsonは
ツール毎にgit管理
Composer bin plugin管理
※インストール時に自動設定される
.gitignore追記
• ○ 本体とツールとを分離して管理
• ○ バージョン管理可能
• ○ Docker環境としての配布が可能
• ○ 環境構築の手間は変わらない
• ○ 標準フォルダよりツール起動可能
管理の自動化
https://getcomposer.org/doc/articles/scripts.md#command-events
参考:Composer Scripts / Command Events
pre-XXX-cmd / post-XXX-cmd
• composer XXXが実行された前や後に指定コマンドを実行
• composer.jsonのscriptプロパティで設定
• composer installが実行されたら
composer bin all installも自動的に実行
• composer updateが実行されたら
composer bin all updateも自動的に実行
• 上の2つの設定のショートハンド
• ○ 本体とツールとを分離して管理
• ○ バージョン管理可能
• ○ Docker環境としての配布が可能
• ○ 環境構築の手間は変わらない
• ○ 標準フォルダよりツール起動可能
まとめ
課題
1. Composerは依存関係の競合が発生することがある。
2. 単体で動作するツールは独立して管理すべき。
3. Composer標準の方法にはデメリットある。
解決
• Composer bin pluginの導入
• 依存関係の競合は発生しない
• ツールの起動は従来と変わらない
• 環境構築は自動化可能
• 利用者はプラグインの存在を意識しなくて良い
参考資料
• このPHPがテンプレートエンジンのくせに慎重すぎる
(前篇) / @tadsan
• Composer bin plugin — Isolate your bin dependencies
• Vendor binaries and the vendor/bin directory -
Composer
• Scripts - Composer

More Related Content

What's hot

インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
Shohei Koyama
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
Soudai Sone
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Masahito Zembutsu
 
なぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのかなぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのか
Yoichi Toyota
 
決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話
Ryosuke Uchitate
 
脱RESTful API設計の提案
脱RESTful API設計の提案脱RESTful API設計の提案
脱RESTful API設計の提案
樽八 仲川
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
Yoshinori Nakanishi
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
Yoshitaka Kawashima
 
A5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えしますA5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えします
ester41
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
Yasuharu Nakano
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
Daisuke Morishita
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
健人 井関
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
 
Docker friendly PHP / Laravel
Docker friendlyPHP / LaravelDocker friendlyPHP / Laravel
Docker friendly PHP / Laravel
Kentarou Takeda
 

What's hot (20)

インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
なぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのかなぜ人は必死でjQueryを捨てようとしているのか
なぜ人は必死でjQueryを捨てようとしているのか
 
決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話決済サービスのSpring Bootのバージョンを2系に上げた話
決済サービスのSpring Bootのバージョンを2系に上げた話
 
脱RESTful API設計の提案
脱RESTful API設計の提案脱RESTful API設計の提案
脱RESTful API設計の提案
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界あなたの知らないPostgreSQL監視の世界
あなたの知らないPostgreSQL監視の世界
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?ソフトウェアにおける 複雑さとは何なのか?
ソフトウェアにおける 複雑さとは何なのか?
 
A5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えしますA5 SQL Mk-2の便利な機能をお教えします
A5 SQL Mk-2の便利な機能をお教えします
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
Docker friendly PHP / Laravel
Docker friendlyPHP / LaravelDocker friendlyPHP / Laravel
Docker friendly PHP / Laravel
 

Similar to Composer bin plugin / ツールの依存管理から解放される

Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Shogo Kawahara
 
Firefox os hackathon
Firefox os hackathonFirefox os hackathon
Firefox os hackathon
dynamis
 
PHPのライブラリをcomposer経由で公開した話
PHPのライブラリをcomposer経由で公開した話PHPのライブラリをcomposer経由で公開した話
PHPのライブラリをcomposer経由で公開した話
mirai_iro
 
BOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud FoundryBOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud Foundry
i_yudai
 
Secret of Firefox
Secret of FirefoxSecret of Firefox
Secret of Firefox
dynamis
 
Cloud Foundry Cli Plugin入門
Cloud Foundry Cli Plugin入門Cloud Foundry Cli Plugin入門
Cloud Foundry Cli Plugin入門
Takeshi Morikawa
 
Addon sdkはじめの一歩
Addon sdkはじめの一歩Addon sdkはじめの一歩
Addon sdkはじめの一歩EnsekiTT
 
20090415 すばらしきSymfonyの世界へようこそ
20090415 すばらしきSymfonyの世界へようこそ20090415 すばらしきSymfonyの世界へようこそ
20090415 すばらしきSymfonyの世界へようこそHiromu Shioya
 
Phpunit at excite
Phpunit at excitePhpunit at excite
Phpunit at exciteyuki777
 
Autopagerize on Firefox and Google Chrome
Autopagerize on Firefox and Google ChromeAutopagerize on Firefox and Google Chrome
Autopagerize on Firefox and Google Chrome
swdyh
 
Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門
leverages_event
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
KLab株式会社
 
FX.php最新情報 2013
FX.php最新情報 2013FX.php最新情報 2013
FX.php最新情報 2013
Atsushi Matsuo
 
3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfesTakeshi Komiya
 
Arduino を PHP で制御する
Arduino を PHP で制御するArduino を PHP で制御する
Arduino を PHP で制御する
Kenichi Ahagon
 
Windows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみたWindows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみた
Takashi Kanai
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
y-uti
 

Similar to Composer bin plugin / ツールの依存管理から解放される (20)

Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
 
Composer
 Composer Composer
Composer
 
Firefox os hackathon
Firefox os hackathonFirefox os hackathon
Firefox os hackathon
 
Xhprof
XhprofXhprof
Xhprof
 
PHPのライブラリをcomposer経由で公開した話
PHPのライブラリをcomposer経由で公開した話PHPのライブラリをcomposer経由で公開した話
PHPのライブラリをcomposer経由で公開した話
 
Fab
FabFab
Fab
 
BOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud FoundryBOSH-lite で 1VM Cloud Foundry
BOSH-lite で 1VM Cloud Foundry
 
Secret of Firefox
Secret of FirefoxSecret of Firefox
Secret of Firefox
 
Cloud Foundry Cli Plugin入門
Cloud Foundry Cli Plugin入門Cloud Foundry Cli Plugin入門
Cloud Foundry Cli Plugin入門
 
Addon sdkはじめの一歩
Addon sdkはじめの一歩Addon sdkはじめの一歩
Addon sdkはじめの一歩
 
20090415 すばらしきSymfonyの世界へようこそ
20090415 すばらしきSymfonyの世界へようこそ20090415 すばらしきSymfonyの世界へようこそ
20090415 すばらしきSymfonyの世界へようこそ
 
Phpunit at excite
Phpunit at excitePhpunit at excite
Phpunit at excite
 
Autopagerize on Firefox and Google Chrome
Autopagerize on Firefox and Google ChromeAutopagerize on Firefox and Google Chrome
Autopagerize on Firefox and Google Chrome
 
Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門Behatで行う、E2Eテスト入門
Behatで行う、E2Eテスト入門
 
LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!LL言語でもHudsonを使おう!
LL言語でもHudsonを使おう!
 
FX.php最新情報 2013
FX.php最新情報 2013FX.php最新情報 2013
FX.php最新情報 2013
 
3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes
 
Arduino を PHP で制御する
Arduino を PHP で制御するArduino を PHP で制御する
Arduino を PHP で制御する
 
Windows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみたWindows Server 2016でコンテナを動かしてみた
Windows Server 2016でコンテナを動かしてみた
 
anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件anyenv + phpenv + php-build が便利すぎる件
anyenv + phpenv + php-build が便利すぎる件
 

Composer bin plugin / ツールの依存管理から解放される