Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Denoで簡単なCLIツールを作ってみる / Try to make a simple CLI tool with Deno

Denoで簡単なCLIツールを作ってみる / Try to make a simple CLI tool with Deno

Denoで簡単なCLIツールを作ってみる
Kanazawa.js もくもく&LT会 #18 2022.02.26

Kentaro Matsushita

February 26, 2022
Tweet

More Decks by Kentaro Matsushita

Other Decks in Programming

Transcript

  1. Denoで簡単なCLIツールを作ってみる Kanazawa.js もくもく&LT会 #18 2022.02.26 Kentaro Matsushita

  2. Kentaro Matsushita 金沢市内のゲーム会社でフロントエンド開発してます @_kentaro_m kentaro-m

  3. 本日のテーマ Deno触ってみたので雑に共有します

  4. Denoとは Node.jsの作者であるRyan Dahl氏によって立ち上げられた JavaScriptおよびTypeScriptのランタイム環境 10 Things I Regret About Node.js

    JSConf EU 2018でRyan Dahl氏はNode.jsの設計に関する後悔 を語った Denoはこれらを解決したものとして開発されている
  5. CLIツールのお題 「イベントのLT登壇順をいい感じに決めたい」

  6. これまでも決める方法はあった

  7. LT登壇順スクリプト Kanazawa.jsでLT登壇順の決定に使っていたスクリプト 30 Seconds of Codeの実装例をもとに、3分で作りました kanazawa-js/speaker-shuffle.js

  8. /** * Fisher-Yates algorithm に基づいたシャッフル関数 * 30-seconds-of-code の実装例より * @see

    https://github.com/30-seconds/30-seconds-of-code/blob/master/snippets/shuffle.md */ const shuffle = ([...arr]) => { let m = arr.length while (m) { const i = Math.floor(Math.random() * m--) ;[arr[m], arr[i]] = [arr[i], arr[m]] } return arr } const speaker = [ '_kentaro_m', 'tom-256', 'yu_kgr', ] console.log(shuffle(speaker))
  9. CLIツール化して利用しやすい形に

  10. 入力行をシャッフルして出力するコマ ンドを作りました kentaro-m/shuf

  11. こんな感じで動作します $ deno install --allow-read \ --name shuf https://github.com/kentaro-m/shuf/raw/main/cli.ts $

    echo 'bob\njohn\ntom' | shuf Tom Bob John $ shuf sample.csv Tom Bob John
  12. shufコマンドが元ネタ 入力行をシャッフルして出力するLinuxコマンド 【 shuf 】コマンド――入力行をシャッフルして出力する: Linux基本コマンドTips(112) - @IT macOSでは gshuf

    コマンドが利用できる coreutils のインストールが必要
  13. shufコマンドを再実装する コマンドやフラグのパースはフレームワークを利用 c4spar/deno-cliffy Denoで使えるCLIフレームワーク ファイルアクセスは標準ライブラリを利用 実行時に --allow-read オプションを付与 シャッフルロジックは元コード再利用 TypeScriptの型を追加しただけ

  14. コマンドパース処理 c4spar/deno-cliffyでコマンドが簡単に定義できます。 import { Command } from "https://deno.land/x/cliffy@v0.20.1/command/mod.ts"; import {

    handler } from './handler.ts'; await new Command() .name("shuf") .version("0.1.0") .description("Write a random permutation of the input lines to standard output.") .arguments('[fileName:string]') .action(async (_, fileName: string) => await handler(fileName)) .parse(Deno.args);
  15. ファイル読み取りから結果出力 ファイルと標準入力からのテキスト読み込みに対応しています。 mport { readContents, createFileReader, showResult } from './util.ts';

    type Handler = (fileName: string) => void; export const handler: Handler = async (fileName) => { const isatty = Deno.isatty(Deno.stdin.rid); const reader = isatty ? await createFileReader(fileName) : Deno.stdin; if (reader) { const contents = await readContents(reader).catch(() => Deno.exit(1)); showResult(contents); }
  16. 感想 環境構築が楽 DenoとVSCode拡張機能のインストールで開発がはじめられる ノーセットアップでTypeScriptがそのまま書ける 最小権限で実行するので安全 Deno実行時に --allow-read オプション指定する CLIツールが簡単に配布できる https://deno.land/manual@v1.19.0/tools/script_installer

  17. さいごに サクッと環境用意して、CLIツールを作ることができました。 これからも継続してDenoを勉強しようと思います。

  18. END