Windowsパッケージマネージャのパッケージの作成


インマイprevious articles about winget パッケージのインストールについて話しましたが、Windowsパッケージマネージャのパッケージの作成については話しませんでした.それで、物事を正しく設定しましょう.

Wingetパッケージについて


Windowsパッケージマネージャーを使用すると、Wingetツールで使用するように構成されているソースによって参照されるアプリケーションを検索およびインストールできます.ソースは、Wingetによってインストールされるアプリケーションと、それらがインストールされるのに必要なデータをリストするリポジトリです(例えばパッケージのインストーラ位置などの情報を含むマニフェストファイルの形式で).デフォルトのソースはWindows Package Manager Community Repository これは、誰もがWindowsパッケージマネージャのユーザーにインストール用にアプリケーションを利用できるように、アプリケーションパッケージマニフェストを提出することができます.

したら、Windowsパッケージマネージャーを介してWindows上で配布するアプリケーションの開発者であれば、アプリケーションのマニフェストを作成し、Windowsパッケージマネージャーコミュニティリポジトリにプル要求を介して発行する必要があります.新しいバージョンのアプリケーションをリリースするたびに、新しいパッケージのバージョン(新しいバージョン番号、新しいインストーラの場所…)の情報を使用してアプリケーションマニフェストを更新する必要がありますそして、あなたのマニフェストのこの更新されたバージョンでWindows Package ManagerコミュニティリポジトリにPRを作成します.詳細については、公式を見て見ることができますdocumentation
パッケージの作成者として、おそらく作成し、手動でこのアプリケーションマニフェストを更新する必要はありません.幸いにもあなたのためにそれを行うためのツールです.

WingetCreateを救出する


紹介WingetCreate


Windows Package Manager Manifest Creator 別名WingetCreateは「コミュニティRepoのためにマニフェストファイルを生成するか、更新するのを助けるようになっている」(WingetCreateリポジトリのReadMeを引用している)ツールです.書き込み時にはまだプレビューされていますが、マニフェストファイルを支援するために使用することができます.インストーラをダウンロードできますthis link しかし、もちろんWingetから入手できます.winget install wingetcreate .
メインコマンドはNew , Update and Submit .

新しいコマンド


それはあなたがゼロから新しいマニフェストを作成することができます.マニフェストファイルをどこで始めようとしているのかわからない場合は、始めるのに良い方法です.しかし、既存のマニフェストを見てwinget community repository 時々より効率的でありえます.

更新コマンド


既存のマニフェストを更新することができます.これは、アプリケーションの新しいバージョン(新しいバージョン番号と新しいインストーラーURL)をリリースしたときに、マニフェストの更新されたバージョンを作成するためです.このコマンドはsubmit Windowsパッケージマネージャーコミュニティリポジトリにアップデートされたパッケージ.私の意見では、それはあなたのインストーラを公開するビルドパイプラインで簡単に統合できるようにWingetCreateから最も有用なコマンドです.

送信コマンド


Windowsパッケージマネージャーコミュニティリポジトリに、既存のマニフェストを作成することができます.基本的にそれは、このリポジトリでマニフェストを使用してプル要求を作成するためにそれを与えるGithub個人アクセストークンを使用します.

他に何か


あなたが見るならばsettings command Githubリポジトリの名前をあなたのパッケージ提出の対象とすることができます.あなたがあなたのビジネスニーズに関連したアプリケーションを公開するだけで、あなたが公的に利用できるようにしたくないところであなたの組織に利用可能なWingetのための個人的な源を主催したいなら、これは本当に面白いです.
WingetCreateは、Wingetパッケージのマニフェストを作成、更新、検証するのに本当に役立つツールです.まだ新しいパッケージ版をリリースするたびに、WingetCreateを手動で実行したくないでしょう.では、Githubの動作を自動化する方法を見てみましょう.

Githubアクションでアプリケーションマニフェストのアップグレードを自動化する


なぜGithubアクションを使用してアプリケーションマニフェストのアップグレードの自動化を示すか?



私の毎日の仕事では、azureパイプラインはCI/CDをするために使用されたパイプラインであり、彼らは素晴らしいです.現在、彼らはGithubアクションより多くの機能を提供しています、そして、私が開発するコードがAzure Reposでホストされるとき、それはAzure devopsをビルトインCCI/CDツールを何か他のものより使用するのにより意味があるようになります(Azure Devopsは彼らのツールを選ぶすべてでは強制されません).しかし、WingetCreateのReadMeのセクションには、Azureパイプラインを使用してWingetCreateを使用する例のリンクがありますが、Githubアクションの例はありません.
さらに、Wingetパッケージとして利用可能な、あるいは利用可能な多くのアプリケーションは、Githubリポジトリ内でコードがホストされ、既にCITHUBアクションを使用しているオープンソースアプリケーションです.Githubが「リリース」という概念を持っているので、特にGitHubアクションでWingetCreateを使用する例があるかもしれません.

NuShellの面白いユースケース


Nushell クロスプラットフォームシェル錆で書かれています.Nushellの開発者は既存のシェル(PowerShellからの構造化データアプローチのような)を最大限に利用し、現代的で使いやすく、非常に有用なシェルを作成しました.
があったGitHub issue 新しい公式Windowsパッケージマネージャをサポートするために、私はそれがnushellに貢献する機会であったけれども.このプロジェクトに貢献していたのは、私がまだできなかったことでした.錆を知らなかったので、Ci/Cdパイプラインを書くことができます.

