composerのアップデート

## 環境

- WSL 2
- Ubuntu 22.04.2 LTS
- Composer 2.5.7 を`/usr/local/bin/composer` にインストール済み

## ふたつの方法

次の2つの方法があります。

1. composer self-update
1. composer-setup.php

それぞれ説明します。
両方説明しますが、`composer self-update`を使えば良いと思います。

## composer self-update

composerにはself-updateというサブコマンドがあります。

### 最新バージョンにアップデートしたいとき

`composer self-update`します。



https://getcomposer.org/doc/03-cli.md#self-update-selfupdate

`/usr/local/bin/composer` にインストールしているときは

```sh
sudo -H composer self-update
```

すると良さそうです。
実行します。

```sh
ledsun@MSI:~►sudo -H composer self-update
[sudo] password for ledsun:
Upgrading to version 2.5.8 (stable channel).

Use composer self-update --rollback to return to version 2.5.7
```

バージョンを確認してみます。

```sh
ledsun@MSI:~►composer --version
Composer version 2.5.8 2023-06-09 17:13:21
```

2.5.8になりました！



### バージョンをもどす

`--rollback`オプションでバージョンが戻せるみたいです。
バージョンを戻してみましょう。

```sh
ledsun@MSI:~►sudo -H composer self-update --rollback
[sudo] password for ledsun:
Rolling back to version 2023-05-24_15-00-39-2.5.7.
```

バージョンの見た目が違いますが、末尾をみると`2.5.7`とあるので、2.5.7に戻ったようです。
ふたたび2.5.8に上げます。
 
```sh
ledsun@MSI:~►sudo -H composer self-update
[sudo] password for ledsun:
Upgrading to version 2.5.8 (stable channel).

Use composer self-update --rollback to return to version 2.5.7
```





### 特定のバージョンをインストールしたいとき

`composer self-update`は引数でバージョンを指定出来ます。

```sh
ledsun@MSI:~►sudo -H composer self-update 2.5.6
[sudo] password for ledsun:
Upgrading to version 2.5.6 (stable channel).

Use composer self-update --rollback to return to version 2.5.8
```


### バージョンアップのべき等性

余計にバージョンアップしてみます。

```sh
ledsun@MSI:~►sudo -H composer self-update
[sudo] password for ledsun:
You are already using the latest available Composer version 2.5.8 (stable channel).
```

ちゃんと現在のバージョンを認識してスキップしてくれるようです。
自動更新するスクリプトに組んでも大丈夫そうです。


## composer-setup.php

composerをインストールするときにつかう`composer-setup.php`スクリプトでもバージョンアップできます。

### comporser-setup.phpのダウンロード
`composer-setup.php`は https://getcomposer.org/download/ に載っている手順で取得出来ます。

```sh
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

の最初の2行です。
やってみましょう。

```sh
ledsun@MSI:~►php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ledsun@MSI:~►php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Installer verified
```

`composer-setup.php`のダウンロードと検証が出来ます。
検証はダウンロードした`composer-setup.php`のsha384ハッシュを確認しているようです。
おそらく偽の`composer-setup.php`をダウンロードしていないか確かめているのでしょう。

### 最新バージョンにアップデートしたいとき

```sh
ledsun@MSI:~►php composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 2.5.8) successfully installed to: /home/ledsun/composer.phar
Use it: php composer.phar
```

バージョンを確認します。

```sh
ledsun@MSI:~►composer --version
Composer version 2.5.7 2023-05-24 15:00:39
```

あれ？変わっていません。
パスが通っているところに移動する必要があるのでした。

```sh
ledsun@MSI:~►sudo mv composer.phar /usr/local/bin/composer
[sudo] password for ledsun:
```

ふたたびバージョンを確認します。

```sh
ledsun@MSI:~►composer --version
Composer version 2.5.8 2023-06-09 17:13:21
```

更新できました。


### バージョンを指定したcomposerのインストール

`composer-setup.php`は`--version`オプションでバージョンを指定します。
やってみましょう。


```sh
ledsun@MSI:~►php composer-setup.php --version 2.5.6
All settings correct for using Composer
Downloading...

Composer (version 2.5.6) successfully installed to: /home/ledsun/composer.phar
Use it: php composer.phar
```

### ダウンロードのべき等性

`composer-setup.php`を実行すると、ダウンロード済みのファイルの有無にかかわらず、毎回`composer.phar`をダウンロードします。

```sh
ledsun@MSI:~►php composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 2.5.8) successfully installed to: /home/ledsun/composer.phar
```

ダウンロードなので、それはそうな気がします。


## 参考

- [Composerいろいろ - Qiita](https://qiita.com/takepan/items/4b97f06ab7a17a00d53f)
- [composer のバージョンをアップデートする - Qiita](https://qiita.com/onkbear/items/f98d274d38eacfe7a209)
- [composer本体のバージョンを下げる - Qiita](https://qiita.com/YukiHoshi/items/4b7c7c2d73217db83f16)