MSYS2のpacmanを使ってパッケージを更新する場合、正しい手順を踏まないとパッケージが正常に更新できない場合があります(ありました)。
pacmanの開発元であるArch Linuxでは、パッケージデータベースの更新とパッケージの更新をまとめて、単純に pacman -Syu
というコマンドで実行できますが、MSYS2ではpacmanのバージョンによって、異なる手順が必要となっています。
※ 20160921版のインストーラからは、新しいpacmanが含まれるようになったため、pacman -Syu
が使えるようになりました。詳しくは、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のウィンドウが閉じます。
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 ...