嵌入其他文件
您可能需要在应用程序捆绑包中包含额外的文件,这些文件不是前端(您的 distDir
)的直接组成部分,或者太大而无法内联到二进制文件中。我们称这些文件为resources
。
要打包所选文件,可在 tauri.conf.json
文件中的 tauri > bundle
对象中添加resources
属性。
点击此处查看有关 tauri.conf.json 配置的更多信息。
resources
期望包含一系列字符串,这些字符串的目标文件可以是绝对路径,也可以是相对路径。如果需要包含一个目录中的多个文件,它还支持 glob 模式。
下面是一个配置示例。这不是一个完整的 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
目录中。为此,我们在resources
中添加 "lang/*"
,并在 fs 作用域中添加 $RESOURCE/lang/*
,如上图所示。
请注意,您必须配置 allowlist 以启用 path > all
和所需的 fs
APIs(本例中为 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()
}