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

  1. Check that permissions/<plugin>/autogenerated is not an existing regular file; remove it if so
  2. Fix write permissions on the crates/tauri/permissions directory for the build user
  3. Ensure the repository is on a writable filesystem
  4. 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

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


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)