# 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 installcomposer.lock に指定された依存関係パッケージをインストールするだけです。
composer.lock が存在する場合、そのファイルに記載されているバージョンを厳密にインストールします。

composer install

特徴:

  • composer.lock が存在する場合、そのバージョンを厳密にインストール
  • composer.lock が存在しない場合、composer.json から依存関係を解決してインストール後、composer.lock を作成
  • composer.lock は更新されない

# composer update

composer updatecomposer.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.jsonconfig 設定すれば 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 実際にインストールせずに、インストールのシミュレートして結果表示
  • --dev require-dev に指定したパッケージをインストール(デフォルト)
  • --no-dev require-dev に指定したパッケージをインストールをスキップ
  • --no-autoloader autoloader の生成をスキップ
  • --no-scripts composer.json に指定した script の実行をスキップ
  • --no-progress インストールの進行状況表示しない
  • --no-suggest 推奨パッケージを出力しない
  • --optimize-autoloader(-o) PSR-0 / 4 オートローディングをクラスマップに変換して、オートローダーを高速化。本番環境での使用をお勧めしますが、実行に時間がかかるため、デフォルトでは実行しない
  • --classmap-authoritative(-a) クラスマップからのみ自動ロード。 --optimize-autoloader を暗黙的に有効
  • --apcu-autoloader APCu を使用して、found / not-found クラスをキャッシュ
  • --ignore-platform-reqs php、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-scripts composer.json で定義したスクリプトの実行をスキップ
  • --optimize (-o) PSR-0 / 4 オートローディングをクラスマップに変換して、オートローダーを高速化します。 デフォルトでは実行されていないが、実稼働環境での使用をお勧め
  • --classmap-authoritative (-a) クラスマップからのみクラスを自動ロードします。 --optimizeを暗黙的に有効にします。
  • --apcu APCu を使用して、found / not-found クラスをキャッシュします。
  • --no-dev autoload-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 パッケージのパスを表示

検索コマンドは 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 などの古いパッケージで発生することがある

解決方法:

  1. composer.json を確認して、大文字を含むパッケージ名を修正
  2. パッケージの最新バージョンに更新(大文字が修正されている可能性がある)
{
  "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

# 参考リンク

2020-02-05

同じタグを持つ記事をピックアップしました。