Composer2.x で変わったこと

2020年10月24日 Composr 2.0.0 がリリースされました🙌
[半年前の記事](https://php.watch/articles/composer-2)から少し気になってましたが、思ったより早くリリースされて嬉しいです！

- [Composer 2.0 is now available!](https://blog.packagist.com/composer-2-0-is-now-available)

今回はこちらのリリース記事の内容を要約してご紹介します！

## Composerとは？

https://github.com/composer/composer

Composerとは、PHPのパッケージ管理ツールです。
`composer.json` に書かれたパッケージ及び依存関係にあるパッケージも含めコマンド一発でインストールしてくれます。

Composerを使っていないPHPプロジェクトはほぼほぼないと言っても良いでしょう。
そんな素敵なツールのメジャーバージョンアップニュースです。

## 変更点

記事の内容を要約してご紹介します。
詳細な変更点については、[チェンジログ](https://github.com/composer/composer/releases/tag/2.0.0)をご覧ください。

### パフォーマンスの向上

- Composerとpackagist.orgの間で使用されるプロトコル及び依存関係の解決
- curlと制約評価の最適化を使用してファイルを並行してダウンロード
- 速度とメモリ使用量の両方の点で大幅な改善
- 一部のプロジェクトで両方に対して50％を超える改善
- require/remove および部分的な更新がはるかに高速
  - Composerは変更されているパッケージのメタデータのみをロードするようになったため

![](https://i.imgur.com/ITxURcs.png)

初期更新+インストール（ブートストラップされたプロジェクト、空のキャッシュ）の時間は、ext-curlが有効になっているComposer 2で使用される時間が約60％少ないことを示しています。

### ランタイム機能

- 初期化時にプラットフォームチェックステップを追加
- 新しく `Composer\InstalledVersions` クラスを追加
- 詳細は[ランタイムドキュメント](https://getcomposer.org/doc/07-runtime.md)を参照

ソースコードがランタイム機能のいずれかに依存する場合は、
`"composer-runtime-api": "^2.0"` を `composer.json` に追加する必要があります。もちろん、Composer 2.xでインストールする必要があります。

### エラー報告の改善

- 依存関係を解決できない場合に表示されるエラーレポートを改善
- メッセージがより短く、より明確に、エラーの繰り返しが減少

### 一時的な制約のある部分的な更新

- `composer update vendor/package:1.0.*`
  - vendor配下のみ更新される
  - `composer.json`, `composer.lock` は更新されない
- `composer update --with vendor/package:1.0.*`
  - `--with` オプションを付ける
  - vendor配下及び、`composer.json`, `composer.lock` は更新される

## Composer 1.x から 2.x への移行

- Composer 2.0は、Composer 1.xと同様に、PHP5.3以降をサポート
- composer.lock ファイルはバージョン間で相互運用可能であるため、2.0にアップグレードして、必要に応じて簡単にロールバックできます。
- ほとんどのコマンドと引数は同じままであり、Composerについて知っていることの大部分は2.0でも当てはまります。
- 詳細については[アップグレードガイド](https://github.com/composer/composer/blob/master/UPGRADE-2.0.md)を参照

### Composer 1.x から 2.x へアップグレード

```
$ composer self-update
# or
$ composer self-update --2
```

### Composer 2.x から 1.x へダウングレード

```
$ composer self-update --1
```

Composer 1.x は長期間のサポートは行われないので、ダウングレードの際は注意してください。

## 下位互換性のないもの

### プラグイン

- 各種プラグインがComposer2をサポートするまで待つ必要があります

#### 補足: hirak/prestissimo プラグイン

- https://github.com/hirak/prestissimo
- [composerを速くするプラグイン・prestissimoを作った](http://blog.tojiru.net/article/432944706.html)

`hirak/prestissimo` プラグインはComposer1.xで多くの開発者がお世話になったComposer高速化プラグインです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【業務連絡】2.0も正式に出ましたし、hirak/prestissimoはabandonしようと思います</p>&mdash; Hiraku (@Hiraku) <a href="https://twitter.com/Hiraku/status/1321327232384561153?ref_src=twsrc%5Etfw">October 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

プラグイン製作者の[Hiraku](https://twitter.com/Hiraku)氏のツイートより、Composer1.x用で今後はメンテナンスされないとのことです。Composer2.xへアップグレードする際はプラグインを削除してからアップグレードしてください。

### 新しいプラットフォームチェック機能

- ComposerがランタイムPHPバージョンと利用可能な拡張機能をチェックする
- プロジェクトの依存関係と一致することを確認できる
- 不一致が見つかった場合、オートローダーはエラーの詳細とともに終了
- `composer check-platform-reqs --no-dev` をデプロイプロセスに組み込むことを推奨

### リポジトリの優先度

- パッケージが優先度の高いリポジトリに存在する場合、優先度の低いリポジトリでは完全に無視する
- [リポジトリの優先順位に関するドキュメント](https://getcomposer.org/doc/articles/repository-priorities.md)

### 無効なPSR-0 / PSR-4構成

- Composer 1.10で導入された警告に従って、無効なPSR-0 / PSR-4構成は、最適化オートローダーモードで自動ロードされなくなります
- Composer2へのアップグレードする前にこれらをクリーンアップする方が安全です

## 今後は？

Composer2.0はPHP5.3以上をサポートしていますが、コードの場所によってメンテナンスが非常に困難です。
将来のマイナーリリースでEOLPHPバージョンのサポートを終了する予定です。

タイムラインと最終的に含まれる機能によっては、Composer2.1でPHP5.3がサポートされる場合がありますが、遅くともComposer 2.2では、PHP7.1.3より古いすべてのサポートが終了します。

Composerの統計によると、Composerユーザーの90％以上が最新バージョンを使用でき、古いPHPバージョンの利用を続けるユーザーには、2.0.xまたは2.1.xの範囲で重大なバグとセキュリティ修正を提供し続けます。

Composer 1.xに関しては、多かれ少なかれEOLになりました。また、何か問題が発生した場合は重要な修正が行われますが、すべての人の目標は、できるだけ早く2.xに移行しましょう。

## 参考

- https://github.com/composer/composer
- https://getcomposer.org/upgrade/UPGRADE-2.0.md
- https://blog.packagist.com/composer-2-0-is-now-available/
- https://php.watch/articles/composer-2