跳至主要内容

嵌入其他文件

你可能需要在应用程序捆绑包中包含一些其他文件,这些文件不直接属于你的前端(你的 distDir),或者太大而无法内联到二进制文件中。我们称这些文件为 资源

要捆绑你选择的文件,你可以将 resources 属性添加到 tauri.conf.json 文件中的 tauri > bundle 对象。

在此处了解有关 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 目录中。为此,我们将 "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 实例,你可以从 AppAppHandle 获取

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()
}