2021/08/27 に公開 1126 views

このエピソードについて

最近注目を集めているツール zx について、@spring_raining が @T28_tatsuya に聞いてみました。

google/zx について

  • https://github.com/google/zx
  • @T28_tatsuya による zx についての解説 https://t28.dev/write-script-using-zx/
    • JavaScriptを使ってShell scriptのようにスクリプトを書くことができるライブラリ
  • zxが実行できるファイル形式
    • JavaScript (.js, .mjs)
      • JavaScriptの場合、拡張子でcommonjsで書くかesmoduleで書くか選べる
      • esmoduleであればtop-level awaitが使える
    • TypeScript (.ts)
    • Markdown (.md)
    • 標準入力
  • Shellコマンドの実行以外にも、スクリプトを書く上で便利なライブラリをglobalで参照出来るようにしてくれている
    • argv: minimist を使った引数、オプションの受け取り
    • question: 対話型プログラムを作るための nodeのreadlineのwrapper
    • fetch: node-fetchを使用
    • polyfill: __dirname など

実際の活用例について

  • Markdown ファイルの js の code block 内のスクリプトを zx に実行させる形式で書いている
    • 見出しのレベルで上から概要、スクリプトのパートに分けて、使い方や参考情報も JavaScript で書いたスクリプトも 1 つの Markdown ファイルに収めるようにしている
  • Markdown を実行するという構成をとった理由
    • スクリプトも文書化しやすくしたい
    • Shell script から JavaScript になっただけでも大分処理の流れを追いやすくなったとは思う
    • けれど、スクリプトを読む側の立場からすると、Readme 的なものは欲しいケースがあると思う
    • なんとか.shなんとか.md を両方準備するのは面倒くさかったり、ハードルが高かったりするかもなので、いっそのこと、markdown 内に参考情報とスクリプトを一緒に書く形式にすればいいんじゃね? と思っている

zxのソースを見てみる

今後の zx に対する期待

  • 実行環境のポータブル化
    • Deno compile (シングルバイナリ作成機能) のようなもの

      Deno 1.7 Release Notes https://deno.com/blog/v1.7

    • あるいは zx が Deno に対応すればこの機能を利用できるようになる?
  • イケてるスクリプトを書くための機能追加
    • question() で入力値のバリデーションが出来たり、処理中の標準出力を簡単におしゃれにしたり…
    • でも、必要な機能は十分備えている認識だから、今ぐらいシンプルでもいいかも

Refs