2021年10月23日土曜日

Deno の外部コマンド実行は zx_deno に全振りが良いかも

Deno は良いところも多いけど、外部コマンド実行はかなり使いにくいです。 たとえば wget https://hoge.com/foo.gz して、gz を解凍する以下のたった 2行の bash コードを Deno スクリプト内で書いてみてください。 簡単なように見えてかなりしんどいです。
wget https://hoge.com/foo.gz -P dir
gzip -d dir/foo.gz
Deno.run() したり、exec ライブラリ を使えば良いというのは誰でも浮かびますし、私も最初はそのように実装しました。 しかし全然うまくいかない。めちゃくちゃ面倒なんですよ! Deno は piped output が 65536 bytes に制限されていたり、 wget や gz のコマンドの終了待ちをしようとしても、コードが長くなったり、うまく待てなかったり、地雷が多いです。 しかもその地雷が触ってみないことにはわからんというのが、一番致命的なところで、ファイルサイズが大きいものを扱おうとすると、途端に死にます。 たかが Linux コマンドを実行するのにこんなに苦労するとは思わなかった。

それならば wget や gzip decompress を Deno 上で実装すればいいのではないか。 確かにそれも選択肢としてアリなんですが、Linux コマンドはよくできているので、そちらのほうがたいてい簡単・省メモリ・高速なんですよね。 そして何よりライブラリを選ぶようなコストを掛けたくない。 やはりコード上で Linux コマンドを自然に叩けることってプログラミングする上で、とても大切だと思うのです。 その点では、Python や Ruby は非常によくできた言語だと再確認できました。

とは言え最近は Deno をよく使っているので、Deno で何とかしたい。 そんな時、少し前に出てきた google/zx、そして Deno ポートの zx_deno があることを思い出しました。 結論だけ言ってしまうと、zx_deno はめちゃくちゃ良いです。 一番最初のコードは以下のように書けます。
import {$} from 'https://deno.land/x/zx_deno/mod.mjs'

await $`wget https://hoge.com/foo.gz -P dir`;
await $`gzip -d dir/foo.gz`;

// process foo
これはいい。今後は zx_deno に全振りで良いんじゃないでしょうか。

0 件のコメント: