ADR 0024: 音源が無いときは Surge XT を winget でインストールする案内を出す
- 状態: 採用。
- 決定者: user。表示条件、昇格をインストーラに任せること、断っても毎回出すこと、日本語フォントをダイアログ表示時だけ読むこと、
言語の自動判別、文章を最小にすること、利用規約リンクと「利用規約に同意してインストールする」ボタン、
インストール後の自動読み込みまでをインストール処理に含めることを承認。
決定
- 検出が成功し、
kind == Instrument が0件のとき、ダイアログで Surge XT のインストールを勧める。
断った記録は持たず、音源が無い間は起動のたびに出す。
- 文言は Windows の UI 言語(
GetUserDefaultUILanguage)が日本語なら日本語、それ以外は英語の1言語だけにする。
本文は1文にし、Surge XT の利用規約(winget マニフェストの LicenseUrl)へのリンクと、
「利用規約に同意してインストールする」「あとで」のボタンを置く。
winget install --id SurgeSynth.SurgeXT -e --source winget --silent --disable-interactivity --accept-package-agreements --accept-source-agreements を別スレッドで実行する。
winget は通常権限で起動し、管理者への昇格はインストーラ自身の UAC に任せる。終了コード0なら再スキャンし、
見つかった Surge XT(CLAP)を読み込む。この回は保存済みの前回の音源とeffectを復元せず、復元先も消す。
- winget の標準出力を行ごとに読み、「1/4 準備」「2/4 ダウンロード」「3/4 インストール(確認画面で『はい』)」
「4/4 読み込み」と経過秒数を出し、読み込みが終わったら閉じる。
インストーラの URL を含む行でダウンロード開始、その次の行でダウンロード終了とみなす。
失敗時は winget の最後の行と終了コードを出す。
- 日本語フォントは、日本語でダイアログを出すときだけ
C:\Windows\Fonts の meiryo.ttc(無ければ msgothic.ttc)を fallback として足す。
理由
- 勧める音源を Surge XT にしたのは、無料・GPLv3 で winget に載っており、このアプリが専用処理(ADR 0007・0008)と Random patch の候補(ADR 0014)を既に持つため。
- winget のマニフェストに
Scope も ElevationRequirement も無く、インストール先は C:\Program Files\Common Files なので昇格が要る。
インストーラの UAC に任せれば、追加の Windows API も昇格プロセスの終了コード取得も要らない。
- 同意してから UAC が出るまで、ダウンロードで約20秒かかる(実測)。この間に何も出ないと、止まったように見える。
- パイプで受けた winget はバイト単位の進捗を出さず、文言は Windows の言語で変わる。行の順序なら言語に依存せずに段階を判定できる。
- フォントを常に読むと、毎回の起動にフォント読込が加わる。
- インストールで終わると、初心者は一覧から
Load を探す必要がある。読み込めば Load と同じく演奏が始まる。
- 読み込み中に前回の復元も走らせると、
load_plugin が読み込み中を理由に戻り、restoring が立ったまま残る。
却下案
- 日本語と英語の併記: 読む量が倍になり、初心者に分かりやすいという方針に合わない。
- 手順・インストール先・コマンドをダイアログに並べる: 読む量が増える。コマンドはボタンの tooltip に置く。
- winget を ShellExecute の
runas で昇格して起動する: 確実に昇格するが、FFI と終了コード取得の手間が増える。インストーラの UAC が出ないと分かった場合の代替として残す。
- 一度断ったら出さない: 保存項目と、後から入れる入口が別に要る。音源を入れれば出なくなるので不要。
結果
- winget 1.29 と Surge XT 1.3.4 で、2/4・3/4・4/4 の表示が切り替わり、インストーラ自身の UAC から昇格して終了コード0で終わり、
再スキャン後に Surge XT が読み込まれて音が鳴ることを確認した。
- Surge XT が既に入っていると winget は
0x8A15002B を返し、失敗として案内と error.log に出る。
- ダウンロードの割合は出ない。winget が無い環境では手動ダウンロード先の案内になる。
- 種類が分からない(
Unknown)プラグインだけの環境でも表示される。