水たまりは希望を写している

誰でもできる! WinGet パッケージの更新 ~ 自分で更新してみよう

WinGet winget-pkgs を自分で更新しよう

WinGet は、Microsoft 公式のパッケージマネージャーであり、コマンドによって簡単にアプリをインストール・管理できる。

デフォルトのリポジトリとして msstore (Microsoft Store) と winget-pkgs が使用されている。winget-pkgs は、Microsoft のコミュニティによって運営されている。つまり、誰かがアプリの登録・更新作業をしない限り、「WinGet でインストールできない」「古いバージョンがインストールされてしまう」というような問題が発生する。

この「誰か」というのが増えないと、慢性的に上記のような問題が起こることになる。

このブログ記事では、これを見ているあなたが「誰か」になれるようできる限り簡単に winget-pkgs のマニフェスト更新をする方法をまとめている。ちなみに、今回は「更新」という作業にフォーカスしており、新しいアプリの追加については取り上げない。

アプリの更新に貢献する方法

まず winget-pkgs に登録されているアプリの更新に貢献する方法として、 2 つある。

  • Issue でアップデートをお願いする。
    • 技術的な知識は不要。ごく普通に文章として「なんとかというアプリを更新してください」というお願いを作成する。
    • しかし、これもまた「誰か」がこのお願いを見てが更新作業をするので、すぐに「誰か」が更新作業をしてくれるかもしれないし、もしかすると永遠に触れられることなく更新されないかもしれない。いってしまえば他力本願ではある。
    • 「じゃあお願いは悪い事なのか?」というと、それは明確にノーである。こうやってお願いが形になっていること自体に価値があるし、問題が発生しているということを報告するだけでも、立派な貢献である。
  • 自分で更新して、それを提出する。
    • 少し技術的なことを要求される。しかし提出したものが受理されれば、実際に更新されたアプリを WinGet 経由でインストールできるようになる。
    • 技術的といっても、GitHub と Windows の基本的な操作と、コマンドの使い方が分かっていればそれで良い。

このブログ記事では、2 つどちらの方法も紹介する。

Issue でアップデートをお願いする方法

GitHub のアカウントがあれば、誰でも Issue を作成することができる。「New issue」というボタンを押すと、Issue の種類を選ぶ画面になるので「Package Update Request」を選択する。

すると Issue を作成する画面になるので、

  1. Add a title にはアプリの名前とバージョン
  2. What type of update are you requesting? はそのまま A new version of an existing package
  3. Current Package Identifier は ID
  4. Package Version は新しいバージョンの番号

を入力・選択する。その下の入力欄には、英文で以下のように書けば OK。

New version <新しいバージョンの番号> is available.

Download URL: <ダウンロードできる URL>

あとは Create を押せば、Issue が作成される。

自分でアップデートを提出する方法

もし自分でアップデートを提出できるのであれば、そうした方が良い。

今回は、例としてここ数年更新されていない DMM GAME PLAYER を実際に更新してみる。winget-pkgs に登録されているのは 5.1.20 だが、実際の最新版は 5.4.10 で、かなり差がある。ちなみに、今 5.1.20 をダウンロードしても、アプリ内でゲームのダウンロードに失敗するため、かなり

サポートツールをインストール

Microsoft 公式で WinGet のマニフェスト作成を支援するためのツールが公開されているため、今回はそれを使用する。名前は wingetcreate で、こちらも WinGet でインストールできる。

winget install wingetcreate

wingetcreate でマニフェストを更新する

インストールできたら、早速ツールを使いながらマニフェスト更新する。その前に、更新したいアプリの ID と、新しいバージョンのインストーラーのダウンロード URL を控えておく。今回の例の場合、ID は DMM.GamePlayer で、URL は https://dlapp-dmmgameplayer.games.dmm.com/DMMGamePlayer-Setup-5.4.10.exe になる。

あとは以下のような wingetcreate コマンドを実行する。

wingetcreate update <アプリのID> --urls "<URL>|<アーキテクチャ>" --version "<バージョン>"

アーキテクチャというのは、アプリのアーキテクチャを指す。例えば 64 ビットであれば x64、32 ビットであれば x86 などになる。例の場合、

wingetcreate update DMM.GamePlayer --urls "https://dlapp-dmmgameplayer.games.dmm.com/DMMGamePlayer-Setup-5.4.10.exe|x64" --version "5.4.10"

というコマンドになる。コマンドを実行すると、自動的に現在の winget-pkgs から最新のマニフェストをダウンロードして、新しいバージョン用にマニフェストを半自動的に生成してくれる。

処理が終わると、マニフェストがユーザーフォルダの manifests フォルダに保存される。その旨も出力されているので、そのパスをコピペして、「ファイル名を指定して実行」で開いてみる。例の場合、%USERPROFILE%\manifests\d\DMM\GamePlayer\5.4.10 に保存された。

マニフェストは基本 3 ファイル以上になる。以下のような構成になっている。

  • <ID>.installer.yaml : インストーラーのハッシュ値など、インストーラー固有の情報が入る。
  • <ID>.locale.<言語コード>.yaml 言語別のファイル。例えば en-US なら英語、 ja-JP なら日本語というようにマニフェストの情報が入っている。
  • <ID>.yaml : マニフェストのメインファイル。

