MSYS2における正しいパッケージの更新方法

MSYS2のpacmanを使ってパッケージを更新する場合、正しい手順を踏まないとパッケージが正常に更新できない場合があります（ありました）。

pacmanの開発元であるArch Linuxでは、パッケージデータベースの更新とパッケージの更新をまとめて、単純に `pacman -Syu` というコマンドで実行できますが、MSYS2ではpacmanのバージョンによって、異なる手順が必要となっています。

※ 20160921版のインストーラからは、新しいpacmanが含まれるようになったため、`pacman -Syu` が使えるようになりました。詳しくは、[1.](#1-pacman-5016403以降あるいは501-1以降がインストールされている場合) を参照してください。

# 0. pacmanのバージョン確認

まずは、pacmanのバージョンを確認します。例えば以下のようにして確認できます。

```
$ pacman -Sl | grep 'pacman '
msys pacman 5.0.1.6403.07ca798-1 [インストール済み]
```

この場合、5.0.1.6403 がインストールされていることが分かります。
一方、以下のように表示された場合は、5.0.1.6403 が入手可能だが、インストールされているのは 5.0.1.6391 であることを示しています。

```
$ pacman -Sl | grep 'pacman '
msys pacman 5.0.1.6403.07ca798-1 [インストール済み: 5.0.1.6391.6f124b6-1]
```

以降は、インストールされているpacmanのバージョンにしたがって作業を行ってください。

# 1. pacman 5.0.1.6403以降、あるいは5.0.1-1以降がインストールされている場合

Arch Linuxと同様に、単純に、

```
$ pacman -Syuu
```

で、パッケージデータベースの更新(`-Sy`)とパッケージの更新(`-Suu`)をまとめて行えます。`-Su`ではなく、`-Suu`としているのはダウングレードも許可するためです。後は表示されるメッセージにしたがって作業を行ってください。

## コアシステムに更新がある場合

コアシステムに更新がある場合は、2回に分けて更新が行われるため注意が必要です。1回目ではコアシステムが更新され、MSYS2のウィンドウを立ち上げ直してから再度pacmanを実行すると、残りのパッケージが更新されます。

まず1回目の、

```
$ pacman -Syuu
```

で、コアシステムに更新が見つかった場合、以下のような表示が出ます。

```
(日本語)
:: コアシステムの更新を開始...
警告: 続行する前に他の MSYS2 プログラムを終了してください

(英語)
:: Starting core system upgrade...
警告: terminate other MSYS2 programs before proceeding
```

ここで、実行しているMSYS2プログラムがあれば終了して、更新を続行します。

処理が終わって次のような表示が出た場合は`Y`を押します。(pacman 5.2.1-9 以降)

```
(日本語)
:: 更新を完了するために、この端末を含む全ての MSYS2 プロセスが閉じられます。続行しますか？ [Y/n]

(英語)
:: To complete this update all MSYS2 processes including this terminal will be closed. Confirm to proceed [Y/n]
```

pacman 5.2.1-8 までは以下のようなメッセージが表示されるので、`Alt-F4` を押すかクローズボタンをクリックして手動でMSYS2 (mintty)のウィンドウを閉じます。

```
(日本語)
警告: シェルに戻る前に MSYS2 を終了し、更新を再度チェックしてください
警告: exit を呼ぶのではなく、例えば端末ウィンドウを閉じてください

(英語)
警告: terminate MSYS2 without returning to shell and check for updates again
警告: for example close your terminal window instead of calling exit
```

どちらの場合も、次のようなダイアログボックスが出たら`OK`をクリックするとminttyのウィンドウが閉じます。

![mintty-close-dialog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59454/c4b9ff31-682c-91b6-e768-e1c92c136573.png)

MSYS2のウィンドウが閉じたら、ウィンドウを再度立ち上げて、pacmanコマンドを再度実行します。
パッケージデータベースは更新済みなので、

```
$ pacman -Suu
```

を実行すれば、残りのパッケージが更新されます。


# 2. pacman 4.2.1.6187以降がインストールされている場合

このバージョンのpacmanには、`update-core`というコアパッケージを更新するための専用コマンドが用意されています。
20150916版以降のインストーラを使ってインストールした場合など、比較的新しい環境がこれに相当します。

## 2.1. 最小限のパッケージの更新

まずは、

```
$ update-core
```

を実行します。パッケージの更新があった場合には以下のような表示が出ます。(バージョンにより異なる可能性あり)

```
==> Checking if there are critical packages to upgrade.
msys2-runtime 2.3.0.16701.d6cd1b3-1 -> 2.4.0.16752.6eb10ef-1
==> Core packages require updating.
==> Please close all other MSYS2 derived windows (e.g. terminal
==> windows, Bash sessions, etc) before proceeding.
==> 警告: When the update has completed, you MUST close this MSYS2 window
==> 警告: (use Alt-F4 or red [ X ], etc.), rather than 'exit'!!!
Press [Enter] key when ready to start update...
```

`Enter` キーを押して更新を開始し、終わったら必ず `Alt-F4` あるいはクローズボタンでMSYS2 (mintty)のウィンドウを閉じてから、MSYS2を再度立ち上げて手順2.2に進みます。
`exit`で終了してはいけません。（エラーが発生します。）

コアパッケージの更新が無かった場合は、MSYS2の再起動は不要です。そのまま次の手順に進んでください。


## 2.2. 残りのパッケージの更新

MSYS2の再起動が完了したら、

```
$ pacman -Suu
```

を実行します。forkエラーなどが出ていなければ完了です。


# 3. それ以前のバージョンの場合

20150512版あるいはそれ以前のインストーラを使ってインストールした直後がこれに相当します。このバージョンには、`update-core`コマンドがありません。

## 3.1. 最小限のパッケージの更新

まずは、

```
$ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
```

を実行します。もしも、

```
依存関係を解決しています...
衝突するパッケージがないか確認しています...
エラー: 処理の準備に失敗しました (依存関係を解決できませんでした)
:: msys2-runtime-devel: msys2-runtime=2.1.0.16538.304f5d4 を必要としています
```

のようなエラーが出た場合は、依存関係にある msys2-runtime-devel も追加して、以下のように実行します。

```
$ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime msys2-runtime-devel
```

ここで指定したパッケージのいずれかに更新があった場合は、必ず `Alt-F4` あるいはクローズボタンでMSYS2 (mintty)のウィンドウを閉じてから、MSYS2を再度立ち上げて手順3.2に進みます。

以下のように一切更新が行われなかった場合は、MSYS2の再起動は不要です。そのまま次の手順に進んでください。

```
警告: bash-4.3.039-2 は最新です -- スキップ
警告: pacman-4.2.1.6159.e038c19-1 は最新です -- スキップ
警告: pacman-mirrors-20150619-1 は最新です -- スキップ
警告: msys2-runtime-2.1.0.16553.a38932f-1 は最新です -- スキップ
警告: msys2-runtime-devel-2.1.0.16553.a38932f-1 は最新です -- スキップ
 何も行うことがありません
```

## 3.2. 残りのパッケージの更新

MSYS2の再起動が完了したら、

```
$ pacman -Suu
```

を実行します。forkエラーなどが出ていなければ完了です。


# forkエラーが発生してしまった場合は

pacman実行中に以下のようなforkエラーが発生した場合、pacman自体は正常終了しているように見えますが、そのパッケージの更新に失敗しています。そのため、forkエラーが発生したパッケージを手動で再インストールする必要があります。

```
37845597 [main] pacman 7492 fork: child -1 - forked process 8716 died unexpectedly, retry 0, exit code 0xC0000005, errno 11
エラー: 新しいプロセスをフォークできません (Resource temporarily unavailable)
```

forkエラーが発生したパッケージをメモっておき、MSYS2を再起動してから、以下のコマンドを実行します。

```
$ pacman -S package1 package2 ...
```


# 参考

* [MSYS2 installation - MSYS2 / III. Updating packages](https://www.msys2.org/wiki/MSYS2-installation/#iii-updating-packages "MSYS2 installation - MSYS2")
* [pacman - ArchWiki](https://wiki.archlinux.jp/index.php/Pacman "pacman - ArchWiki")
* [MSYS2でパッケージのダウンロードに失敗するときの対処 - Qiita](http://qiita.com/k-takata/items/fcb2f1f9ca564fd78597 "MSYS2でパッケージのダウンロードに失敗するときの対処 - Qiita")
* [MSYS2ではpacmanの代わりにpacboyを使おう - Qiita](https://qiita.com/k-takata/items/04d252c464986d6280a6)