NuShellは既に連続した統合のためにGithubアクションを使用し、リリースを作成します.あなたがgithubリリースに慣れていないならば、あなたはofficial documentation しかし、基本的にリリースは、リリースノートとバイナリファイルで利用できるソフトウェア(リポジトリ内のGitタグに対応する)のバージョンです.

そのため、NuShellの最新バージョンでNuShellマニフェストを更新することにしましたWingetCreate NuShellの新しいリリースが発行されるたびに.

リリースイベントから新しいワークフローをトリガーする


アプリケーションのマニフェストをアップグレードNuShellのアップグレードだけではjob コールされるGithub actionワークフローでWingetCreate 新しいバージョン番号と新しいインストーラURLで.
私は最初のリリースを作成していた既存のNuShellのGithubアクションのワークフローを変更するにはjob リリース直後にワークフローの終了時に作成されました.まあ、これは悪い考えだった、私はこの変更を押して、NuShellの次のリリース中にワークフローが失敗したので、ワークフローは、ドラフトでリリースを作成していたので、新しいバージョンのインストーラのURLは、私の仕事はWingetCreate .
そのため、私はNuShellのリリースが発行されるたびに起動される別のワークフローを作成することを決めた.NuShellでは、これは手動で行われます(ドラフトからリリースへの移行)しかし、たとえそれがリリースワークフローによって自動的にされたとしても、私はリリースの公表によって引き起こされる特定のワークフローを持つことがより良い考えであると思います.
name: Submit Nushell package to Windows Package Manager Community Repository 

on:
  release:
    types: [published]

jobs:

  winget:
    name: Publish winget package

私は、多くの異なったGithubイベントに引き金をかけるGithubアクションでそれが可能である方法が本当に好きです.それはazureパイプラインでより制限されるようです.

GithubアクションのワークフローからWingetCreateを呼び出す。


Windows Package Managerマニフェストの作成者はWindowsで実行する必要があるので、NewShellパッケージの新しいバージョンをWindows Package Managerコミュニティリポジトリに提出するジョブで指定する必要があります.
jobs:

  winget:
    name: Publish winget package
    runs-on: windows-latest

このジョブは、呼び出すコマンドの実行であるWingetCreate . これがデフォルトのランナーであるので、これらのコマンドはPowerShellになりますpwsh ) Windowsの仕事で.
  winget:
    name: Publish winget package
    runs-on: windows-latest
    steps:
      - name: Submit package to Windows Package Manager Community Repository
        run: |

最初の最新バージョンをダウンロードする必要がありますWingetCreate 次のコマンドを使用します.
iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe

次に、新しいパッケージのバージョン番号とインストーラURLを取得します.これらの2つの情報はWingetCreate Updateコマンドへのパラメータとして必要です.ワークフローを引き起こしたリリースイベントを含むGithubコンテキストでこれらを見つけることができます.私たちは、PowerShellのこれらの2行を使用して、NushellのWindowsインストーラであるMSIファイル上のリリースとフィルターに関連する資産を取得します.
$github = Get-Content '${{ github.event_path }}' | ConvertFrom-Json
$installerUrl = $github.release.assets | Where-Object -Property name -match 'windows.msi' | Select -ExpandProperty browser_download_url -First 1

💡 I just though that instead of doing this in PowerShell we could have done this in Nushell, which would have been fun 'using Nushell to provide a new version of Nushell' but as it is not installed by default on windows agents it would mean a loss of time each time the workflow runs.


第三に、我々はWingetCreate バージョンを指定することによりコマンドを更新し、インストーラのURLと、WingetCreate Windowsパッケージマネージャーコミュニティリポジトリでプル要求を作成します.このPATは、許可のある管理者の管理者によって作成され、プロジェクトの秘密に追加される必要があります.

Githubのワークフローの実行を見ることができます.

作成されたワークフローの概要


以下の完全なワークフローを見つけることができますhere である.
name: Submit Nushell package to Windows Package Manager Community Repository 

on:
  release:
    types: [published]

jobs:

  winget:
    name: Publish winget package
    runs-on: windows-latest
    steps:
      - name: Submit package to Windows Package Manager Community Repository
        run: |
          iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
          $github = Get-Content '${{ github.event_path }}' | ConvertFrom-Json
          $installerUrl = $github.release.assets | Where-Object -Property name -match 'windows.msi' | Select -ExpandProperty browser_download_url -First 1
          .\wingetcreate.exe update Nushell.Nushell -s -v $github.release.tag_name -u $installerUrl -t ${{ secrets.NUSHELL_PAT }}

ここでは、Githubアクションのワークフローによって生成されるプル要求は次のようになります.

まとめる


Wingetパッケージのソースの概念を紹介しました.特にWindowsパッケージマネージャーコミュニティリポジトリでは、既存のアプリケーションの新しいアプリケーションや新しいバージョンを送信するためにPRを開くことができます.Windowsパッケージマネージャのマニフェストの作成者がどのようにしてそれを行うのか、また、Nushellプロジェクトのために行われたように、Githubアクションのワークフローからどのように自動化されるかを見ることができました.
私が示したGithubアクションのワークフローの一部をコピーすることを躊躇しないでください.私は、これがWingetを通してあなたのアプリケーションを分配するために同じようにするようにあなたに刺激することを望みます.
PowerShellでGithubアクションコンテキストを取得する方法を説明した人に感謝します.また、WingetのNuShellの新しいリリースを発表するワークフローをセットアップするようサポートしてくれました.