前回は、コマンドラインで使用できるWindowsのパッケージマネジャー「Windows Package Manager(winget)」を取り上げた。wingetを使えば、ターミナル作業でアプリケーションのインストールを行うことができるのだが、まだプレビュー版であり、機能拡充中といったところだ。とはいえせっかくwingetの説明をしたので、今回は近い将来に使えるようになるwingetの新機能について紹介しておきたい。

wingetの設定ファイル

まずは、wingetの設定を変更する方法を説明しておこう。wingetはWindows Terminalと同様にJSON形式の設定ファイルで設定を管理できる。PowerShellなどのターミナルを開いて、次のコマンドを実行すると、Windowsのテキストエディタで設定ファイルが開かれる。

> winget settings

設定ファイルへのパスは、筆者の環境では「C:\Users[ユーザー名]\AppData\Local\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json」だった。

「winget settings」を実行すると、テキストエディタでsettings.jsonが開く

開いたsettings.jsonを次のように書き換えてみよう。

{
    // For documentation on these settings, see: https://aka.ms/winget-settings
    "source": {
        "autoUpdateIntervalInMinutes": 5
    },

    "visual": {
        "progressBar": "rainbow"
    }
}

「autoUpdateIntervalInMinutes」は、wingetが取得するアプリの情報を、指定した間隔で自動で更新する設定になる。「progressBar」は、インストールなどを実行している最中に表示されるプログレスバーのデザインを決めるもので、「accent」「retro」「rainbow」のいずれかの値を指定する。「rainbow」を指定した場合、プログレスバーは次のように虹色の表示になる。

「rainbow」を指定すると、プログレスバーが虹色になる

PowerShellでタブ補完を有効にする

では早速、新機能の話に入ろう。最新のwingetでは、PowerShell上でコマンドを実行する際に、サブコマンドやアプリケーション名を自動で補完するように設定できる。例えば、アプリ名を入力する箇所で「vsc」まで入力して「タブ」キーを押すと、インストール可能なアプリのなかから名前が「vsc」で始まるものを探して自動で補完入力してくれるという具合だ。

この機能は、PowerShellの拡張設定によって実現している。したがって有効にするにはwingetではなくてPowerShell側に設定を追加する必要がある。PowerShellの設定ファイルの場所は、次のように「$PROFILE」と入力して「Enter」キーを押すことで調べられる。もしすでにファイルのパスが存在する場合は、「notepad $PROFILE」を実行すればメモ帳で設定ファイルを開くことができる。

メモ帳でPowerShellの設定ファイルを開く

筆者の環境では、PowerShellの設定ファイルは「C:\Users[ユーザー名]\Documents\PowerShell\Microsoft.PowerShell_profile.ps1」となっていた。この設定ファイルの末尾に、次のコードをそのままコピー&ペーストしていただきたい。PowerShellの話は今回の本質ではないので割愛するが、詳細を知りたい場合はGitHub上にある「WinGet Command Line Tab Completion」の解説を参照していただきたい。

Register-ArgumentCompleter -Native -CommandName winget -ScriptBlock {
    param($wordToComplete, $commandAst, $cursorPosition)
        [Console]::InputEncoding = [Console]::OutputEncoding = $OutputEncoding = [System.Text.Utf8Encoding]::new()
        $Local:word = $wordToComplete.Replace('"', '""')
        $Local:ast = $commandAst.ToString().Replace('"', '""')
        winget complete --word="$Local:word" --commandline "$Local:ast" --position $cursorPosition | ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
}

ファイルを保存したら、いったんPowerShellを閉じて再起動しよう。設定が反映されていれば、wingetコマンドでタブ補完が使えるようになっているはずだ。

以下に、タブ補完を活用しながらvscodeアプリのインストールコマンドを入力した際の画面遷移例を示す。

タブ補完を有効にした場合のコマンド入力例

最初に「winget 」と打ち込んで「Tab」キーを押すと、サブコマンドの候補として「install」が自動で入力される。「Tab」キーを続けて押すと、install以外のサブコマンドの候補も表示される。続いて「vsc」まで打ち込んで「Tab」キーを押すと、候補として「vscode」や「vscode-insider」といった候補が表示されるはずだ。

