tauri-apps/tauri · error
failed to parse plugin manifest map
Error message
failed to parse plugin manifest map
What it means
Build-time panic in tauri-codegen: serde_json::from_str over OUT_DIR/acl-manifests.json .expect("failed to parse plugin manifest map") fails when the cached file is invalid JSON for the current Manifest struct. The file is generated by tauri-build, so a parse failure means the artifact is corrupt/truncated or was written by a different Tauri version than the one now parsing it.
Source
Thrown at crates/tauri-codegen/src/context.rs:397
panic!("The isolation application does not contain a file setting the `window.__TAURI_ISOLATION_HOOK__` value.");
}
let schema = options.isolation_schema;
quote!(#root::Pattern::Isolation {
assets: ::std::sync::Arc::new(#assets),
schema: #schema.into(),
key: #key.into(),
crypto_keys: std::boxed::Box::new(::tauri::utils::pattern::isolation::Keys::new().expect("unable to generate cryptographically secure keys for Tauri \"Isolation\" Pattern")),
})
}
};
let acl_file_path = out_dir.join(ACL_MANIFESTS_FILE_NAME);
let acl: BTreeMap<String, Manifest> = if acl_file_path.exists() {
let acl_file =
std::fs::read_to_string(acl_file_path).expect("failed to read plugin manifest map");
serde_json::from_str(&acl_file).expect("failed to parse plugin manifest map")
} else {
Default::default()
};
let capabilities_file_path = out_dir.join(CAPABILITIES_FILE_NAME);
let capabilities_from_files = if capabilities_file_path.exists() {
let capabilities_json =
std::fs::read_to_string(&capabilities_file_path).expect("failed to read capabilities");
serde_json::from_str(&capabilities_json).expect("failed to parse capabilities")
} else {
Default::default()
};
let capabilities = get_capabilities(
&config,
capabilities_from_files,
additional_capabilities.as_deref(),
)
.unwrap();View on GitHub (pinned to 52e4b6e71d)
Solutions
- cargo clean and rebuild so acl-manifests.json is regenerated by the current Tauri version
- Verify all Tauri crates resolve to one version: `cargo tree -i tauri-utils` and `cargo tree -i tauri-codegen`, align or deduplicate
- Invalidate CI target-dir caches whenever Cargo.lock changes Tauri versions
- If it persists, inspect target/<triple>/debug/build/<crate-*/out/acl-manifests.json for truncation or accidental hand-edits
Example fix
# before: cargo build after upgrading tauri # panic: failed to parse plugin manifest map # after cargo clean && cargo tree -i tauri-utils # confirm a single version, then rebuild
Defensive patterns
Strategy: validation
Validate before calling
# after any Tauri version change, drop stale codegen caches cargo clean && cargo tree -i tauri-utils # must show exactly one version
Prevention
- Key CI build caches on Cargo.lock so Tauri upgrades never reuse a stale OUT_DIR
- Keep tauri, tauri-build, tauri-codegen and tauri-utils on one aligned version line
- cargo clean after upgrading Tauri in a workspace
When it happens
Trigger: Building right after upgrading tauri / tauri-build / tauri-codegen while a stale acl-manifests.json from the old version remains in OUT_DIR; a truncated file from an interrupted build; mixed versions in one workspace where the writer's Manifest schema differs from the reader's.
Common situations: Tauri version bump without cleaning target; CI layer/cache reuse of a target directory across Tauri upgrades; workspace mixing pinned old tauri-plugin-* crates with new tauri-utils.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- failed to read plugin manifest map
- failed to parse capabilities
- The `frontendDist` configuration is set to `{path:?}` but th
- failed to parse icon {}: {}
- failed to decode icon {}: {}
AI-assisted analysis of tauri-apps/tauri@52e4b6e71d (2026-08-20).
Data as JSON: /api/errors/62b7e377f546c4ec.
Report an issue: GitHub.