マニフェストファイルができたら、実際にマニフェストファイルを使用してインストールを行い、ちゃんと動作するかチェックしよう。

マニフェストの動作をチェックする

マニフェストが動作するかチェックする方法は、2 通りある。

  • 実際にインストールする
  • Windows サンドボックスにインストールする (上級者向け)

実際にインストールする

実際に WinGet を使用してインストールを確かめることができる。が、基本更新したいマニフェストというのは普段使っているアプリだと思うので、アンインストールしないといけないのが少し面倒。できれば後者の Windows サンドボックスを使用したチェックが良い。

WinGet はデフォルトでマニフェストファイルからのインストールを許可していないので、

winget settings --enable LocalManifestFiles

というコマンドでローカルのマニフェストからのインストールを許可する。あとは

winget install --manifest <マニフェストのパス>

このようなコマンドでインストールできる。

Windows サンドボックスにインストールする

上級者向けというか、Windows の Home エディションには Windows サンドボックスがないため、Pro エディション限定になる (現時点では)。

winget-pkgs リポジトリには SandboxTest.ps1 というスクリプトがあり、これを使用することで、Windows サンドボックス上でマニフェストの動作チェックができる。

GitHub でこのファイルを閲覧すると、「Raw」というボタンがあり、押すとスクリプトファイルの中身が表示される。ブラウザのメニューから「名前を付けて保存」をするとスクリプトファイルが保存できるため、任意の場所に保存する。

.\SandboxTest.ps1 <マニフェストのパス>

で Windows サンドボックスが立ち上がり、WinGet でのインストールまで自動的に行われる。あとは対象のアプリを起動してチェックする。

マニフェストを提出する

マニフェストができたら、実際にマニフェストを提出してみよう。提出も wingetcreate コマンドでできる。提出には submit コマンドを使用する。

wingetcreate submit --prtitle "New version: <ID> <バージョン番号>" <マニフェストのパス>

# 以下は例の場合
wingetcreate submit --prtitle "New version: DMM.GamePlayer" C:\Users\info\manifests\d\DMM\GamePlayer\5.4.10

このコマンドを実行すると、初回は GitHub への連携を求められる。連携が完了すると、winget-pkgs リポジトリが (自分のアカウントに) クローンされ、そこに今回作成したマニフェストがコミットされる。そして自動的に Pull request を作成してくれる。

コマンドが完了するとブラウザが開かれ、作成した Pull request が表示される。

マニフェスト提出前後の注意事項

初回は CLA への同意が必要

Microsoft が持つ GitHub リポジトリにまだ一回も Pull request を出したことがない人は、CLA (Contributor License Agreements) に同意する必要がある。

もし Pull requests を出した後に同意求められた場合、

@microsoft-github-policy-service agree

というようなコメントをすることで同意したことになる。

Issue をリンクする

もし既に Issue としてアップデートのリクエストがある場合は、その旨を記載すると良い。提出した Pull request にリンクしたい場合、Is there a linked Issue? という文章のところを Resolves #<Issue の番号> という内容に編集すると、Pull request がマージされたとき、Issue もクローズするようになるので、した方が良い。

編集は、Pull request の最初のコメントの右上の三点リーダーから、本文を編集することができる。

古いバージョンにあった値が引き継がれないときがある

wingetcreate だが、完全にマニフェストを更新できるわけではなく、マニフェストの中にある情報によっては、引き継がれずに消失してしまうものもある。例えば、インストーラーのリリース日やリリースノートなどがこれに該当する。このように「前のバージョンにはあったが、提出されたマニフェストにはない」というようなものは、Pull request に「Manifest-Metadata-Consistency」というラベルが付与される。

実際これが付いているからといって受理されない訳ではないが、できる限り前のバージョンと統一感を持たせよう。これは提出前に、目視でチェックすることをおすすめする。

ツールで提出した Pull request を修正するには?

ツールで Pull request を提出する手法を使うと、手元に提出したファイル (マニフェスト) はあるものの、GitHub にあるものと同じパッチファイルが手元にあるわけではない。

もちろん GitHub にあるリポジトリをクローンしてきて編集することもデキルがその他にもオンラインで編集する方法もある。

オンラインで編集するには、Pull request のタイトルの下に自分のリポジトリ・ブランチへのリンクがあるので、それをクリックしてページ移動した後。キーボードの . キーを押すとブラウザ内で VSCode のようなものが開くので、そこで編集して直接コミットできる。

最後に提出したマニフェストを見てみよう

今回例としてあげた DMM GAME PLAYER の Pull request は「New version: DMM.GamePlayer 5.4.10」になる。提出すると自動化された検証フローが始まり、完了すれば担当者がアサインされ、特に問題がなければそのまま取り込まれる。

テスト環境が整っていれば、マニフェストの更新から提出まで 15 ~ 30 分もあれば終わる。実際に更新されるまでには、1 日~ 5 日程度かかるWinGet に貢献してみたい! というかたは是非。

この記事を書いた人

AioiLight

Web とか Android とかをやってる人。アニメ・ゲームが好きなはずなのに消費しきれない毎日。

Twitter (@aioilight)