跳至主要内容

嵌入附加文件

您可能需要在应用程序包中包含一些不在前端(您的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的实例,您可以从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()
}