🐡

WSL2難民のためのWindowsのターミナル環境整備(MSYS2)

2021/10/10に公開
tags: windows msys2

はじめに

Windowsで使えるUNIX風シェル環境を用意する方法の一つに、MSYS2があります。
MSYS2の詳しい内容は以下のURLを参照してもらうとして、簡単に言うとWindows上でbashが使えます。

https://www.msys2.org/

通常、Windows上でLinuxライクな環境を使うならWSL2やVMを使えばよいのですが、昨今はリモートワークでVDI環境などを使うケースが増えました。VDIで仮想化支援機能がオフにされているとこれらの機能は使えません。

Linux開発環境は別に用意されており、find、bash、grep、awkなどのコマンドやWindowsからLinuxへ接続するためのターミナルとして利用できれば問題ないという状況であればMSYS2は良い解決先になると思います。

今回は、備忘録も兼ねてMSYS2とscoopで環境を構築する方法を纏めます。

実施内容

  • scoopをインストールし、Windowsにインストールされたコマンドもシェルから呼び出せるようWindowsのPATH設定もMSYS2起動時に引き継ぐ
  • Windows Terminalで、MSYS2を利用
  • VSCode のターミナルとしてもMSYS2を利用

環境

Windows11 Pro

Scoop (Package Manager)

scoop(https://scoop.sh/)はWindowsのパッケージをコマンドラインでインストール、アンインストール、アップデート、検索などできるツールです。
brew、apt、dnfと同じようなパッケージマネージャで、Windowsで使用できます。

Windowsにはscoopより前に開発されたChocolatey(https://chocolatey.org/)があり、こちらの方が対応パッケージは多いです。

しかし、デフォルトでユーザディレクリ側にアプリケーションをインストールでき、UACのポップアップから解放されるため scoop を採用することにしました。

Scoopをインストールする

Windows Teminal(PowerShell)で以下のコマンドでWindowsをインストールできます。

> Set-ExecutionPolicy RemoteSigned -scope CurrentUser  
> iwr -useb get.scoop.sh | iex

scoop を利用する準備

scoopを利用するには git必要なのでままずはgitをインストールします。
また、extraリポジトリに含まれるパッケージも必要なのでbucketを有効化します。

> $ scoop bucket known
main
extras
versions
nightlies
nirsoft
php
nerd-fonts
nonportable
java
games
jetbrains
> scoop install git
> scoop bucket add extras
> scoop status
Scoop is up to date.
Everything is ok!

scoop で必要なパッケージをインストール

> scoop install gh 
> scoop install sudo
> scoop install msys2
> scoop install vscode

MSYS2

MSYS2のインストール

scoop経由でインストールすると「C:\Users<ユーザ名>\scoop\apps\msys2\current」へインストールされます。

scoopを使わずインストールする場合は https://www.msys2.org/ のサイトの「Installation」からインストーラをダウンロードしてください。
デフォルトではMSYS2は「C:\msys64」にインストールされます。

Windowsの環境変数PATHの引継ぎ

前述のscoopやその他Windowsでインストールしたアプリケーションを簡単に利用するため、Windowsの環境変数を引継ぎできるようにします。

msys2_shell.cmd で設定する環境変数 MSYS2_PATH_TYPE を inherit に設定します。

C:\msys64\msys2_shell.cmd

rem To export full current PATH from environment into MSYS2 use '-use-full-path' parameter
rem or uncomment next line
set MSYS2_PATH_TYPE=inherit # 先頭のremを消去

各ターミナルの設定方法

Windows Teminalでの設定

MSYS2をWindows Terminalに設定する方法は以下となります。

まずはUUIDを作成します。これは別にどの方法でも問題ありません。

MSYS2

$ uuidgen.exe
4ea22e24-b3c7-4acb-ac66-26d69587eb84

Windows Teminal(PowerShell)

>  [Guid]::NewGuid()

Guid
----
60309296-d9ca-472e-9325-52e8ffbefa64

次にWindows Terminalを起動して、「Ctrl+,」を入力。
設定画面が開くので、左のサイドバーの下の方の歯車マークをクリックしてください。
setting.jsonがテキストエディタで開くので以下を追加・編集してください。

  • profilesのリストにMSYS2を設定します。
  • Windows Terminal起動時にデフォルトでMSYS2を開くよう設定する場合は、defaultProfile にUUIDを設定します。
    ...(略)...
"defaultProfile": "{<取得したUUID>}",
    ...(略)...
"profiles": {
  "list":
  [
    ...(略)...
            {
                "commandline": "C:/Users/%USERNAME%/scoop/apps/msys2/current/msys2_shell.cmd -defterm -here -no-start -msys",
                "guid": "{<取得したUUID>}",
                "icon": "C:/msys64/msys2.ico",
                "name": "MSYS2",
                "startingDirectory": "C:/Users/%USERNAME%",
                "font": 
                {
                    "face": "Lucida Console",
                    "size": 10
                },
            }
        ]

Visual Stdio Code での設定

「ファイル」→「ユーザ設定」→「設定」で設定(setting.json)が開きます。
「terminal.integrated.env.windows」の「setting.jsonで編集」から

terminal.integrated.profiles.windows にMSYS2の設定を入れ、
terminal.integrated.defaultProfile.windows を設定し、VSCODEでターミナルを開くときに、MSYS2がデフォルトで起動するようにします。

{
    "terminal.integrated.defaultProfile.windows": "Msys2",
    "terminal.integrated.profiles.windows": {


        "Msys2": {
            "path": [
                "C:/Users/%USERNAME%/scoop/apps/msys2/current/msys2_shell.cmd"
            ],
            "terminal.integrated.env.windows": {
                "MSYSTEM": "MSYS2",
            },
            "args": ["-defterm", "-msys2", "-no-start", "-here"],
            "icon": "terminal-cmd"
        },
    }
}

おまけ

scoopでインストールしたアプリケーションをアップデートする

scoop updateでscoop自体をまず更新します。

$ scoop update
Updating Scoop...
Updating 'extras' bucket...
Updating 'jp' bucket...
Updating 'main' bucket...
Scoop was updated successfully!

scoop status でアップデート可能なものを表示し、対象のアプリケーションをアップデートします。

$ scoop status 
$ scoop update <アプリケーション名>

一気にすべてアップデートする場合は以下となります。

$ scoop update *

scoopにオリジナルのbucketを追加する

bucketはscoopのアプリケーションのレポジトリで実体はGitのリポジトリとjson形式のマニュフェストファイルです。

$ scoop bucket add jp https://github.com/dooteeen/scoop-for-jp

Discussion