🐷

Denoでglobでファイル検索

2023/09/12に公開

簡単なことだけど一貫して使える状態で説明しているサイトが英語でもなかったので書く。

globの機能はrubyやpythonだと言語の機能として備わっていましたが、
nodejsにはそれが無く、globな処理を書くのは大変だったと思います。
(第三者がライブラリとして出している時もあるけど、大変失礼なことを申しますとデバッグ難しいしファイル周りの処理で
複雑な奴で非公式かつあまり使われていない奴はみんな使いたくないと思います。)

しかし、Denoは標準ライブラリとしてglobの機能を備えているので、安心できます。
pythonやrubyみたいにサクッと書けますね。

下にバンドルまたは、ソースコード自動生成用のリソースをglobを使って検索する例を示します。

tasks/generator/resources.ts
import { globToRegExp, extname } from 'path/mod.ts';
import { walk } from 'fs/walk.ts';

const glob = [
    globToRegExp("**/resources/*.json"),
    globToRegExp("**/resources/*.csv"),
];

/** resource一覧 */
const json: string[] = [];
const csv: string[] = [];

// walkには相対パスで欲しい時は'.'のように相対パスで、
// 絶対パスで欲しい場合はDeno.cwd()のように絶対パスで渡す。
for await (const walkEntry of walk(".", { match: glob })) {
    // マッチしたファイル名のパスを含めて取得する。
    const path = walkEntry.path;

    if (extname(path) == ".json") {
        ResJson.push(path);
    } else if ( extname(path) == ".csv") {
        ResCsv.push(path);
    }
}

export {
    json,
    csv
}

deno.jsoncは下のようになります。必要な部分だけ載せます。

deno.jsonc
{
  "imports": {
    "path/": "https://deno.land/std@0.201.0/path/",
    "fs/": "https://deno.land/std@0.201.0/fs/",
  }
}

シンプルかつええ感じにかけるんじゃないでしょうか?

まとめ

Denoはまだ若いので例が少なく、ドキュメントもまだしっかりと整備されている感じはありません。
しかし、ライブラリのテストコードから使い方なりなんなりを読み取れる、かつソースコードが綺麗なので
今の状態でも開発で使っていけそうな気がします。

Discussion