0Pricing
Learn Rust Coding · レッスン

デスクトップアプリをパッケージ化する

実行可能なバイナリを配布します。

「デスクトップアプリをパッケージ化する」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

デバッグビルドからリリースビルドへ

開発では、最適化されていないデバッグバイナリをビルドするcargo runを使います。配布する場合は、リリースビルドのcargo build --releaseを使います。

リリースビルドでは最適化が有効になり、デバッグ用のオーバーヘッドが削減されます。その結果、target/release/以下に、より小さく高速なバイナリが生成されます。

cargo build --release
# binary at target/release/my_app

バイナリを小さくする

eguiアプリはGPUバックエンドを静的リンクするため、大きくなることがあります。Cargo.tomlのリリースプロファイルでサイズを削減できます。

リンク時最適化、単一のコード生成ユニット、panic-abort、シンボルの削除を有効にすると、最終的な実行ファイルのサイズを数メガバイト削減できます。

[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
panic = "abort"
strip = true

Windowsでコンソールを非表示にする

Windowsでは、GUIアプリがコンソールウィンドウを起動しないようにする必要があります。crateのルートにwindows_subsystem属性を追加し、リリースビルド時だけ有効になるように設定してください。そうすれば、開発中は引き続きログを確認できます。

これを設定しないと、実行ファイルをダブルクリックしたときに、ウィンドウと一緒に黒いターミナルが一瞬表示されます。

#![cfg_attr(
    not(debug_assertions),
    windows_subsystem = "windows"
)]

fn main() -> eframe::Result<()> { /* ... */ }

ウィンドウアイコンを設定する

完成度の高いアプリでは、独自のウィンドウアイコンを設定します。起動時にPNGのバイト列を読み込み、RGBAにデコードして、NativeOptionsを通じてIconDataを渡してください。

include_bytes!を使って画像を埋め込むと、アイコンを単独のファイルではなくバイナリ内に含めて配布できます。

let icon = eframe::icon_data::from_png_bytes(
    include_bytes!("../assets/icon.png")
).unwrap();
let opts = eframe::NativeOptions {
    viewport: egui::ViewportBuilder::default().with_icon(icon),
    ..Default::default()
};

ビューポートを設定する

ViewportBuilderでは、ネイティブウィンドウの初期サイズ、最小サイズ、タイトル、サイズ変更の可否、装飾を設定できます。

適切なデフォルト値を設定し、初回起動時に小さすぎたり大きすぎたりするウィンドウではなく、使いやすいサイズでアプリが開くようにしてください。

let viewport = egui::ViewportBuilder::default()
    .with_inner_size([900.0, 600.0])
    .with_min_inner_size([400.0, 300.0])
    .with_title("My App");
let opts = eframe::NativeOptions { viewport, ..Default::default() };

アセットを埋め込む

単一ファイルで配布できるようにするには、include_bytes!やinclude_str!を使って、フォント、画像、設定を直接バイナリに埋め込みます。

これにより、リソース用のフォルダーを別途配布する必要がなくなり、作業ディレクトリが変わってもアプリが動かなくなる問題を防げます。

let font = egui::FontData::from_static(
    include_bytes!("../assets/Inter.ttf")
);
// register font in ctx.set_fonts(...)

macOSのアプリバンドル

macOSでは、単独のバイナリはクリックして起動できるアプリではありません。Info.plistと.icnsアイコンを含む.appバンドルが必要です。

cargo-bundleツールを使うと、この作業を自動化できます。Cargo.tomlの[package.metadata.bundle]セクションからメタデータを読み取って処理します。

[package.metadata.bundle]
name = "My App"
identifier = "com.example.myapp"
icon = ["assets/icon.icns"]
# then: cargo bundle --release

コード署名と公証

macOSでほかのマシンに配布するには、Developer ID証明書で署名し、Appleによる公証を受ける必要があります。そうしないとGatekeeperによってアプリがブロックされます。

codesignでバンドルに署名し、notarytoolで送信してチケットをstapleしてください。Windowsでも、Authenticode署名を付けるとSmartScreenの警告を避けやすくなります。

codesign --deep --force --options runtime \
  --sign "Developer ID Application: Name (TEAMID)" \
  MyApp.app

クロスプラットフォームビルド

eframeはプラットフォーム固有のGPUライブラリとウィンドウライブラリにリンクするため、OSごとにネイティブビルドが必要です。確実な方法は、CIランナーなどを使って、対象となる各OS上でビルドすることです。

crossのようなツールはLinux向けターゲットで役立ちますが、LinuxからmacOSやWindows向けのGUIバイナリを本格的にクロスコンパイルするのは不安定です。代わりに、マトリックス形式のCIビルドを使うことをおすすめします。

# GitHub Actions matrix
# runs-on: [ubuntu-latest, macos-latest, windows-latest]
cargo build --release

Webターゲット

eguiはWebAssemblyにもコンパイルできます。wasm32-unknown-unknownターゲットでビルドし、trunkでバンドルしてください。静的ホスティングできるHTML/JS/WASMの一式が生成されます。

同じAppコードを、eframe::WebRunnerを通じてブラウザー上で実行できます。アプリはcanvas要素にマウントされます。

rustup target add wasm32-unknown-unknown
trunk build --release
# outputs dist/ ready to host

配布前チェックリスト

配布する前に、サイズを小さくするようリリースプロファイルを調整し、Windowsのコンソールを非表示にし、アイコンとアセットを埋め込み、macOS向けにバンドルし、macOSとWindowsの両方で署名してください。

最終成果物は、開発用マシンではなくクリーンなマシンでテストしてください。実際のユーザーが遭遇する、システムライブラリの不足や未署名バイナリの警告を発見できます。

確認問題

windows_subsystem属性を追加するのはなぜですか?

まとめ

cargo build --releaseで配布用にビルドし、サイズを小さくするようリリースプロファイルを最適化して、Windowsのコンソールを非表示にします。ウィンドウアイコンとビューポートを設定し、include_bytes!でアセットを埋め込んで自己完結型のバイナリにします。

macOSではcargo-bundleでバンドルし、署名と公証を行います。クロスプラットフォーム対応のためにOSごとにCIでビルドし、WebAssembly向けにはtrunkを使います。最終成果物は必ずクリーンなマシンでテストしてください。これでeguiコースは完了です。

よくある質問

「デスクトップアプリをパッケージ化する」レッスンは無料ですか?

はい。「デスクトップアプリをパッケージ化する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「デスクトップアプリをパッケージ化する」で何を学びますか?

実行可能なバイナリを配布します。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「デスクトップアプリをパッケージ化する」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Immediate-Mode UIの基本
  2. ウィジェットとレイアウト
  3. アプリの状態を管理する
  4. デスクトップアプリをパッケージ化する
← Learn Rust Codingに戻る