🍎

`deno compile --no-terminal`を使いたいときはmacOSを使おう

2023/12/18に公開

この記事は、Deno Advent Calendar 2023の18日目です。
https://qiita.com/advent-calendar/2023/deno

deno compileとは

Deno本体が有する、JavaScirptファイルを単一実行可能ファイルにコンパイルするコマンドです。

https://docs.deno.com/runtime/manual/tools/compiler

--targetを付与することでWindowsやmacOS、Linux向けにコンパイルできるため、コンパイルするのにわざわざそのOSを用意する必要もありません。
--includeを付与することでWorkersを含めてコンパイルすることもできます。
詳細は上記の公式ドキュメントを御覧ください。

ちなみに、Node.jsもv19.7.0で単一実行可能ファイルのコンパイルに対応しました。
これはNode.jsのリリースもやられているRuy Adornoさんのスライドにも書かれています。

https://speakerdeck.com/ruyadorno/the-node-dot-js-runtime-renaissance?slide=56

担当チームのブログでは、Denoが引き合いに出されていました。

deno compile --no-terminalとは

デフォルトでは、Windowsに向けてdeno compileをするとターミナルが背後に表示されるようになっています。

Untitled

これはWindowsの単一実行ファイルのヘッダーにあるSubsystemフィールドの部分が2になっていなかったのが原因のようで、以下のPRで修正され、v1.36.0--no-terminalが追加されました。

https://github.com/denoland/deno/pull/17991

しかし、v1.39.0現在、このフラグは正常に動作していません。

WindowsとWSLで--no-terminalをつけるとアプリが表示されない

検証当時はv1.38.0で、Ubuntu on WSL 2でコンパイルしたところ発覚したためIssueを提出しました。

https://github.com/denoland/deno/issues/21091

その後、v1.39.0とリリース時のv1.36.0でコンパイル結果を確認しましたが、私の環境下ではWindows 10とUbuntu on WSL 2でアプリが表示されないという事象が確認されました。
macOSであれば問題ないようです。

https://github.com/denoland/deno/issues/21091#issuecomment-1859182338

GitHub Actionsで解決

せっかくdeno compileが手持ちのOSに依存しない仕組みになっていても、ここで『macOSでしか--no-terminalが動かないから実機を準備』となっては意味はありません。
そこで、手元にないmacOS環境に頼ります。

https://docs.github.com/ja/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources

GitHub ActionsはmacOSをサポートしているため、わざわざ実機を準備する必要はありません。
この環境を利用することで、--no-terminalが適用されたアプリが表示されるはずです。

最後に

以上が、私が遭遇したdeno compileの挙動の話でした。
近いうちに、この挙動に遭遇したときの制作物についても書きたいと思います。

誰かの開発の一助となれば幸いです。
お読みいただき、ありがとうございました。

GitHubで編集を提案

Discussion