3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

denoで単一実行可能ファイルの出力(Windows)

Last updated at Posted at 2021-05-16

手順

1, インストール

公式ページのインストール手順に従って導入
https://deno-ja.vercel.app/#installation

今回はPowerShell (Windows)の方法でインストール

iwr https://deno.land/x/install/install.ps1 -useb | iex

今回の使用バージョンは1.10.1

> deno -V
deno 1.10.1

2, とりあえず出力してみる(Hello World)

公式マニュアルのTypeScriptのhello-world.tsを利用
https://deno-ja.vercel.app/manual@main/examples/hello_world#typescript

適当なフォルダにソースコードを作成し、下記のコマンドを実行

deno compile hello-world.ts

成功するとexeが生成される

> deno compile hello-world.ts
Check file:///path/to/edit_file/hello-world.ts
Bundle file:///path/to/edit_file/hello-world.ts
Compile file:///path/to/edit_file/hello-world.ts
Emit hello-world

生成されたexeファイルを実行して問題なく出力されることを確認

> hello-world.exe   
Hello John
Hello Sarah
Hello Kai

3, 権限が必要な処理を出力

denoはセキュリティのため、実行時に権限の指定が必要になる
それは、deno runの場合だけでなくdeno compileでも必要で権限を付与していないと実行時エラーとなる
JSONファイルを読み込み、編集して書き出すコードを用意
今回は、edit_fileというフォルダを作成し、その直下にファイルを配置

main.ts
const data = await Deno.readTextFile("./input.json")
const jsondata = JSON.parse(data)

jsondata["item0"] = "999"

await Deno.writeTextFile("./output.json", JSON.stringify(jsondata, null, 4))
input.json
{
    "item0": "000",
    "item1": "111"
}

exeを生成・実行

PS \path\to\edit_file> deno compile main.ts  
Check file:///path/to/edit_file/edit_file/main.ts
Bundle file:///path/to/edit_file/edit_file/main.ts
Compile file:///path/to/edit_file/edit_file/main.ts
Emit edit_file

PS \path\to\edit_file> .\edit_file.exe
error: PermissionDenied: Requires read access to "./input.json", run again with the --allow-read flag
    at deno:core/core.js:86:46
    at unwrapOpResult (deno:core/core.js:106:13)
    at async open (deno:runtime/js/40_files.js:46:17)
    at async Object.readTextFile (deno:runtime/js/40_read_file.js:40:18)
    at async file://$deno$/bundle.js:1:14

ファイルの読み込みに必要な権限がないとエラーになり--allow-readを指定するように求められたため、付与して再度生成・実行

PS path\to\edit_file\edit_file> deno compile --allow-read main.ts
Check file:///path/to/edit_file/edit_file/main.ts
Bundle file:///path/to/edit_file/edit_file/main.ts
Compile file:///path/to/edit_file/edit_file/main.ts
Emit edit_file
PS \path\to\edit_file\edit_file> .\edit_file.exe
error: PermissionDenied: Requires write access to "./output.json", run again with the --allow-write flag
    at deno:core/core.js:86:46
    at unwrapOpResult (deno:core/core.js:106:13)
    at async open (deno:runtime/js/40_files.js:46:17)
    at async writeFile (deno:runtime/js/40_write_file.js:58:18)
    at async file://$deno$/bundle.js:4:1
PS \path\to\edit_file\edit_file>

今度はファイルの書き出しに必要な権限がないとエラーになり--allow-writeを指定するように求められた
付与して再度生成・実行

PS \path\to\edit_file\edit_file> deno compile --allow-read --allow-write main.ts 
Check file:///path/to/edit_file/edit_file/main.ts
Bundle file:///path/to/edit_file/edit_file/main.ts
Compile file:///path/to/edit_file/edit_file/main.ts
Emit edit_file
PS \path\to\edit_file\edit_file> .\edit_file.exe

無事エラーが発生せず実行完了
出力されたファイルもちゃんと書き換わった内容が反映されていることを確認

output.json
{
    "item0": "999",
    "item1": "111"
}

(生成したexeを別PCで実行する確認ができていないので何か問題発生するかもしれない。分かり次第追記予定)

権限付与に関して補足

--allow-allを付与するとすべての権限が与えられるので上記のようなエラーは発生しなくなるが、不要な権限を与えることににもなるため使用する際は慎重に

PS \path\to\edit_file\edit_file> deno compile --allow-all main.ts

バイナリサイズに関して

helloworld.exe約55MB!とでかい
deno.exeが同様に55MB程なのでこれがまるごと入っている雰囲気なので仕方なし・・・

調査の経緯

仕事柄、プログラマー以外の職種へツールを提供することが多い。
そのため、簡単にシングルバイナリを作成して提供できる方法を探しており、現在のところGoを候補にしていたが、denoの情報を見ているとdeno compileという単一実行可能ファイル(exe)を生成するためのコマンドが標準で存在しているようだったので、使ってみると意外と簡単だったのでこちらも現在候補に入れて確認中。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?