devlog

Deno で commander.js を使う

2023-06-06

Deno でCLIツールを作る方法を紹介します。 ライブラリは commander.js を用います。

バージョン

$ deno --version deno 1.34.0 (release, aarch64-apple-darwin) v8 11.5.150.1 typescript 5.0.4

v1.34 です。npmパッケージ込みでシングルバイナリを作れるようになりました(参考)。

deno init

はじめに、Deno のプロジェクトを作成します。

$ mkdir samplecmd && cd samplecmd $ deno init ✅ Project initialized Run these commands to get started # Run the program deno run main.ts # Run the program and watch for file changes deno task dev # Run the tests deno test # Run the benchmarks deno bench

ディレクトリ構造は次のようになりました。

$ tree . ├── deno.jsonc ├── main.ts ├── main_bench.ts └── main_test.ts

commander.js を依存に入れる

今回は Import Maps を使い依存パッケージを管理します。deno.jsonc を次のように書き換えました。

// deno.jsonc { "imports": { "commander": "https://esm.sh/v124/[email protected]" }, "tasks": { "dev": "deno run --watch main.ts" } }

余談ですが Import Maps の操作には esm.sh のヘルパースクリプトをお勧めします。コマンドラインで add や remove をでき、開発者体験が良かったです。詳しくは esm.sh をご覧ください。

実装

main.ts を実装します。今回はサンプルなので最小限です。

import { program } from 'commander'; program .name('samplecmd') .description('Sample command.') .version('1.0.0'); program.parse();

動かしてみます。

$ deno run --allow-read main.ts --version 1.0.0

deno compile

シングルバイナリにします。target は M1 Mac です。

$ deno compile main.ts --allow-all --target aarch64-apple-darwin Compile file:///Users/username/samplecmd/main.ts to samplecmd Archive: /var/folders/something-path/deno.zip inflating: deno

samplecmd というファイルができました。

$ tree . . ├── deno.jsonc ├── deno.lock ├── main.ts ├── main_bench.ts ├── main_test.ts └── samplecmd // !!

動かしてみます。

$ ./samplecmd --version 1.0.0

以上です。

感想

シングルバイナリに出来るのは大きなメリットだと思います。可搬性と言いますか。。Node.js だとか Python 製のCLIアプリって、絶妙なバランスで実行されている、、と思ってまして、実行環境への依存が大きい印象があります。その点、Go言語のようにシングルバイナリ化出来るのは、ありがたいですね。

また Node.js では、どうしても CommonJS と ESModule のどちらにパッケージングするか問題が出てき、正直対応が面倒なのですが、その点 Deno だと支障がありません(私の理解では)。こちらもメリットだと思います。

Links

  • 作成日
    2023-06-06
  • 更新日
    2023-06-06