Windows Arm上でもdeno taskを使いたい
Deno Advent Calendar 2025 4日目の記事です。
背景
私はTypeScript以外の言語で開発するときもDenoを使う機会が多いです。
マークダウンやYAMLをフォーマットしたり、TSでちょっとしたスクリプトを書いたり、ビルドコマンドをdenoのタスクに設定してタスクランナー代わりにするなど、普段使いしています。
最近、GitHub ActionsでRustのバイナリを生成する機会があり、Windows Armをサポートしようとしたのですが、DenoがWindows Arm用のバイナリを提供していませんでした。
deno fmt --checkなどはWindows上で実行する必要がないのでいいのですが、deno taskにはビルド用のスクリプトを書いているので困りました。
正確にはGitHub Actionsのdenoland/setup-denoが、Windows Armをサポートしておらず、deno taskが使えないことがネックになりました。
他のタスクランナーを使う手もありますが、個人リポジトリでは全部Denoで統一したいので、Windows Armランナー上でdeno taskを使う方法を模索しました。
解決方法
方法1: deno task実行用にCLIを作る
deno.json(c)のtaskを読み取って実行するCLIを作りました。deno taskと同じことをdtaskで実行できます。
このCLIは、deno.json(c)からtasksに書かれているコマンドをただ実行しているわけではなく、Denoの内部で使われているdeno_task_shellを使っているコマンドを実行しているためDenoのtaskと同じようにクロスプラットフォーム対応が機能するのが特徴です。
deno.json(c)のパースもdeno_configで行っており、内部で使っているライブラリをOSSとして配布しているDenoならではの解決方法をとってみました。
このCLIの欠点としてバイナリで配布していないので、CI上でインストールするときにコンパイルが走り時間がかかるため、他の方法を模索することにしました。
バイナリを配布しても良かったのですが、次の方法が楽だったので途中で諦めました。
方法2: x64版のバイナリを使う
Windows Armはx64版のアプリを動かすためのエミュレーションがあるため、代わりにx64版を使うことができます。
公式が推奨しているスクリプトでインストールする方法もありますが、CI上で処理を分ける必要があるのでnpm経由でインストールするようにしました。
npm i -g deno
ちなみにnpm上にはWindows Arm用のDenoバイナリを配布しているパッケージがあるのですが、中身はx64版です。エミュレーションで動作するか確かめるように配布されているらしいです。[1]
おわりに
Windows Armでもdeno taskを使えるように専用のCLIを作った話と、CI上で使うにはとりあえずnpm i -g deno等でx64用のバイナリを使うと良いよという話でした。
早ければ年内にWindows Arm用のバイナリが提供されそうなのでそれまでは上記の方法で回避しようと思っています。[2]
Discussion