相対パスでのファイル操作について~。
相対パスの解決方法
まず、Denoの相対パスの解決には2種類ある。
モジュール解決(import/export)の場合
自身のファイルからの相対パスが使用される。
Denoはインターネット上のスクリプトを直接実行できるが、その場合はリモートURLからの相対パスとして解決される。
例:
//このコードが`https://xxx.com/mod.js`として実行またはインポートされている場合は、
import './bar' //=> `https://xxx.com/bar.js`がインポートされる
それ以外の場合
Deno.readTextFile()
などファイル操作の時は、カレントディレクトリからの相対パスが使用される。
カレントディレクトリは変動する可能性がある。
> cd /foo
> deno eval "Deno.readTextFile('./bar.txt')" # /foo/bar.txt が読まれる
> cd /foo/hoge
> deno eval "Deno.readTextFile('./bar.txt')" # /foo/hoge/bar.txt が読まれる
ファイルを操作する時に自身のファイルからの相対パスを使用したい場合は、次のようにする。
ファイル操作に「自身のファイルからの相対パス」を使用する方法
ここから本題。
URLオブジェクトとimport.meta.url
を使う。
import.meta.url
には自ファイルへのパスが入っているので、URLオブジェクトのコンストラクタを使って相対パスの解決を行う。
Denoのファイル操作系APIは、文字列だけでなくURLオブジェクトでもパスの指定が可能になっているため、URLオブジェクトをそのまま渡せばよい。
const path = new URL("./foo.txt", import.meta.url) // ./foo.txtが絶対パスに変換される
Deno.readTextFile(path)
なお、インターネット上にこのファイルを置いた場合はURLオブジェクトがリモートファイルを指してしまい、機能しないので注意。
(これをリモートとローカルの両方で動作させるための機能として、ローカルファイルのfetchが検討されているようだ。)
あとdeno compileしたときの挙動も変わってきそうではある。(未調査)