この記事は、デノに飛び込み、ファイルとフォルダーでテキストを検索するためのコマンドラインツールを作成します。 DENOが提供するさまざまなAPIメソッドを使用して、ファイルシステムを読み書きします。
前の記事では、Denoを使用してコマンドラインツールを構築して、サードパーティAPIにリクエストを行いました。この記事では、一時的にネットワーク操作を無視し、現在のディレクトリ内のファイルとフォルダー(GREPなどのツール内のテキストを検索できるツール)を構築します。
注:私たちが構築するツールは、GREPほど最適化されていて効率的ではなく、私たちはそれを交換することを目指していません!このようなツールを構築する目的は、DenoのファイルシステムAPIに精通することです。
Deno.readDir
などの組み込み関数やファイルの内容を読み取るための機能を提供します。 Deno.readTextFile
path.join
denoスクリプトには、ファイルシステム操作を実行するには、–allow-read
–allow-write
開発者は、deno compile
執筆時点では、Denoの最新の安定したバージョンは1.10.2です。これは、この記事で使用するバージョンです。
参照のために、GitHubでこの記事の完全なコードを見つけることができます。
Yargs
を使用して新しいコマンドを設定しますここに指摘することがたくさんあります:
deno run index.tsで実行して、Yargs出力を見ることができます:
import yargs from "https://deno.land/x/yargs@v17.0.1-deno/deno.ts"; interface Yargs<argvreturntype></argvreturntype> { describe: (param: string, description: string) => Yargs<argvreturntype>; </argvreturntype> demandOption: (required: string[]) => Yargs<argvreturntype>; </argvreturntype> argv: ArgvReturnType; } interface UserArguments { text: string; } const userArguments: UserArguments = (yargs(Deno.args) as unknown as Yargs<userarguments>) </userarguments> .describe("text", "the text to search for within the current directory") .demandOption(["text"]) .argv; console.log(userArguments);
それを実装し始める時が来ました!
特定のファイルでテキストの検索を開始する前に、検索するファイルのディレクトリとリストを生成する必要があります。 DenoはDeno.ReadDirを提供します。Deno.ReadDirは、「組み込み」ライブラリの一部であるため、インポートする必要はありません。グローバルネームスペースで利用できます。
deno.readdirは非同期であり、現在のディレクトリ内のファイルとフォルダーのリストを返します。これらのアイテムを非操作者として返します。つまり、結果を取得するためにループを待つために使用する必要があります。
このコードは、現在の作業ディレクトリ(deno.cwd()が提供)から各結果を読み取り、記録します。ただし、今すぐスクリプトを実行しようとすると、エラーが表示されます。$ deno run index.ts Check file:///home/jack/git/deno-file-search/index.ts Options: --help Show help [boolean] --version Show version number [boolean] --text the text to search for within the current directory [required] Missing required argument: text
denoは、すべてのスクリプトがファイルシステムから読み取る権限を明示的に取得することを要求することを忘れないでください。私たちの場合、
フラグはコードを実行できるようにします:for await (const fileOrFolder of Deno.readDir(Deno.cwd())) { console.log(fileOrFolder); }
--allow-read
この場合、ビルドツールのディレクトリでスクリプトを実行するため、TSソースコード、.gitリポジトリ、および.vscodeフォルダーが見つかります。トップレベルのファイルだけでなく、ディレクトリ内のすべてのファイルを見つける必要があるため、この構造を再帰的にナビゲートするためにいくつかの機能を書き始めましょう。さらに、いくつかの一般的な無視を追加できます。スクリプトが.gitフォルダー全体を検索することを誰も望んでいないと思います!
$ deno run index.ts --text='foo' error: Uncaught PermissionDenied: Requires read access to <cwd>, run again with the --allow-read flag </cwd>for await (const fileOrFolder of Deno.readDir(Deno.cwd())) { ^ at deno:core/core.js:86:46 at unwrapOpResult (deno:core/core.js:106:13) at Object.opSync (deno:core/core.js:120:12) at Object.cwd (deno:runtime/js/30_fs.js:57:17) at file:///home/jack/git/deno-file-search/index.ts:19:52
次に、次のように使用できます
また、見栄えの良い出力を取得します:
~/$ deno run --allow-read index.ts --text='foo' { name: ".git", isFile: false, isDirectory: true, isSymlink: false } { name: ".vscode", isFile: false, isDirectory: true, isSymlink: false } { name: "index.ts", isFile: true, isDirectory: false, isSymlink: false }
const IGNORED_DIRECTORIES = new Set([".git"]); async function getFilesList( directory: string, ): Promise<string[]> { const foundFiles: string[] = []; for await (const fileOrFolder of Deno.readDir(directory)) { if (fileOrFolder.isDirectory) { if (IGNORED_DIRECTORIES.has(fileOrFolder.name)) { // Skip this folder, it's in the ignore list. continue; } // If it's not ignored, recurse and search this folder for files. const nestedFiles = await getFilesList( path.join(directory, fileOrFolder.name), ); foundFiles.push(...nestedFiles); } else { // We found a file, so store it. foundFiles.push(path.join(directory, fileOrFolder.name)); } } return foundFiles; }
しかし、これはDenoのパスモジュールの方が良いでしょう。このモジュールは、DENOが標準ライブラリの一部として提供するモジュールの1つです(パスモジュールを使用してノードに非常に似ています)。ノードのパスモジュールを使用している場合、コードは非常に似ています。執筆時点では、Denoが提供する最新の標準ライブラリバージョンは0.97.0です。Mod.tsファイルからパスモジュールをインポートします:
const files = await getFilesList(Deno.cwd()); console.log(files);
import yargs from "https://deno.land/x/yargs@v17.0.1-deno/deno.ts"; interface Yargs<argvreturntype></argvreturntype> { describe: (param: string, description: string) => Yargs<argvreturntype>; </argvreturntype> demandOption: (required: string[]) => Yargs<argvreturntype>; </argvreturntype> argv: ArgvReturnType; } interface UserArguments { text: string; } const userArguments: UserArguments = (yargs(Deno.args) as unknown as Yargs<userarguments>) </userarguments> .describe("text", "the text to search for within the current directory") .demandOption(["text"]) .argv; console.log(userArguments);
mod.tsは、Denoの標準モジュールをインポートする際の常にエントリポイントです。このモジュールのドキュメントはDeno Webサイトにあり、Path.Joinをリストします。これにより、複数のパスを取り、1つのパスに結合します。関数を手動で組み合わせるのではなく、インポートして使用しましょう:
...(コードの残りの部分は、元のテキストで繰り返され、以前の出力で変更および最適化されているため、ここでは省略されています。)
...(コードの残りの部分は、オリジナルから繰り返され、以前の出力で既に変更および最適化されているため省略されています。 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::づ 火::::: ::::::::::::::
以上がDenoのファイルシステムを操作しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。