SlideShare a Scribd company logo
1 of 14
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

「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
Yoshifumi Kawai
 

What's hot (20)

実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
PHPの今とこれから2022
PHPの今とこれから2022PHPの今とこれから2022
PHPの今とこれから2022
 
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介 【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
【BS3】Visual Studio 2022 と .NET 6 での Windows アプリ開発技術の紹介
 
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
 
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する継承やめろマジやめろ。 なぜイケないのか 解説する
継承やめろマジやめろ。 なぜイケないのか 解説する
 
Jenkinsfileのlintで救える命がある
Jenkinsfileのlintで救える命があるJenkinsfileのlintで救える命がある
Jenkinsfileのlintで救える命がある
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
Jenkinsの構成・運用パターン
Jenkinsの構成・運用パターンJenkinsの構成・運用パターン
Jenkinsの構成・運用パターン
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
未来(あす)Xamlの1msに泣かないために
未来(あす)Xamlの1msに泣かないために未来(あす)Xamlの1msに泣かないために
未来(あす)Xamlの1msに泣かないために
 

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

Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
Shogo Kawahara
 
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 excite
yuki777
 
3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes3分間 開発環境クッキング 2012.07 #pyfes
3分間 開発環境クッキング 2012.07 #pyfes
Takeshi Komiya
 

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 / ツールの依存管理から解放される