# 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)確認できます。

php バージョン対応については Composer2.0 は PHP5.3 +をサポートしていますが、将来的に Composer 2.2 から PHP7.1.3 より古いすべてのサポートが終了する予定。PHP5.3 は v2.1 までサポートするそうです。

2.0 リリースは、28 人からの 1100 以上のコミット、150 以上の GitHub の問題とプルリクエスト、さらにそれをテストし、PR をレビューで約 2 年の時間費やしました開発チームに感謝します。 🎉
PHP 開発者の皆さんに是非 Composer 2.0 にアップしてその素晴らしさを体験してほしい。

# Composer install と update の違い

composer install は composer.lock に指定された依存関係パッケージをインストールするだけ
"laravel/framework": "5.6.*"で指定した場合は素直に laravel5.6 入れてくれるけど、新バージョンはチェックしないことになります。

composer update は composer.json に指定された依存関係パッケージを環境 PHP バージョンに合わせてアップデート
"laravel/framework": "5.6.*"で指定した場合は環境 PHP バージョンが更新可能な laravel 最新バージョンを引っ張って来ます。すなわち、laravel5.7 || laravel5.8 も入れてくれます。

install と update 使うタイミング
違う PHP バージョンの環境でソース実装する場合は、update かけるべき!あるある話ですが、ローカル環境で開発して問題なかったプログラムを本番サーバーにアップすると動かないことはあります。composer update かけることで、環境に合わないライフサイクルが早期的発見できます。
テストして問題がなく、その後は勝手にバージョンアップデートしてほしくない時は composer install 使うべきでしょう。

# Composer 設定で PHP バージョン固定

環境によって PHP バージョンが違うけど、インストールして使うライブラリは統一しないと行けないので、composer.json の config 設定すれば OK です。




 




{
  "config": {
    "platform": {
      "php": "7.2"
    }
  }
}

設定ファイル

composer.json:パッケージ管理 json ファイル
composer.lock:現在使用しているバンドルのバージョン等が管理されます。

# init 初期設定

composer.json を手動で作成するコマンド

composer init

options

  • --name パッケージのお前
  • --description 説明
  • --author 作者
  • --type タイプ
  • --homepage ホームページ
  • --require 制約
  • --require-dev 開発制約
  • --stability (-s) 最小安定性フィールド値
  • --license (-l) ライセンス
  • --repository 一つあるいは複数のリポジトリ

# パッケージインストール 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

search

検索コマンドは composer.json にある現在プロジェクトのパッケージリポジトリと packagist を検索

composer search twig

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 require-dev.mikey179/vfsstream is invalid

Composer 2.0 にアップしたらエラー出ました!Composer 2.0 から大文字は使えなくなっているので、それで非推薦のワーニングエラーは色々でているようです。

今回に出会ったエラーは

composer require-dev.mikey179/vfsstream is invalid, it should not contain uppercase characters. please use mikey179/vfsstream instead.

codeigniter で composer install しようとしたらエラーが出ました。composer v1 の時が問題なく動いていたが、今回は composer2 にバージョンアップしたことが原因かも。
EC-cube4 系 のプラグインインストール時にも出ることがあるそうですが、require-dev で使われているmikey179/vfsstreamが無効になり、代わりに require-dev でないmikey179/vfsstream使ってねとのことです。

# 参考

参考:composer document (opens new window)
参考:composer download (opens new window)
参考:composer package repository packagist (opens new window)
参考:一新された PHP Composer による PHP 依存関係の処理 (opens new window)

2020-02-05
  • php

関連記事

Laravel メンテナンスモード
Laravel でカテゴリー作成 テーブル構築と再帰クエリ
Laravel を API サーバーとしての初期設定
Laravel リクエストログ出力
Carbon で php date 日付の日数・月数差を計算
Laravel 429 Too Many Requests
Laravel Email バリデーションについて
Laravel Sanctum 使って API トークン JWT 認証と SPA 認証
Laravel logger でエラーログを chatwork に自動送信
php CSV データ取得は fgetcsv 使う
Laravel tinker 使って DB データベース接続とコマンド
Laravel Test についてのメモ
Laravel Log の基本設定&使い方
Exception: Class 'ZipArchive' not found
Laravel Sail で Docker 環境構築
PHP 文字列長さ・文字列の幅を取得方法
Codeigniter 画像アップロードとリサイズ
Laravel Lumen Faker 日本語設定
laravel method の基本 get post put options
Laravel schedule 設定
Class 'Imagick' not found Error
Laravel eloquent model の規約
PHP mbconvertkana 全角半角英数カナ変換
Codeigniter APPPATH BASEPATH FCPATH 各種パスと URL 取得
Laravel timestamp() auto update 有効化無効化
Lumen8 で JWT ユーザー認証
Laravel toSql パラメータ付きで出力
Lumen8 で API 開発
php Exception エラーキャッチでメール送信
Smarty HTTP URL 取得できるサーバー関数
Laravel blade foreach loop と current url
laravel session を制する
PHP empty isset is_null の違い
PHP 8 リリース新機能と変更
FlattenException deprecated
php.ini 初期設定のいろいろ
Laravel 5.1 から 8.1 にバージョンアップ
PHP 7.4 にアップグレードして使えなくなる機能
開発時によく使うゼロ埋めパディング作業まとめ
解決!phpMyAdmin テーブル構造の内容が表示されない問題
codeigniter email ライブラリでメール送信 日本語対応
爆速軽量フレームワーク codeigniter PHP 開発
nuxtjs と codeigniter で jwt システム構築
Lumen と Laravel 違い比較
HTML から PDF に変換 PHP ライブラリ mPDF の設定
twig 3 人気 PHP テンプレートエンジンがバージョンアップ
正規表現一覧 よく使う検索・置換のパターン
Apache 初期設定メモ
開発におけるコーディングルール・規約
Laravel Error についてのメモ
laravel に vuejs 使うための初期設定
php curl 使って クリックなしで POST 送信
allowurlinclude の設定で ftp_connect()エラー