wails について
wailsは、Wailsを使ってデスクトップアプリを開発するためのスキルです。WebViewフロントエンドとGoのバインディングを扱い、プロジェクト作成から実行時API、ビルド、プラットフォーム別のパッケージ化まで案内します。
主な機能
- 01プロジェクトの初期化とテンプレート選択
- 02ライブリロードを使った開発
- 03本番アプリのバイナリビルド
- 04ウィンドウ、イベント、ダイアログAPIの利用
- 05プロジェクト設定とプラットフォーム別の問題解決
活用シーン
- 01テンプレートからGoデスクトップアプリを作成
- 02Wailsの開発やビルドの問題を解決
- 03フロントエンド開発サーバーと実行時呼び出しを設定
- 04プラットフォーム別パッケージとコード署名を準備
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ codegirl-007/ aiplatform --skill wailsインストール後、Claude Code で/wailsを入力して読み込まれたか確認します。
詳細
できること
- Wails の前提条件(Go、Node/NPM、プラットフォーム依存関係)をセットアップして検証します
wails initでプロジェクトを作成し、テンプレートやフレームワークを選択しますwails devを使った開発ワークフローを実行し、ライブリロードやブラウザーモードについて説明しますwails buildとプラットフォーム固有のフラグを使って、本番用バイナリをビルドします- ランタイム API(ウィンドウ、メニュー、ダイアログ、イベント、ログ、ブラウザー、クリップボード、画面、ドラッグ&ドロップ)を使用します
- 必要に応じて
wails.jsonとアプリケーションオプションを設定します - フロントエンドのスクリプト挿入ルールと外部開発サーバーの設定を適用します
- プラットフォーム固有のパッケージ化、署名、トラブルシューティングに関するガイドを使用します
- CLI、オプション、メニュー、プロジェクト設定、ランタイムのリファレンスを案内します
使う場面
Wails アプリの作成、ローカル開発、ビルドの問題、CLI の使用には、このスキルを使ってください。 プラットフォーム、テンプレート、または Wails のバージョンが不明な場合は、確認の質問をしてください。
ワークフロー
- 対象の OS と Wails のバージョンを確認します。
- 前提条件として、Go 1.21 以降、Node/NPM、プラットフォーム依存関係(xcode、WebView2、GTK/WebKit)を確認します。
- 新しいアプリの場合は、テンプレートを選び、
wails init -n <name> -t <template>を実行します。 - 開発時は
wails devを使い、http://localhost:34115のブラウザー開発サーバーについて説明します。 - ビルド時は
wails buildを使います。新しいディストリビューションの Linux で必要な場合は、-tags webkit2_41を追加します。 - ランタイムを使用する場合は、Go のランタイムパッケージ
github.com/wailsapp/wails/v2/pkg/runtimeまたは JS のwindow.runtimeを使います。 - イベントには、Go と JS の連携に
EventsOn、EventsOnce、EventsOnMultiple、EventsOff、EventsEmitを優先して使います。 - 問題が発生した場合は、
wails doctorを実行して不足している依存関係を解決します。
アーキテクチャ
- Wails は、WebView フロントエンドと共有ランタイムライブラリを備えた Go アプリです。
- Go のメソッドはバインドされ、自動生成された
wailsjsモジュールを通じて JS に公開されます。 - ランタイムメソッドは、Go では
runtime、JS ではwindow.runtimeを通じて利用できます。
主なコマンド
go install github.com/wailsapp/wails/v2/cmd/wails@latest
wails doctor
wails init -n myproject -t <template>
wails dev
wails build
CLI の概要
wails init:-tでテンプレート(ローカルまたはリモートの GitHub URL)、-nで名前、-dでディレクトリ、-ideを指定します。wails dev:-assetdir、-wailsjsdir、-frontenddevserverurl、-browser、-loglevelを指定します。wails build:-platform、-tags、-obfuscated、-upx、-nsis、-devtools、-debugを指定します。wails generate module:開発モードを実行せずにwailsjsを再生成します。wails generate template:フロントエンドプロジェクトからテンプレートを作成するか、派生させます。
ランタイム API マップ
- イベント:
EventsOn、EventsOff、EventsOnce、EventsOnMultiple、EventsEmit。 - ログ:
LogTrace、LogDebug、LogInfo、LogWarning、LogError、LogFatal、LogSetLogLevel。 - ウィンドウ:タイトル、サイズ、位置、全画面表示/最大化/最小化、表示/非表示、再読み込み、JS の実行。
- ダイアログ:ファイルを開く/保存するダイアログ、メッセージダイアログ(Go のみ)。
- メニュー:アプリケーションメニューの設定/更新(Go のみ)。
- ブラウザー:システムブラウザーで URL を開きます。
- クリップボード:テキストの取得/設定。
- 画面:接続された画面の一覧を取得します。
- ドラッグ&ドロップ:
OnFileDrop、OnFileDropOff(EnableFileDropが必要です)。
設定とオプション
wails.json:フロントエンドのディレクトリ/ビルドスクリプト、assetdir、再読み込み対象のディレクトリ、開発サーバー URL、出力名、ビルドタグ、フック、情報/関連付け/プロトコル、バインディングの TS 生成。- アプリオプション:ウィンドウサイズ、フレーム、起動状態、背景、常に最前面に表示、メニュー、ログ、コールバック、バインディング、単一インスタンスロック、ドラッグ&ドロップ、デフォルトのコンテキストメニュー、不正検知。
- OS 固有のオプション:Windows(WebView2、テーマ、背景、ズーム)、Mac(タイトルバー、外観、透明度、概要)、Linux(アイコン、GPU ポリシー)。
フロントエンドの統合
- デフォルトのスクリプト挿入では、
index.htmlに/wails/ipc.jsと/wails/runtime.jsを追加します。 <meta name="wails-options" content="noautoinject">を使うと自動挿入を無効にでき、手動で挿入できます。- 外部開発サーバー(例:CRA)では、
frontend:dev:watcherとfrontend:dev:serverUrlを設定します。
ガイドの要点
- Angular:
ng用にfrontend:build、frontend:install、frontend:dev:watcher、frontend:dev:serverUrlを設定します。 - ルーティング:ハッシュベースのルーティングを推奨します(Vue の hash、Angular の useHash、React の HashRouter、Svelte の SPA router)。
- フレームレス:
Frameless: trueを設定し、--wails-draggable:dragと--wails-draggable:no-dragを使用します。 - オーバースクロール:
html { height: 100%; overflow: hidden; }でバウンスを無効にします。 - 動的アセット:フォールバック/動的コンテンツの配信には
AssetServer.Handlerを使用します(Vite v5 の警告に注意してください)。 - 難読化:
wails build -obfuscatedを使用し、必要に応じて-garbleargsを指定します。また、wailsjsバインディングを使用します。 - 単一インスタンスロック:
UniqueIdとOnSecondInstanceLaunchを設定したSingleInstanceLockを使用します。 - カスタムプロトコルとファイル関連付け:
info.protocols/info.fileAssociationsを定義し、プラットフォームごとの設定を行います。 - NSIS インストーラー:NSIS をインストールし、
wails build -nsisでビルドします。 - Wails の master/PR でのローカル開発:クローンしたリポジトリから
go installを実行し、go.modでreplaceを使用します。 - Linux に関する注意:ディストリビューションのパッケージサポート、メディア用の GStreamer プラグイン、NixOS でのフォントサイズの回避策。
- IDE:
-ide vscodeまたは-ide golandを指定します。フロントエンドのビルドに合わせて VS Code のタスクを調整します。 - チュートリアル:Hello World と Dogs API で基本的な初期化/ビルド/開発の流れを確認できます。
手順別ガイド
Angular 開発サーバー
wails.jsonでfrontend:buildをnpx ng buildに、frontend:installをnpm installに設定します。frontend:dev:watcherにnpx ng serve、frontend:dev:serverUrlにhttp://localhost:4200を追加します。wails devを実行します。
SvelteKit の統合
wails init -n <name> -t svelteを実行します。frontend/を削除し、npx sv create frontendを実行します。wails.jsonに"wailsjsdir": "./frontend/src/lib"を追加し、パッケージマネージャーのコマンドを更新します。main.goの//go:embed all:frontend/distを//go:embed all:frontend/buildに変更します。.gitignoreのfrontend/distをfrontend/buildに変更します。frontend/で依存関係をインストールし、アダプターを@sveltejs/adapter-staticに置き換えます。src/routes/+layout.tsを追加し、export const prerender = trueとexport const ssr = falseを記述します。wails devを実行します。
フレームレスウィンドウのドラッグ領域
options.AppでFrameless: trueを設定します。- コンテナーに
--wails-draggable:dragを使用します。 - 操作可能な要素に
--wails-draggable:no-dragを使用します。 - CSS 変数を使用できない場合は、options で
CSSDragPropertyとCSSDragValueを設定します。
動的アセット
options.AppでAssetServer.Handlerを設定します。- ハンドラーで存在しないアセットを配信するか、GET 以外のリクエストを処理します。
- 認可チェックなしで任意のファイルシステムパスを公開しないでください。
難読化ビルド
wails build -obfuscated(必要に応じて-garbleargs)でビルドします。- フロントエンドからの呼び出しには、
window.goの名前ではなく、生成されたwailsjsバインディングを使用してください。
単一インスタンスロック
- UUID の
UniqueIdを指定してSingleInstanceLockを追加します。 OnSecondInstanceLaunchを使って引数を処理し、ウィンドウを前面に表示します。- 2 番目のインスタンスからのデータは信頼できない入力として扱います。
カスタムプロトコル
wails.jsonにscheme、description、roleを含むinfo.protocolsを追加します。- macOS:
Mac.OnUrlOpenを処理します。 - Windows:NSIS インストーラーを使用し、コマンドライン引数を解析するか、単一インスタンスロックを使用します。
- Linux:パッケージ化を通じて
.desktopファイルと mime エントリーを作成します(例:nfpm)。
ファイル関連付け
wails.jsonにext、name、iconName、description、roleを含むinfo.fileAssociationsを追加します。- macOS:
Mac.OnFileOpenを処理します。 - Windows:NSIS インストーラーを使用し、引数を解析するか、単一インスタンスロックを使用します。
- Linux:mime ファイル、デスクトップエントリー、アイコン、パッケージ用スクリプトを作成します。
NSIS インストーラー
- NSIS をインストールします(scoop/winget/choco/brew)。
wails.jsonの情報をbuild/windows/installerに設定します。wails build -nsisを実行し、build/binの出力を使用します。
Wails master/PR を使ったローカル開発
github.com/wailsapp/wailsをクローンし、対象のブランチ/PR をチェックアウトします。cd v2/cmd/wails && go installを実行します。- アプリの
go.modにreplace github.com/wailsapp/wails/v2 => <clonedir>/wails/v2を追加します。 - 元に戻すには、CLI を
@latestから再インストールし、replace を削除します。
拡張ガイド
コード署名(Windows)
- .pfx/.p12 証明書を Base64 エンコードし、GitHub Actions のシークレットとして保存します。
- CI でアプリをビルドし、
signtool.exeを/fd sha256およびタイムスタンプサーバーとともに使用します。 - Actions を使用する場合は、署名のステップが
wails buildの後に実行されるようにします。
コード署名(macOS)
- Apple Developer 証明書(.p12)を書き出し、Base64 エンコードします。
- 署名と公証には
gonを使用します。build/darwin/gon-sign.jsonとエンタイトルメントを設定します。 Apple-Actions/import-codesign-certs@v1を使って証明書を読み込み、その後gonを実行します。
Mac App Store への提出
- App ID、証明書、プロビジョニングプロファイル、App Store Connect のエントリーを作成します。
- App Sandbox の設定を含む
build/darwin/entitlements.plistを追加します。 wails build -platform darwin/universalでビルドと署名を行い、その後codesignとproductbuildを実行します。- Transporter 経由でアップロードし、App Store Connect でビルドを添付します。
GitHub Actions を使ったクロスプラットフォームビルド
linux/amd64、windows/amd64、darwin/universalのマトリックスを使用します。- Node と Go の依存関係をキャッシュします。必要に応じて
NODE_OPTIONS=--max-old-space-size=4096を設定します。 wails build(またはdAppServer/wails-build-action)を実行し、build/bin/*をアップロードします。
WebView2 の戦略(Windows)
wails build -webview2 <download|embed|browser|error>を使用します。- ランタイムを固定する場合は、
WebviewBrowserPathを設定し、ランタイムをバンドルします。 - 管理者として実行する場合は、
WebviewUserDataPathを共有の場所に設定します。
手動ビルドの手順(分解)
- フロントエンドの依存関係をインストールします(
-sが指定されている場合、またはfrontend:installがない場合を除く)。 - フロントエンドをビルドします(
-sが指定されている場合、またはfrontend:buildがない場合を除く)。 - アセット/アイコンを生成します(Windows では winicon と winres を使用します)。
- Go をコンパイルします(開発時は
-tags devと-gcflags、本番時は-tags desktop,productionを使用します)。 - 必要に応じて UPX で圧縮します(
-upx)。
テンプレート
wails generate template -name <name>でテンプレートのひな形を作成します。- 既存のフロントエンドを使う場合は、
-frontendでパスを指定し、テンプレートファイルを更新します。 wails init -t <path>を実行してからwails buildでテストします。- GitHub に公開し、Community Templates に提出します。
IDE のセットアップ
wails init -ide vscodeまたは-ide golandを使用します。- VS Code の場合は、
.vscode/tasks.jsonを更新してフロントエンドのインストール/ビルド手順を含めます。 - Vue と Vetur を使用する場合は、
frontend/を指すvetur.config.jsを追加します。
トラブルシューティングの要点
- 画面が白くなる場合:
//go:embed all:frontend/distとfrontend/dist内のアセットを確認します。 - macOS で画面が真っ白になる場合:
Info.plistにNSAllowsLocalNetworkingを追加します。 - Windows のアイコンキャッシュ:
%LOCALAPPDATA%/IconCache.dbを削除します。 - 可変長引数:スプレッド構文を使わず、配列をバックエンドに渡します。
- バインディングで停止する場合:
wails.Run()の後にアプリが終了することを確認します。 - macOS のコンパイルエラー:Xcode CLI ツールを更新するか、ツールチェーンのパスを切り替えます。
- WebView2 が見つからない場合:正しいアーキテクチャのランタイムをインストールします。
ルーティングのパターン
- Vue:
createWebHashHistory()。 - Angular:
RouterModule.forRoot(routes, { useHash: true })。 - React:
HashRouter。 - Svelte:
svelte-spa-router。
マウスボタン(フレームレスアプリ)
mousedownリスナーを使い、event.buttonを調べてボタンのインデックスを確認します。
NixOS のフォントサイズの不具合
devShellフックにXDG_DATA_DIRSとGIO_MODULE_DIRを追加します。
メモ
- Wails は、フロントエンドから呼び出すための Go バインディングと TypeScript モデルを生成します。
- プロジェクトの構成には、
main.go、frontend/、build/、wails.jsonが含まれます。 - ランタイムメソッドには、
OnStartupまたはOnDomReadyから取得したコンテキストが必要です。 - Go または JavaScript から、オプションのデータペイロードとともにイベントを送信できます。
- 手動ビルドは、インストール → フロントエンドのビルド → アセットの生成 → コンパイル → 必要に応じて UPX の順に行います。
- Windows WebView2 は、
-webview2の戦略または固定ランタイムで対応できます。 - コード署名、Mac App Store への提出、GitHub Actions でのビルドにはガイドを使用してください。
- 詳細については、CLI、オプション、メニュー、プロジェクト設定、ランタイムのリファレンスを参照してください。
コメント
Markdown 対応