$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

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

    View Slide

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

    View Slide

  4. Denoとは
    Node.jsの作者であるRyan Dahl氏によって立ち上げられた
    JavaScriptおよびTypeScriptのランタイム環境
    10 Things I Regret About Node.js
    JSConf EU 2018でRyan Dahl氏はNode.jsの設計に関する後悔
    を語った
    Denoはこれらを解決したものとして開発されている

    View Slide

  5. CLIツールのお題
    「イベントのLT登壇順をいい感じに決めたい」

    View Slide

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

    View Slide

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

    View Slide

  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))

    View Slide

  9. CLIツール化して利用しやすい形に

    View Slide

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

    View Slide

  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

    View Slide

  12. shufコマンドが元ネタ
    入力行をシャッフルして出力するLinuxコマンド
    【 shuf
    】コマンド――入力行をシャッフルして出力する:
    Linux基本コマンドTips(112) -
    @IT
    macOSでは gshuf コマンドが利用できる
    coreutils のインストールが必要

    View Slide

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

    View Slide

  14. コマンドパース処理
    c4spar/deno-cliffyでコマンドが簡単に定義できます。
    import { Command } from "https://deno.land/x/[email protected]/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);

    View Slide

  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);
    }

    View Slide

  16. 感想
    環境構築が楽
    DenoとVSCode拡張機能のインストールで開発がはじめられる
    ノーセットアップでTypeScriptがそのまま書ける
    最小権限で実行するので安全
    Deno実行時に --allow-read オプション指定する
    CLIツールが簡単に配布できる
    https://deno.land/[email protected]/tools/script_installer

    View Slide

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

    View Slide

  18. END

    View Slide