退屈なことはDenoにやらせたい
post Node.jsとして5月にメジャーバージョンがリリースされた Deno 。
npmやpackage.jsonをなくしてライブラリをURLから直接importする形になったり、TypeScriptがそのまま動いたりと様々な魅力がありますが、今回は普段遣いのスクリプトランナーとして見ていきたいと思います。
Pythonやシェルスクリプトが肌に合わなくて、手慣れたJS(TS)で書きたいマン[1]におすすめです。
導入と実行
かいつまんで書きます。
詳細は 公式ドキュメント やほかの紹介記事を参照してください。
導入
homebrew等で入れられます。nvmやnodebrew見合いのバージョン管理は追い追いでよいと思います。
$ brew install deno
実行
実行は deno run <FILENAME>
でできます。
Denoは、安全のため、ネットワークアクセスやファイルの読み書き等を行う場合、適切な 権限 を与えないと動きません。
これは、実行時にフラグを指定することでできます。
たとえば、ファイルの読み込みを伴う場合は deno run --allow-read <FILENAME>
となります。
Denoのグローバルオブジェクト
Denoは、標準オブジェクトとして Deno
が提供されます。
ファイルアクセス等の基本的なメソッドがここから直接使用できるので、Node.jsのように fs
等を呼び出さなくてもさらっと書くことができます。
$ deno
Deno 1.1.2
exit using ctrl+d or close()
> Deno.cwd()
/Users/<**username**>/Development/sandbox
3つ覚えればだいたいなんとかなる
ディレクトリ配下のファイル等をループする
Deno.readDir()
* を使います。 AsyncIterable
が返ってくるので、 for await of
で回せます。
--allow-read
フラグが必要です。
for await (const item of Deno.readDir('.')) {
console.log(item);
}
$ ls -F
fuga/ hoge.txt readDir.ts
$ deno run --allow-read readDir.ts
{ name: "readDir.ts", isFile: true, isDirectory: false, isSymlink: false }
{ name: "hoge.txt", isFile: true, isDirectory: false, isSymlink: false }
{ name: "fuga", isFile: false, isDirectory: true, isSymlink: false }
シェルコマンドを動かす
Deno.run()
* を使います。
--allow-run
フラグが必要です。
これはPromiseを返さない同期APIです。
const p = Deno.run({
cmd: ['echo', 'hoge'],
});
console.log(p);
$ deno run --allow-run run.ts
hoge
Process { rid: 3, pid: 22288 }
手元で使うだけなのにいちいち配列で書くのはかったるいので、サードパーティライブラリの exec を使った方が幸せになれそうです。
import { exec } from "https://deno.land/x/exec/mod.ts";
await exec('echo hoge');
テキストを読む
Deno.readTextFile()
* を使います。
--allow-read
フラグが必要です。
const text = await Deno.readTextFile('./hoge.txt');
console.log(text);
$ deno run --allow-read readTextFile.ts
ほげほげ
おわり
やっていきましょう。
-
わたしだ。 ↩︎
Discussion