tauri-apps/tauri · error
failed to create plugin documentation directory
Error message
failed to create plugin documentation directory
What it means
Panic in the build script's define_permissions helper when fs::create_dir_all cannot create the autogenerated documentation directory (permissions/<plugin>/autogenerated) for a core plugin. This directory receives the ACL permission docs generated by tauri_utils::acl::build::generate_docs. Failure aborts the build.
Solutions
- Check that permissions/<plugin>/autogenerated is not an existing regular file; remove it if so
- Fix write permissions on the crates/tauri/permissions directory for the build user
- Ensure the repository is on a writable filesystem
- Clean and rebuild after restoring a pristine checkout
Example fix
// before permissions/window-state/autogenerated <- regular file // after rm permissions/window-state/autogenerated cargo build
Defensive patterns
Strategy: validation
Validate before calling
let docs_dir = std::path::Path::new("permissions").join(plugin_directory_name);
if docs_dir.exists() {
assert!(docs_dir.is_dir(), "{} is a file, not a directory", docs_dir.display());
}
let probe = docs_dir.join(".write-test");
std::fs::create_dir_all(&docs_dir).expect("cannot create docs dir");
std::fs::write(&probe, b"").expect("docs dir not writable");
let _ = std::fs::remove_file(&probe); Prevention
- Never commit stray files named like directories under permissions/
- Build as the repository owner user
- Keep build mounts writable in containers
When it happens
Trigger: The permissions/ directory tree in the tauri crate cannot be created: read-only filesystem, permission denied on the existing permissions/ directory, a file exists where a directory is expected (e.g. a stale file named 'autogenerated'), or disk full.
Common situations: Building in a checkout where permissions/autogenerated was replaced by a regular file, running the build as a different user than the repo owner, or building on a read-only mount (e.g. some container setups).
Understand the failure class
Background: mkdir permission denied (EACCES): failed to create directory errors explained — this error's family across 32 libraries.
Related errors
- failed to create core:default permissions directory
- failed to generate plugin documentation page
- failed to canonicalize global API script path
- failed to canonicalize tauri global API script path
- failed to read kotlin file as string
AI-assisted analysis of tauri-apps/tauri@460ec35447 (2026-09-18).
Data as JSON: /api/errors/c51e3a1d112754d6.
Report an issue: GitHub.
Appendix: source
Thrown at crates/tauri/build.rs:427
.unwrap_or_else(|_| panic!("unable to autogenerate default permissions"));
let permissions = tauri_utils::acl::build::define_permissions(
&PathBuf::from(glob::Pattern::escape(
&permissions_out_dir.to_string_lossy(),
))
.join("**")
.join("*.toml")
.to_string_lossy(),
&format!("tauri:{plugin}"),
out_dir,
|_| true,
)
.unwrap_or_else(|e| panic!("failed to define permissions for {plugin}: {e}"));
let docs_out_dir = Path::new("permissions")
.join(plugin_directory_name)
.join("autogenerated");
fs::create_dir_all(&docs_out_dir).expect("failed to create plugin documentation directory");
tauri_utils::acl::build::generate_docs(
&permissions,
&docs_out_dir,
plugin.strip_prefix("tauri-plugin-").unwrap_or(plugin),
)
.expect("failed to generate plugin documentation page");
all_permissions.insert(plugin.to_string(), permissions);
}
let default_permissions = define_default_permission_set(out_dir);
all_permissions.insert("core".to_string(), default_permissions);
all_permissions
}
fn define_default_permission_set(
out_dir: &Path,
) -> Vec<tauri_utils::acl::manifest::PermissionFile> {View on GitHub (pinned to 460ec35447)