wingetを使おう 後編:wingetの詳細設定、Tabキー補完など

WindowsWindows

Microsoftのパッケージ管理ソフト「winget」の使い方を紹介します。wingetは、Linuxでいうaptやyum、dnfなどに相当するツールで、wingetコマンドを通して、wingetリポジトリ(や、将来的にはMicrosoftストア)で配布されているソフトを導入することができます。

後編のこの記事では、wingetそのものの設定方法(試験的機能の有効化など)や、PowerShellにおけるwingetコマンドのTabキー補完、その他の機能を紹介します。

ご案内

本記事は、「wingetを使おう」前編・中編・後編のうち後編です。

前編では、wingetそのもののインストール方法と、wingetを用いたアプリのインストール方法を紹介します。

中編では、wingetを用いたアプリのアンインストール、アップグレードや、インストール済みアプリ一覧の取得方法を紹介します。

後編(本記事)では、wingetそのものの設定方法やその他情報(PowerShellのTabキー補完)を紹介します。

wingetの設定を変更する

winget自体の設定も変更できます。また、試験的機能はデフォルトでオフになっていますが、ここでオンにすることで利用できるようになります(experimentalFeatures)。

winget設定ファイル(settings.json)の開き方

設定できるといっても、設定用のUIが用意されているわけではなく、設定用のJSONファイルを書き換えることで設定変更できます。VSCodeなど、JSONに対応したエディタを用意しておくと便利です。ちなみに、VSCodeもwinget install vscodeでインストールできます。インストールしたら、拡張子jsonをVSCodeに関連付けておきましょう。

設定用のJSONファイルは、winget settingsコマンドを実行すると開けます(jsonファイルに関連付けられているエディタで開かれます。何も変更していない場合、メモ帳で開かれます)。もしくは、次のどちらかにJSONファイルがありますので、それを直接開いても構いません。

  • %LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json
  • %LOCALAPPDATA%\Microsoft\WinGet\Settings\settings.json

はじめて設定用のJSONファイルを開くと、次のようなスケルトン状態だと思います。ここにいろいろ書き足していくと、設定変更できます。