インストールするバージョンを指定したい場合には「-v」オプションを使う。「-v 」まで打ち込んでから「Tab」キーを押すと、インストール可能なバージョン番号が自動で補完される。

このように、指定可能な入力候補を自動で補完してくれるので、有効にしておくと非常に便利だ。

wingetの実験的な機能を有効にする

wingetに実験的に追加されている新機能のなかには、デフォルトでは有効にされていないものもある。まずは、次のように「winget features」というコマンドを実行してみよう。

一部の実験的な機能が無効になっている

すると、「Command Sample」「Argument Sample」「Microsoft Store Support」という3つの機能について、状態が「無効」になっていることがわかるはずだ。これら3つの機能については、現時点で実装されてはいるが、実験的なものであるためデフォルトで無効化されているのである。

これらの機能は、settings.jsonに設定を追加することで有効化することができる。試しにsettings.jsonに「experimentalFeatures」の項目を追加してみよう。

{
    // For documentation on these settings, see: https://aka.ms/winget-settings
    "source": {
        "autoUpdateIntervalInMinutes": 5
    },

    "visual": {
        "progressBar": "rainbow"
    },

    "experimentalFeatures": {
        "experimentalCmd": true,
        "experimentalArg": true
    }
}

「experimentalCmd」は「Command Sample」に、「experimentalArg」は「Argument Sample」に該当する。それぞれのプロパティの値を「true」にすることで、これらの機能が有効になる。設定を保存したらもう一度「winget features」を実行してみよう。

2つの実験的な機能が有効になった

今度は「Command Sample」と「Argument Sample」の状態が「有効」に変わっているはずだ。ちなみに、この2つの機能は、実験的な機能の有効/無効の切替えが正常に動作していることをテストするためのもので、実用性は特に無い。違いは、wingetコマンドに対して「experimental」というサブコマンドが使えるようになっており、「winget experimental —arg」というオプションで実行すると次のようにASCIIアートが表示されることだ。

ASCIIアートが表示される

Microsoftストアのアプリのインストールを有効にする

winget featuresで見られる実験的な機能には、もう一つ「Microsoft Store Support」というものがある。これは、Microsoftストアに登録されているアプリケーションをwingetでインストールできるようにする機能だ。現在のところ、wingetでインストールできるアプリケーションは独自のリポジトリで管理されており、Microsoftストアとは連動していない。しかし、この実験的な機能を有効にすると、wingetが独自リポジトリに加えてMicrosoftストアアプリのリポジトリも参照するようになる。Microsoftストアの全てのアプリケーションが対応しているわけではないようだが、それでもwingetの有用性が格段に高まることは間違いない。

Microsoftストアアプリのインストールを有効にするには、settings.jsonのexperimentalFeaturesの項目で、次のように「experimentalMSStore」プロパティの値を「true」に設定すればよい。

    "experimentalFeatures": {
        "experimentalCmd": true,
        "experimentalArg": true,
        "experimentalMSStore": true
    }

これで「Microsoft Store Support」の状態が有効になったことを確認できる。

「Microsoft Store Support」が有効になった

例えば、Microsoft Store Supportが無効の状態で、winget searchコマンドで「HTTP」を検索すると次のような結果になる。

「Microsoft Store Support」が無効の場合の検索結果

それに対して、Microsoft Store Supportを有効にした場合、次のようにいくつかのアプリケーションが増えていることがわかる。右端には「ソース」という列が追加されており、ここが「winget」だったらwingetのリポジトリのアプリケーションで、「msstore」だったらMicrosoftストアのアプリケーションであることを意味する。

Microsoft Store Support」を有効にした場合の検索結果

今回は、前回に続きwingetを取り上げ、実験的に実装されているいくつかの機能について紹介した。現在wingetでは、インストール済みアプリケーションの一覧表示や、更新/アンインストールもwingetコマンドで行えるようにする機能などを実装中とのことだ。

参考資料