嵌入其他文件

您可能需要在应用程序捆绑包中包含额外的文件,这些文件不是前端(您的 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 的实例,您可以从 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()
}