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

PDF
コード品質を保つために心がけたいこと
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
PPTX
Keycloakの実際・翻訳プロジェクト紹介
PDF
Linux女子部 systemd徹底入門
PDF
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
PDF
AWSでDockerを扱うためのベストプラクティス
PPTX
イベント駆動プログラミングとI/O多重化
コード品質を保つために心がけたいこと
Dockerfileを改善するためのBest Practice 2019年版
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
Keycloakの実際・翻訳プロジェクト紹介
Linux女子部 systemd徹底入門
Docker道場「Dockerの基本概念」0825インフラ勉強会資料
AWSでDockerを扱うためのベストプラクティス
イベント駆動プログラミングとI/O多重化

What's hot (20)

PDF
忙しい人の5分で分かるDocker 2017年春Ver
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
マイクロサービスバックエンドAPIのためのRESTとgRPC
PDF
Mavenの真実とウソ
PPTX
脱RESTful API設計の提案
PPTX
Redis勉強会資料(2015/06 update)
PDF
今だからこそ知りたい Docker Compose/Swarm 入門
PDF
クラウド環境下におけるAPIリトライ設計
PPTX
initとプロセス再起動
PPTX
Docker Tokyo
PDF
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
PDF
AWSのログ管理ベストプラクティス
PDF
Dockerを支える技術
PPTX
Docker friendly PHP / Laravel
PDF
マイクロにしすぎた結果がこれだよ!
PDF
CyberAgentのインフラについて メディア事業編 #catechchallenge
PDF
ELFの動的リンク
PDF
ストリーム処理を支えるキューイングシステムの選び方
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PDF
DockerとPodmanの比較
忙しい人の5分で分かるDocker 2017年春Ver
コンテナ未経験新人が学ぶコンテナ技術入門
マイクロサービスバックエンドAPIのためのRESTとgRPC
Mavenの真実とウソ
脱RESTful API設計の提案
Redis勉強会資料(2015/06 update)
今だからこそ知りたい Docker Compose/Swarm 入門
クラウド環境下におけるAPIリトライ設計
initとプロセス再起動
Docker Tokyo
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
AWSのログ管理ベストプラクティス
Dockerを支える技術
Docker friendly PHP / Laravel
マイクロにしすぎた結果がこれだよ!
CyberAgentのインフラについて メディア事業編 #catechchallenge
ELFの動的リンク
ストリーム処理を支えるキューイングシステムの選び方
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
DockerとPodmanの比較
Ad

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