嵌入附加文件
您可能需要在应用程序包中包含一些不在前端(您的distDir
)中或太大而无法内嵌到二进制文件中的附加文件。我们将这些文件称为resources
。
要打包您选择的这些文件,您可以将resources
属性添加到tauri.conf.json
文件中的tauri > bundle
对象中。
查看更多关于tauri.conf.json配置的信息 在此。
resources
期望一个字符串列表,这些字符串指向具有绝对路径或相对路径的文件。如果您需要包含目录中的多个文件,它支持通配符模式。
这是一个示例,用于说明配置。这不是一个完整的tauri.conf.json
文件
tauri.conf.json
{
"tauri": {
"bundle": {
"resources": [
"/absolute/path/to/textfile.txt",
"relative/path/to/jsonfile.json",
"resources/*"
]
},
"allowlist": {
"fs": {
"scope": ["$RESOURCE/*"]
}
}
}
}
注意
绝对路径和包含父组件 (../
) 的路径只能通过 "$RESOURCE/*"
允许。像 "path/to/file.txt"
这样的相对路径可以通过 "$RESOURCE/path/to/file.txt"
显式允许。
在 JavaScript 中访问文件
在这个例子中,我们想要打包额外的 i18n json 文件,它们看起来像这样
de.json
{
"hello": "Guten Tag!",
"bye": "Auf Wiedersehen!"
}
在这种情况下,我们将这些文件存储在tauri.conf.json
旁边的lang
目录中。为此,我们将"lang/*"
添加到resources
,并将$RESOURCE/lang/*
添加到如上所示的fs作用域。
请注意,您必须配置允许列表以启用path > all
和您需要的fs
API,在此示例中为fs > readTextFile
。
import { resolveResource } from '@tauri-apps/api/path'
// alternatively, use `window.__TAURI__.path.resolveResource`
import { readTextFile } from '@tauri-apps/api/fs'
// alternatively, use `window.__TAURI__.fs.readTextFile`
// `lang/de.json` is the value specified on `tauri.conf.json > tauri > bundle > resources`
const resourcePath = await resolveResource('lang/de.json')
const langDe = JSON.parse(await readTextFile(resourcePath))
console.log(langDe.hello) // This will print 'Guten Tag!' to the devtools console
在 Rust 中访问文件
这是基于上面的示例。在 Rust 端,您需要一个PathResolver
的实例,您可以从App
和AppHandle
获取。
tauri::Builder::default()
.setup(|app| {
let resource_path = app.path_resolver()
.resolve_resource("lang/de.json")
.expect("failed to resolve resource");
let file = std::fs::File::open(&resource_path).unwrap();
let lang_de: serde_json::Value = serde_json::from_reader(file).unwrap();
println!("{}", lang_de.get("hello").unwrap()); // This will print 'Guten Tag!' to the terminal
Ok(())
})
#[tauri::command]
fn hello(handle: tauri::AppHandle) -> String {
let resource_path = handle.path_resolver()
.resolve_resource("lang/de.json")
.expect("failed to resolve resource");
let file = std::fs::File::open(&resource_path).unwrap();
let lang_de: serde_json::Value = serde_json::from_reader(file).unwrap();
lang_de.get("hello").unwrap()
}