🦕

Denoのキャッシュディレクトリを取得する関数を作った

2021/11/13に公開

コードを書いていると、情報をキャッシュしたいことはよくあると思います。
一時的なものであればカレントディレクトリに置いてしまってもよいのですが、別環境に持っていくことがあったり、別のプログラムから参照されたりする可能性がある場合、何らかのルールを決めておくと取り回しが楽です。

Denoは、CLIの情報を環境変数DENO_DIRで設定されたディレクトリに保存しているので、自作ツールの情報もそこにキャッシュしてしまえばよいのではないかと考えました。

https://deno.land/manual/getting_started/setup_your_environment#environment-variables

ですが、このパスは環境変数の設定状況やOS等によって異なりうるため、ハードコーディングしてしまうのは良くない気がします。
そこで、DENO_DIRを取得する関数を作成しました。

deno infoで表示できる

このディレクトリは、deno infoコマンドで確認できます。
自分の環境では以下のような出力になりました。

❯ deno info
DENO_DIR location: "/Users/kawarimidoll/Library/Caches/deno"
Remote modules cache: "/Users/kawarimidoll/Library/Caches/deno/deps"
Emitted modules cache: "/Users/kawarimidoll/Library/Caches/deno/gen"
Language server registries cache: "/Users/kawarimidoll/Library/Caches/deno/registries"
Origin storage: "/Users/kawarimidoll/Library/Caches/deno/location_data"

上記のdeno infoの出力から DENO_DIR location:"~~~"の部分を抽出すれば、DENO_DIRの値を取得できます。

❯ deno info | grep DENO_DIR | sed -e 's/.* "//' -e 's/"$//'
/Users/kawarimidoll/Library/Caches/deno

JSで整形する

Denoスクリプトから使いやすいよう、上記の処理を行う関数を作成しました。

このコードは上記の通りGistで公開しているので、ファイルパスをimport fromに渡せば読み込むことができます。ちょっと長いけど。

deno_dir_sample.ts
import { getDenoDir } from "https://gist.githubusercontent.com/kawarimidoll/92179f60dfc67de3b0a52c5eb25ad333/raw/b193e088e47ee033a7d685ca6e9f45793bd26844/get_deno_dir.ts"

console.log(await getDenoDir());

内部でdeno infoコマンドを実行するため、--allow-run権限が必要です。

❯ deno run --allow-run=deno ./deno_dir_sample.ts
/Users/kawarimidoll/Library/Caches/deno

あとはここに対してensureDirでディレクトリを作ってwriteFileでファイルを保存すればOKです。

おわりに

Denoが実行されている環境であれば、確実にこのディレクトリは存在するので、何らかのキャッシュをするときには使えると思います。
なお、既存のキャッシュ(deno infoの出力の2行目以降)はDeno自身が管理しているものなので、変更しないようにご注意ください。

Discussion