{
    "$schema": "https://aka.ms/winget-settings.schema.json",

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

記事執筆時点(2021/08/09、winget v1.0.11591)では、次のような設定項目があるようです。installBehaviorの所はMicrosoftの記事を読んでもよく分からなかったためコメントアウトしていますが、それ以外はデフォルト設定で記述しています。こちらをコピペして、変更したい箇所だけ変えて保存すれば良いでしょう。

{
    "$schema": "https://aka.ms/winget-settings.schema.json",

    // For documentation on these settings, see: https://aka.ms/winget-settings

    "source": {
        "autoUpdateIntervalInMinutes": 5
    },
    "visual": {
        "progressBar": "accent"
    },
    "installBehavior": {
        "preferences": {
             /*
            "scope": "user",
            "locale": ["ja-JP"]
            */
        },
        "requirements": {
            /*
            "scope": "user",
            "locale": ["ja-JP"]
            */
        }
    },
    "telemetry": {
        "disable": false
    },
    "network": {
        "downloader": "default",
        "doProgressTimeoutInSeconds": 60
    },
    "experimentalFeatures": {
        "experimentalCMD": false,
        "experimentalARG": false,
        "experimentalMSStore": false,
        "packagedAPI": false,
        "dependencies": false,
        "list": false,
        "upgrade": false,
        "uninstall": false,
        "restSource": false
    }
}

ちなみに、JSONファイルの文法が間違っているなど、設定ファイルが不正な状態になっている場合、wingetコマンドを実行すると次にようなメッセージが出てきます。この場合は、もう一度JSONファイルが正しいか確認してみてください。

PS C:\> winget
設定の読み込み中に予期しないエラーが発生しました。Settings コマンドを実行して、設定を確認してください。
(以下省略)
「settings.json」に誤りがあると、このような表示が出てきます

設定項目の詳細

設定項目の詳細は、Microsoftの記事を参照してください。

ここでは、いくつか代表的な設定項目を紹介します。

source の autoUpdateIntervalInMinutes(デフォルト:5)

通常、wingetの各種コマンドを実行すると、一定間隔でパッケージリストの更新がかかります。この設定項目ではパッケージリストの更新間隔を変更でき、何分ごとに更新するかを正の整数で指定します。

0を指定すると、自動更新されなくなります。パッケージリストの更新(apt updateに相当する操作)はwinget source updateコマンドで行えます。

visual の progressBar(デフォルト:"accent")

ソフトダウンロード中などのプログレスバーの表示を切り替えます。選択肢は「accent」、「rainbow」、「retro」のいずれかで、順に下図のような表示になります。VSCodeで入力しようとすると「plain」という候補も出てきますが、実際には存在しない設定のようです。

visual の progressBar設定:上から順に「accent」、「rainbow」、「retro」です

experimentalFeatures の experimentalMSStore(デフォルト:false)

現在のwingetでは、wingetリポジトリのソフトしか扱えませんが、将来的にはMicrosoftストアのアプリもインストールしたりできるようになるそうです。現在、そのMicrosoftストアアプリを扱う機能は、試験的機能として提供されていて、こちらのオプションをtrueにすると利用できるようになります。

例えば、これを有効にしてPython関連のパッケージを探すと、下記のようにwingetリポジトリとmsstoreリポジトリそれぞれで見つけることができます。

PS C:\> winget search Python.
名前           ID                                  バージョン ソース
----------------------------------------------------------------------
winpython-dot  winpython.winpython-dot             3.9.5.0    winget
winpython      winpython.winpython                 3.9.5.0    winget
Python 3       Python.Python.3                     3.9.6150.0 winget
Python 2       Python.Python.2                     2.7.18150  winget
winpython-pypy winpython.winpython-pypy            3.7.10.0   winget
Python 3.7     PythonSoftwareFoundation.Python.3.7 Latest     msstore
Python 3.8     PythonSoftwareFoundation.Python.3.8 Latest     msstore
Python 3.9     PythonSoftwareFoundation.Python.3.9 Latest     msstore
Microsoftストアのアプリも扱えます

「msstoreリポジトリにあるものをwingetでインストール」と、「Microsoft Storeアプリからアプリをインストール」は等価です。つまり、Microsoft Storeアプリを使ってインストールする代わりに、wingetコマンドを使ってストアで配信されているアプリをインストールできるようになります。試しに、Microsoft Storeでアプリのページを開いたままwinget installすると、下図のようにストアアプリの方でもインストール中の表示になります。

PS C:\> winget install "Python 3.9"
見つかりました Python 3.9 [PythonSoftwareFoundation.Python.3.9]
このパッケージは Microsoft Store から提供されています。winget は、現在のユーザーに代わって Microsoft Store からパッケージを取得する必要がある場合があります。
パッケージ取得の確認/要求...
パッケージ取得の成功の確認/要求
パッケージのインストールを開始しています...
  ██████████████████████████████  100%
インストールが完了しました
wingetでインストールすると、ストアアプリの方でもインストール中の表示になります

また、Windows Terminalのように、wingetリポジトリとmsstoreリポジトリの両方で同じ名前・同じIDで配信されている場合、名前やIDを指定するだけでは一つに特定できず、インストールできません。

PS C:\> winget install "Windows Terminal"
複数のパッケージが入力条件に一致しました。入力内容を修正してください。
名前             ID                        ソース
--------------------------------------------------
Windows Terminal Microsoft.WindowsTerminal winget
Windows Terminal Microsoft.WindowsTerminal msstore
各リポジトリで同じソフトが配信されている場合は、名前・IDを指定したインストールができません

そのような場合は、winget install --source msstore "Windows Terminal"のように、リポジトリ名も明示してインストールコマンドを実行します。

PS C:\> winget install --source msstore "Windows Terminal"
見つかりました Windows Terminal [Microsoft.WindowsTerminal]
このパッケージは Microsoft Store から提供されています。winget は、現在のユーザーに代わって Microsoft Store からパッケージを取得する必要がある場合があります。
パッケージ取得の確認/要求...
パッケージ取得の成功の確認/要求
パッケージのインストールを開始しています...
  ██████████████████████████████  100%
インストールが完了しました
その場合は、リポジトリを明示してインストールします

ちなみに、Microsoftストアでアプリをインストールする際は、Microsoftアカウントのログインが必要です。Microsoftストアアプリであれば、インストールの際にログインを促されますが、wingetの場合は「ストア アカウントが見つかりませんでした」というエラーでインストールが止まってしまいます。事前にMicrosoftストアアプリでログインしておいてください。

experimentalFeatures の dependencies(デフォルト:false)

パッケージ管理ソフトの最大の特徴は、依存関係を解決するような芋づる式インストールだと思っていますが、wingetにも将来的に同様の機能が搭載される予定です。現在、dependenciesという試験的機能の有効化オプションがありますが、これをtrueにすると依存関係の情報を表示してくれるそうです(現時点では、芋づるインストールは実装されていないとのこと)。依存関係の表示がされるパッケージが見つけられなかったので、ここでは機能の紹介だけにしておきます。

次のページに、依存関係の仕様案がまとめられていますが、aptやdnfなどと同じような動きで、依存関係を持つアプリをインストールしようとすると、合わせて.NET FrameworksやVisual C++ Redistributableもインストールするか聞かれる感じになるようです。

まだまだ完成には時間がかかるのかもしれませんが、期待して待っていたいと思います。

その他の機能

winget –help:ヘルプの表示

winget --helpを実行すると、簡単な使用方法が表示されます。同様に、winget install --helpのように、サブコマンドの後に--helpをつけると、サブコマンドのヘルプが表示されます。

wingetコマンドの使い方を忘れてしまった場合は、とりあえず--helpをつけて実行してみましょう。

winget show:パッケージ情報の表示

winget show パッケージ名で、パッケージの情報を表示できます。

PowerShellにwingetのTabキー補完を設定する

Linuxのaptやdnfだと「apt ins[Tab]」で「apt install」とサブコマンド補完してくれたり、「apt install ngi[Tab]」で「apt install nginx」とパッケージ名を補完してくれたりします。

同様のことが、PowerShellとwingetの組み合わせでもできます。方法は、PowerShellのprofileファイルにコンプリーションの設定を書くだけです。profileファイルのパスは、PowerShell上でecho $PROFILEで確認できます。今までに作成したことがない場合は、新規作成します。

次のコマンドを実行すれば、profileファイルの新規作成と、その中身を追記することができます。追記が終わったら、PowerShellを再起動して動作を確認してみてください。

New-Item (Split-Path -Parent $PROFILE) -type directory -Force
@'
# WinGet Command Line Tab Completion
# https://github.com/microsoft/winget-cli/blob/master/doc/Completion.md
# ( https://astherier.com/blog/2021/08/winget-usage-2/ )
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', $_)
        }
}

