# Composer コマンドとオプション
Composer は、2013 年 7 月 3 日に 1.0.0-alpha1 バージョンリリースして以来、絶大の人気を誇る PHP ライブラリの依存関係を管理するパッケージ管理システムです。今どき Composer 使わない PHP 開発ってもうないよね。複数環境で開発や、ライブラリのバージョン管理に非常に便利で、今時の PHP フレームワークって Composer からインストールすることも珍しくありません。IBM デベロッパーからも「一新された PHP」「強力なオープンソース・ツールを使って PHP プロジェクトをサード・パーティー・ライブラリーからアセンブルする」と高く評価しております。今更感ありますが、Composer についてメモりました。
2020 年 10 月 24 日に Composer 2.0 がリリースされました!
今回のリリースは新機能の追加とパフォーマンス向上など今までとは違う体験ができる一新バージョンです。
composer v1 ではダウンロードが遅いという問題は解決し、v2 では curl 最適化と並行ダウンロードすることで、ダウンロード速度を大幅に改善、自分が体感した v2 ダウンロード速度は v1 の倍以上でした。
また、内部ロジック更新することで、速度とメモリ両方の大幅改善が実現できたそうです。Github に詳しいリリースログ (opens new window)確認できます。
Composer 2.0 の主な改善点
- パフォーマンス向上: ダウンロード速度が 2 倍以上に向上
- メモリ使用量の削減: 内部ロジックの最適化によりメモリ使用量を削減
- 並行ダウンロード: 複数のパッケージを並行してダウンロード
- プラグインシステムの改善: より柔軟なプラグインシステム
# PHP バージョン要件
| Composer バージョン | PHP 要件 | 備考 |
|---|---|---|
| 2.0 - 2.1 | PHP 5.3.2+ | PHP 5.3 は v2.1 までサポート |
| 2.2 LTS | PHP 7.2.5+ | LTS バージョン |
| 2.3+ | PHP 7.2.5+ | |
| 2.7+ | PHP 7.2.5+ | 最新の安定版 |
Composer 2.2 以降の変更
Composer 2.2 から PHP 7.1.3 より古いすべてのサポートが終了しました。PHP 7.2.5 以上が必要です。
2.0 リリースは、28 人からの 1100 以上のコミット、150 以上の GitHub の問題とプルリクエスト、さらにそれをテストし、PR をレビューで約 2 年の時間費やしました開発チームに感謝します。 🎉
PHP 開発者の皆さんに是非 Composer 2.0 以降にアップしてその素晴らしさを体験してほしい。
# Composer install と update の違い
# composer install
composer install は composer.lock に指定された依存関係パッケージをインストールするだけです。
composer.lock が存在する場合、そのファイルに記載されているバージョンを厳密にインストールします。
composer install
特徴:
composer.lockが存在する場合、そのバージョンを厳密にインストールcomposer.lockが存在しない場合、composer.jsonから依存関係を解決してインストール後、composer.lockを作成composer.lockは更新されない
# composer update
composer update は composer.json に指定された依存関係パッケージを環境 PHP バージョンに合わせてアップデートします。
"laravel/framework": "^11.0" で指定した場合は、環境 PHP バージョンが対応している Laravel の最新バージョンを取得します。
composer update
# 特定のパッケージのみ更新
composer update vendor/package
特徴:
composer.jsonのバージョン制約に基づいて最新バージョンを取得composer.lockを更新する- 依存関係も含めて更新される
# install と update を使うタイミング
| コマンド | 使用タイミング | 用途 |
|---|---|---|
composer install | 本番環境へのデプロイ時 | composer.lock に固定されたバージョンをインストール |
composer install | チーム開発で環境を統一する時 | 全員が同じバージョンを使用 |
composer update | 開発中に依存関係を更新したい時 | 最新バージョンに更新 |
composer update | 異なる PHP バージョンで動作確認する時 | 環境に合わせたバージョンを取得 |
ベストプラクティス
- 本番環境:
composer install --no-dev --optimize-autoloaderを使用 - 開発環境:
composer installまたはcomposer updateを使用 - CI/CD:
composer install --no-dev --optimize-autoloaderを使用
注意事項
違う PHP バージョンの環境でソース実装する場合は、composer update を実行して動作確認することを推奨します。ローカル環境で開発して問題なかったプログラムを本番サーバーにアップすると動かないことがあります。composer update を実行することで、環境に合わない依存関係を早期に発見できます。
# Composer 設定で PHP バージョン固定
環境によって PHP バージョンが違うけど、インストールして使うライブラリは統一しないと行けないので、composer.json の config 設定すれば OK です。
{
"config": {
"platform": {
"php": "8.2"
}
}
}
複数の拡張機能も指定可能:
{
"config": {
"platform": {
"php": "8.2",
"ext-pdo": "1.0",
"ext-mbstring": "8.2"
}
}
}
プラットフォーム設定の用途
- 異なる PHP バージョンの環境で同じ依存関係を使用したい場合
- CI/CD 環境で特定の PHP バージョンでテストしたい場合
- 開発環境と本番環境の PHP バージョンが異なる場合
# 設定ファイル
| ファイル | 説明 |
|---|---|
composer.json | パッケージ管理の設定ファイル。依存関係やメタデータを定義 |
composer.lock | 現在インストールされているパッケージの正確なバージョンが記録されたファイル。このファイルをコミットすることで、全員が同じバージョンを使用できる |
# init 初期設定
composer.json を手動で作成するコマンド
composer init
オプション:
--nameパッケージ名(例:vendor/package-name)--description説明--author作者(例:"Name <email@example.com>")--typeタイプ(例:library,project,metapackage)--homepageホームページ URL--require依存パッケージ(例:"php": "^8.0")--require-dev開発時の依存パッケージ--stability (-s)最小安定性(stable,RC,beta,alpha,dev)--license (-l)ライセンス(例:MIT,Apache-2.0)--repositoryカスタムリポジトリ URL
# パッケージインストール install / i
install コマンドは、composer.lock がある場合、composer.lock 読み取り、インストールします。
composer.lock がない場合、composer.json から読み取り、依存関係解決、ベンダーにインストール後に composer.lock を作成します。
# install
composer install
options
--prefer-source最新開発版のソース版パッケージライブラリ使う--prefer-dist--prefer-source の逆、安定版取得--dry-run実際にインストールせずに、インストールのシミュレートして結果表示--devrequire-dev に指定したパッケージをインストール(デフォルト)--no-devrequire-dev に指定したパッケージをインストールをスキップ--no-autoloaderautoloader の生成をスキップ--no-scriptscomposer.json に指定した script の実行をスキップ--no-progressインストールの進行状況表示しない--no-suggest推奨パッケージを出力しない--optimize-autoloader(-o)PSR-0 / 4 オートローディングをクラスマップに変換して、オートローダーを高速化。本番環境での使用をお勧めしますが、実行に時間がかかるため、デフォルトでは実行しない--classmap-authoritative(-a)クラスマップからのみ自動ロード。 --optimize-autoloader を暗黙的に有効--apcu-autoloaderAPCu を使用して、found / not-found クラスをキャッシュ--ignore-platform-reqsphp、hhvm、lib-*、ext- *の要件を無視し、ローカルマシンがこれらを満たさない場合でも強制的にインストール。
パッケージをダウンロードには、source(最新開発) と dist(安定版) の 2 つの方法があります。デフォルトは dist
パッケージ更新 update / u
依存関係解決してパッケージを更新可能な最新バージョンにアップデートし、composer.lock 更新します。
composer.lock 更新可能なコマンドは composer update のみ
# update
composer update
options
--prefer-source--prefer-dist--dry-run--dev--no-dev--lock--no-autoloader--no-scripts--no-progress--no-suggest--with-dependencies--with-all-dependencies--optimize-autoloader (-o)--classmap-authoritative (-a)--apcu-autoloader--ignore-platform-reqs--prefer-stable--prefer-lowest--interactive--root-reqs
パッケージ削除 remove
# remove
composer remove
options
--dev--no-progress--no-update--no-scripts--update-no-dev--update-with-dependencies--ignore-platform-reqs--optimize-autoloader (-o)--classmap-authoritative (-a)--apcu-autoloader
パッケージ追加 require
# add package
composer require twig/twig
options
--dev--prefer-source--prefer-dist--no-progress--no-suggest--no-update--no-scripts--update-no-dev--update-with-dependencies--update-with-all-dependencies--ignore-platform-reqs--prefer-stable--prefer-lowest--sort-packages--optimize-autoloader (-o)--classmap-authoritative (-a)--apcu-autoloader
dump-autoload
composer.json に autoload の項目を追加した場合はこのコマンドを使ってオートローダを刷新
composer dump-autoload
options
--no-scriptscomposer.json で定義したスクリプトの実行をスキップ--optimize (-o)PSR-0 / 4 オートローディングをクラスマップに変換して、オートローダーを高速化します。 デフォルトでは実行されていないが、実稼働環境での使用をお勧め--classmap-authoritative (-a)クラスマップからのみクラスを自動ロードします。--optimizeを暗黙的に有効にします。--apcuAPCu を使用して、found / not-found クラスをキャッシュします。--no-devautoload-dev ルールを無効
clear-cache
キャッシュクリア clear-cache / clearcache / cc 同じ
composer clear-cache
composer clearcache
composer cc
options
--format出力のフォーマット:text || json(デフォルト: text)no-dev出力から dev 依存関係を削除
run-script
設定した script を手動で実行
composer run-script
options
--timeoutスクリプトのタイムアウト秒設定 タイムアウトなしは 0--dev開発モード--no-dev開発モード無効--list(-l)ユーザー定義のスクリプトをリスト
global
グローバルパッケージを管理するためのコマンド
install update remove require などで使える
# global install
composer global require laravel/installer
# グローバルインストールしたlaravelコマンドを使う
laravel new blog
# self-update (selfupdate)
ライブラリではなく、composer 自身をアップデートしたい時、このコマンド自分アップデート。
composer self-update
composer selfupdate
options
--rollback(-r)インストールした最後のバージョンへのロールバック--clean-backups古いバックアップを削除--no-progressダウンロードの進行状況を出力しない--update-keysキーの更新を要求--stable強制更新--previewプレビューチャネルを強制更新--snapshotスナップショットチャネルを強制更新
diagnose
もしかしたら composer の問題では?と思ったらこのコマンドを実行。composer の一般的な問題は自動チェックしてくれます。
composer diagnose
# show
インストールされているパッケージの情報を表示します。
# すべてのパッケージを表示
composer show
# 特定のパッケージの情報を表示
composer show vendor/package
# 最新バージョンを確認
composer show vendor/package --latest
# 依存関係を表示
composer show vendor/package --tree
オプション:
--allすべてのパッケージを表示(依存関係を含む)--latest最新バージョンを表示--outdated更新可能なパッケージのみ表示--tree依存関係ツリーを表示--pathパッケージのパスを表示
# search
検索コマンドは composer.json にある現在プロジェクトのパッケージリポジトリと Packagist を検索します。
composer search twig
オプション:
--only-nameパッケージ名のみで検索--only-vendorベンダー名のみで検索
composer.json ファイル設定のスチーム一覧
composer.json 編集する際の設定可能スチーム一覧
- name
- description
- version
- type
- keywords
- homepage
- readme
- time
- license
- authors
- support
- Package links
- require
- require-dev (root-only)
- conflict
- replace
- provide
- suggest
- autoload
- PSR-4
- PSR-0
- Classmap
- Files
- Exclude files from classmaps
- Optimizing the autoloader
- autoload-dev (root-only)
- include-path
- target-dir
- minimum-stability (root-only)
- prefer-stable (root-only)
- repositories (root-only)
- config (root-only)
- scripts (root-only)
- extra
- bin
- archive
- abandoned
- non-feature-branches
参考:composer.json Schema (opens new window)
config 設定プロパティ一覧
- process-timeout
- use-include-path
- preferred-install
- store-auths
- github-protocols
- github-oauth
- gitlab-oauth
- gitlab-token
- disable-tls
- secure-http
- bitbucket-oauth
- cafile
- capath
- http-basic
- platform
- vendor-dir
- bin-dir
- data-dir
- cache-dir
- cache-files-dir
- cache-repo-dir
- cache-vcs-dir
- cache-files-ttl
- cache-files-maxsize
- bin-compat
- prepend-autoloader
- autoloader-suffix
- optimize-autoloader
- sort-packages
- classmap-authoritative
- apcu-autoloader
- github-domains
- github-expose-hostname
- gitlab-domains
- use-github-api
- notify-on-install
- discard-changes
- archive-format
- archive-dir
- htaccess-protect
- lock
composer.json config document (opens new window)
# script の post-install-cmd と post-update-cmd
composer.json の script に予約キーワード設定することで、composer の実行ライフサイクル install と update などに合わせてでコマンド実行できる機能です。
composer.json script 一部
"scripts": {
"post-install-cmd": [
"rm -rf cache.file"
],
"post-update-cmd": [
"rm -rf cache.file"
],
},
script コマンドイベント一覧
| コマンドイベント | 説明 |
|---|---|
| pre-install-cmd | install 実装前 |
| post-install-cmd | install 実装後 |
| pre-update-cmd | update 実装前 |
| post-update-cmd | update 実装後 |
| post-status-cmd | status 実装後 |
| pre-archive-cmd | archive 実装前 |
| post-archive-cmd | archive 実装後 |
| pre-autoload-dump | install / update 中の dump-autoload 実装前 |
| post-autoload-dump | install / update 中の dump-autoload 実装後 |
| post-root-package-install | create-project 中にあるルートパッケージのインストール後 |
| post-create-project-cmd | create-project 実装後 |
| pre-dependencies-solving | 依存が解決される前 |
| post-dependencies-solving | 依存が解決された後 |
| pre-package-install | パッケージのインストール前 |
| post-package-install | パッケージのインストール後 |
| pre-package-update | パッケージのアップデート前 |
| post-package-update | パッケージのアップデート後 |
| pre-package-uninstall | パッケージのアンインストール前 |
| post-package-uninstall | パッケージのアンインストール後 |
| init | composer インスタンスが初期化された後 |
| command | composer コマンドが実行される前 |
| pre-file-download | ファイルダウンロード実装前 |
# よくあるエラーと解決方法
# パッケージ名に大文字が含まれるエラー
Composer 2.0 以降では、パッケージ名に大文字を使用できなくなりました。
エラーメッセージ:
composer require-dev.mikey179/vfsstream is invalid, it should not contain uppercase characters.
please use mikey179/vfsstream instead.
原因:
- Composer 2.0 からパッケージ名の大文字が禁止された
- CodeIgniter や EC-CUBE4 などの古いパッケージで発生することがある
解決方法:
composer.jsonを確認して、大文字を含むパッケージ名を修正- パッケージの最新バージョンに更新(大文字が修正されている可能性がある)
{
"require-dev": {
"mikey179/vfsstream": "^1.6" // 大文字を小文字に修正
}
}
# メモリ不足エラー
エラーメッセージ:
Fatal error: Allowed memory size of X bytes exhausted
解決方法:
# メモリ制限を増やす
php -d memory_limit=-1 /usr/local/bin/composer install
# または環境変数で設定
COMPOSER_MEMORY_LIMIT=-1 composer install
# プラットフォーム要件エラー
エラーメッセージ:
Your requirements could not be resolved to an installable set of packages.
解決方法:
# プラットフォーム要件を無視してインストール(非推奨)
composer install --ignore-platform-reqs
# または composer.json でプラットフォームを設定
# 認証エラー(GitHub/GitLab)
エラーメッセージ:
Could not authenticate against github.com
解決方法:
# GitHub のトークンを設定
composer config --global github-oauth.github.com YOUR_TOKEN
# GitLab のトークンを設定
composer config --global gitlab-token.gitlab.com YOUR_TOKEN
# バージョン指定について
Composer では、セマンティックバージョニング(Semantic Versioning)に基づいてバージョンを指定します。
| 記号 | 意味 | 例 | 説明 |
|---|---|---|---|
^11.9 | キャレット記法 | >=11.9.0 <12.0.0 | メジャーバージョンは固定、マイナー・パッチは更新可能 |
~11.9.0 | チルダ記法 | >=11.9.0 <11.10.0 | マイナーバージョンは固定、パッチのみ更新可能 |
11.9.* | ワイルドカード | >=11.9.0 <11.10.0 | パッチバージョンのみ更新可能 |
>=11.9 | 比較演算子 | >=11.9.0 | 11.9.0 以上 |
11.9.0 | 固定バージョン | 11.9.0 | 完全に固定 |
例:
{
"require": {
"laravel/framework": "^11.0", // 11.0.0 以上 12.0.0 未満
"monolog/monolog": "~3.0.0", // 3.0.0 以上 3.1.0 未満
"symfony/console": "6.4.*", // 6.4.x 系のみ
"php": "^8.1" // PHP 8.1 以上
}
}
# Packagist ミラーサイト
日本から Packagist にアクセスする場合、ミラーサイトを使用することで速度が向上します。
# 日本のミラーサイトを使用
composer config -g repos.packagist composer https://packagist.jp
元に戻す場合:
composer config -g --unset repos.packagist
# ベストプラクティス
# 1. composer.lock をバージョン管理に含める
composer.lock は必ず Git にコミットしてください。これにより、全員が同じバージョンのパッケージを使用できます。
# 2. 本番環境では --no-dev を使用
composer install --no-dev --optimize-autoloader
# 3. 定期的に依存関係を更新
# 更新可能なパッケージを確認
composer show --outdated
# 特定のパッケージのみ更新
composer update vendor/package --with-dependencies
# 4. セキュリティ監査
# セキュリティ脆弱性をチェック(Composer 2.4+)
composer audit
# 修正可能な脆弱性を自動修正
composer audit --fix