Rust での winapp CLI の使用

このガイドでは、 winapp CLI と Rust アプリケーションを使用して、パッケージ ID を使用してデバッグし、アプリケーションを MSIX としてパッケージ化する方法について説明します。

完全な実際の例については、このリポジトリの Rust サンプル を確認してください。

パッケージ ID は、Windows app モデルの主要な概念です。 これにより、アプリケーションは特定のWindows API (通知、セキュリティ、AI API など) にアクセスでき、クリーンなインストール/アンインストール エクスペリエンスが提供されます。

標準の実行可能ファイル ( cargo build で作成されたものなど) にはパッケージ ID がありません。 このガイドでは、デバッグ用に追加し、配布用にパッケージ化する方法を示します。

[前提条件]

  1. Rust ツールチェーン: rustup または winget (または既にインストールされている場合は更新) を使用して Rust をインストールします。

    winget install Rustlang.Rustup --source winget
    
  2. winapp CLI: winget を使用して winapp ツールをインストールします (既にインストールされている場合は更新します)。

    winget install microsoft.winappcli --source winget
    

1. 新しい Rust アプリを作成する

まず、単純な Rust アプリケーションを作成します。

cargo new rust-app
cd rust-app

これを実行して、すべてが動作していることを確認します。

cargo run

出力は "Hello, world!" にする必要があります。

2. コードを更新して ID を確認する

アプリがパッケージ ID で実行されているかどうかを確認するように更新します。 これは、後の手順で ID が正しく動作していることを確認するのに役立ちます。 windows クレートを使用して、Windows API にアクセスします。

まず、次を実行して、 windows の依存関係を Cargo.toml に追加します。

cargo add windows --features ApplicationModel

これにより、Windows API バインドが ApplicationModel 機能と共に追加されます。これにより、ID を確認するために Package API にアクセスできるようになります。

次に、 src/main.rs の内容全体を次のコードに置き換えます。 このコードは、現在のパッケージ ID の取得を試みます。 成功した場合は、パッケージ ファミリ名が出力されます。それ以外の場合は、"パッケージ化されていません" が出力されます。

Note

完全なサンプルには、ID が存在する場合にWindows通知を表示するコードも含まれていますが、このガイドでは ID チェックに焦点を当てます。

use windows::ApplicationModel::Package;

fn main() {
    match Package::Current() {
        Ok(package) => {
            match package.Id() {
                Ok(id) => match id.FamilyName() {
                    Ok(name) => println!("Package Family Name: {}", name),
                    Err(e) => println!("Error getting family name: {}", e),
                },
                Err(e) => println!("Error getting package ID: {}", e),
            }
        }
        Err(_) => println!("Not packaged"),
    }
}

3. ID なしで実行する

次に、通常どおりにアプリをビルドして実行します。

cargo run

"パッケージ化されていません" という出力が表示されます。 これにより、標準の実行可能ファイルがパッケージ ID なしで実行されていることが確認されます。

4. winapp CLI を使用してProjectを初期化する

winapp init コマンドでは、アプリ マニフェストとアセットなど、必要なものがすべて一度に設定されます。 マニフェストは、API アクセスを許可するために使用Windowsアプリの ID (名前、発行元、バージョン) を定義します。

次のコマンドを実行し、プロンプトに従います。

winapp init

プロンプトが表示されたら、次を実行します。

  • パッケージ名: Enter キーを押して既定値を受け入れる (rust-app)
  • Publisher名: Enter キーを押して既定値をそのまま使用するか、名前を入力します
  • バージョン: Enter キーを押して 1.0.0.0 を受け入れる
  • 説明: Enter キーを押して既定値をそのまま使用するか、説明を入力します
  • SDK のセットアップ: [SDK をセットアップしない] を選択します (Rust では、C++ SDK ヘッダーではなく、独自の windows クレートが使用されます)

このコマンドは次の操作を行います:

  • Package.appxmanifestの作成 - アプリの ID を定義するマニフェスト
  • Assets フォルダーの作成 - MSIX パッケージ化とストアの申請に必要なアイコン

Note

管理されている SDK パッケージがないため、 winapp.yaml は作成されません。Rust は Cargo 経由で windows クレートを使用するため、 winapp restore/update が追跡するものはありません。

Package.appxmanifestを開いて、表示名、発行元、機能などのプロパティをさらにカスタマイズできます。

実行エイリアスの追加 (コンソール アプリの場合)

cargo newコンソール アプリを作成するため、マニフェストに実行エイリアスを追加する必要があります。 これを使用しない場合、 winapp run は AUMID アクティブ化を使用してアプリを起動します。これにより、新しいウィンドウが開き、コンソール アプリが終了するとすぐにウィンドウが閉じられ、出力が飲み込まれます。

エイリアスを使用すると、ユーザーは MSIX をインストールした後、任意のターミナルから名前でアプリを実行することもできます。 マニフェストは、ユーザーがrust-app.exeまたはrust-appとして呼び出すことができるrust-app.exe (既定ではプロジェクトの exe 名) などのエイリアスを登録します。

