Tauri2のplugin-fsのreadFileの権限の付与: forbidden path
- 作成日: 2025-07-12
- 更新日: 2025-07-12
- カテゴリ: Tauri2
Tauri2のplugin-fsのreadFileの設定に詰まったのでメモ。
readFileのコードは下みたいな感じ。
import { readFile, BaseDirectory } from '@tauri-apps/plugin-fs';
let path = 'model/mymodel.glb'
try {
binary = await readFile(path, {
baseDir: BaseDirectory.Resource,
})
} catch (e) {
console.error(`failed to readFile: ${path}:`, e)
return
}
BaseDirectory.Resourceはアプリのexeファイルがあるフォルダがベースになる。exeファイルがあるフォルダ内のファイルやフォルダを指定したい場合はこれを指定する。
たとえばexeファイルがあるフォルダが/path/to/myprogだとする。その場合、pathにmodel/mymodel.glbを指定した場合は/path/to/myprog/model/mymodel.glbというパスになる。
Tauri2はファイルアクセスは権限を付与しないといけない。src-tauri/capabilities/default.jsonを以下のように編集する。
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default",
"description": "Capability for the main window",
"windows": [
"main"
],
"permissions": [
"core:default",
"opener:default",
"fs:default",
{
"identifier": "fs:allow-read-file",
"allow": [
{
"path": "$RESOURCE/model/*"
}
]
}
]
}
permissionsというのが権限だ。文字列か辞書を指定できる。readFileの権限はfs:allow-read-fileで付与し、対象となるファイルをallowで指定する。$RESOURCEはBaseDirectory.Resourceのことである。つまりexeファイルのあるフォルダ直下のmodelフォルダ内のすべてのファイルに対して権限を付与する。
tauri.conf.jsonにもpermissionsは書けるが、こっちに書いた場合はこっちの設定が優先されるらしい。だから、重複した設定が無いようにどちらかに振り分けないといけない。私はtauri.conf.jsonにもpermissionsの設定を書いていて、default.jsonの設定が適用されずに少し悩んだ。tauri.conf.jsonの方のpermissionsを消したら意図通りになった。
tauri.conf.jsonのbundleの設定。
{
...
"bundle": {
"active": true,
"targets": "all",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"resources": {
"../res/model/*.glb": "model/"
}
}
}
bundleのresourcesを見る。ここで、ビルド時にバンドルするリソースファイルの指定をする。resourcesは配列か辞書のどちらかが使えて、辞書にした場合はバンドル先のフォルダーなどを指定できる。
"../res/model/*.glb": "model/"
というのはpackage.jsonがあるフォルダ内のresフォルダのmodelフォルダ以下のモデルファイルをすべて、model/フォルダ以下にバンドルする設定である。こうするとsrc-tauri/target/debug以下にビルド時にリソースファイルがmodel/以下にコピーされ、開発時の実行でリソースを参照できるようになる。つまりpermissionsで$RESOURCE/modelと書く場合はここでmodel/と書いておかないといけない。
権限の付与に失敗していると以下のようなエラーが出る。
forbidden path