'@ |  Add-Content $PROFILE

なお、profileファイルの利用もPowerShellスクリプトの実行権限が必要ですので、事前に管理者権限PowerShellでSet-ExecutionPolicy RemoteSignedなどを実行しておいてください。

また、Windows 10やWindows 11に標準搭載されている「Windows PowerShell (powershell.exe)」と、オープンソース版の「PowerShell 7 (pwsh.exe)」は$PROFILEのパスが異なりますので、両方とも使用している方は、それぞれで上記コマンドを実行してください。

あとがき

前編・中編・後編と3回に渡ってwingetコマンドの使い方を紹介しました。

現時点ではWindowsに標準搭載されておらず、未実装の機能があるなど、開発途上ではあります。ですが、Linuxのaptやdnfなどと同じように、コマンドラインだけでソフトのインストールや管理を行うことができますので、同じ環境をいくつも複製したり管理したりするのが楽になると思いますので、ぜひ使ってみてください。

ご案内

後編までご覧いただき、ありがとうございます。この「wingetを使おう」記事は、前編と中編もございます。もしご覧になっていない方は、良ければこちらもご覧ください。

前編では、wingetそのもののインストール方法と、wingetを用いたアプリのインストール方法を紹介しています。

中編では、wingetを用いたアプリのアンインストール、アップグレードや、インストール済みアプリ一覧の取得方法を紹介します。

参考リンク

wingetの公式ドキュメントはこちらです。

また、こちらのページ(GitHubのwingetリポジトリ)も参考になりました。