UI アプリ (独自のウィンドウをレンダリングする Rust アプリ) を構築する場合は、この手順をスキップします。 これらのアプリは、既定の AUMID 起動で正常に動作します。

エイリアスを追加します。

winapp manifest add-alias

これにより、uap5:ExecutionAliasPackage.appxmanifestエントリが追加されます。

5. ID を使用したデバッグ

アプリを完全にパッケージ化せずに ID (通知など) を必要とする機能をテストするには、 winapp runを使用します。 これにより、ビルド出力フォルダー全体が、実際の MSIX インストールと同様にルーズ レイアウト パッケージとして登録され、アプリが起動されます。 デバッグに証明書や署名は必要ありません。

  1. 実行可能ファイルをビルドします

    cargo build
    
  2. ID を使用して実行する:

    winapp run .\target\debug --with-alias
    

--with-alias フラグは、実行エイリアスを使用してアプリを起動し、コンソール出力が現在のターミナルに留まります。 これには、手順 4 で追加した uap5:ExecutionAlias が必要です。

Note

winapp run は、パッケージをシステムに登録します。 このため、手順 6 で後でインストールしようとすると、MSIX が "既にインストール済み" と表示されることがあります。 完了したら、 winapp unregister を使用して開発パッケージをクリーンアップします。

次のような出力が表示されます。

Package Family Name: rust-app_12345abcde

これにより、アプリが有効なパッケージ ID で実行されていることを確認できます。

ヒント

高度なデバッグ ワークフロー (デバッガーのアタッチ、IDE セットアップ、スタートアップ デバッグ) については、 デバッグ ガイドを参照してください。

6. MSIX を使用したパッケージ化

アプリを配布する準備ができたら、同じマニフェストを使用して MSIX としてパッケージ化できます。 MSIX では、クリーン インストール/アンインストール、自動更新、および信頼できるインストール エクスペリエンスが提供されます。

パッケージ ディレクトリを準備する

まず、最適なパフォーマンスを得るためのリリース モードでアプリケーションをビルドします。

cargo build --release

次に、配布に必要なファイルのみを含むディレクトリを作成します。 target\release フォルダーには、アプリの一部ではないビルド成果物が含まれています。実行可能ファイルのみが必要です。

mkdir dist
copy .\target\release\rust-app.exe .\dist\

開発証明書を生成する

MSIX パッケージに署名する必要があります。 ローカル テストの場合は、自己署名開発証明書を生成します。

winapp cert generate --if-exists skip

Important

証明書の発行者は、Package.appxmanifest 内の Publisher と一致する必要があります。 cert generate コマンドは、マニフェストからこれを自動的に読み取ります。

署名とパッケージ

これで、パッケージ化して 1 つの手順でサインインできるようになりました。

winapp pack .\dist --cert .\devcert.pfx 

注: pack コマンドは、現在のディレクトリから Package.appxmanifest を自動的に使用し、パッケージ化する前にターゲット フォルダーにコピーします。 生成された .msix ファイルは現在のディレクトリにあります。

証明書をインストールする

MSIX パッケージをインストールする前に、コンピューター上の開発証明書を信頼する必要があります。 このコマンドを管理者として実行します (証明書ごとに 1 回だけ実行する必要があります)。

winapp cert install .\devcert.pfx

インストールと実行

Note

手順 5 で winapp run を使用した場合は、パッケージがシステムに既に登録されている可能性があります。 最初 winapp unregister 使用して開発登録を削除してから、リリース パッケージをインストールします。

生成された .msix ファイルをダブルクリックするか、PowerShell を使用してパッケージをインストールします。

Add-AppxPackage .\rust-app.msix

次のように入力して、ターミナル内の任意の場所からアプリを実行できるようになりました。

rust-app

"パッケージ ファミリ名" の出力が表示され、インストールされ、ID で実行されていることを確認します。

ヒント

(コード変更後など) アプリを再パッケージ化する必要がある場合は、Versionをもう一度実行する前に、Package.appxmanifestwinapp packをインクリメントします。 Windowsインストールされているパッケージを更新するには、より高いバージョン番号が必要です。

ヒント

  1. 配布の準備ができたら、証明機関のコード署名証明書を使用して MSIX に署名できるため、ユーザーは自己署名証明書をインストールする必要がありません
  2. Microsoft Storeは MSIX に署名します。送信前に署名する必要はありません。
  3. サポートするアーキテクチャごとに 1 つずつ、複数の MSIX パッケージを作成する必要がある場合があります (x64、Arm64)

次のステップ

  • winget を使用して配布: MSIX を Windows パッケージ マネージャー Community Repository に送信します
  • Microsoft Store に発行する: を使用してパッケージを送信する
  • CI/CD の設定: setup-WinAppCli GitHub Action を使用して、パイプライン内のパッケージングを自動化します
  • Explore Windows API: パッケージ ID を使用して、 これで、Notificationson-device AI、およびその他の identity 依存 API