{"record":{"id":"8ab9c11c24bd7b7b","repo":"tauri-apps/tauri","slug":"failed-to-create-core-default-permissions-directory","errorCode":null,"errorMessage":"failed to create core:default permissions directory","messagePattern":"failed to create core:default permissions directory","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tauri/build.rs","lineNumber":448,"sourceCode":"      &docs_out_dir,\n      plugin.strip_prefix(\"tauri-plugin-\").unwrap_or(plugin),\n    )\n    .expect(\"failed to generate plugin documentation page\");\n    all_permissions.insert(plugin.to_string(), permissions);\n  }\n\n  let default_permissions = define_default_permission_set(out_dir);\n  all_permissions.insert(\"core\".to_string(), default_permissions);\n\n  all_permissions\n}\n\nfn define_default_permission_set(\n  out_dir: &Path,\n) -> Vec<tauri_utils::acl::manifest::PermissionFile> {\n  let permissions_out_dir = out_dir.join(\"permissions\");\n  fs::create_dir_all(&permissions_out_dir)\n    .expect(\"failed to create core:default permissions directory\");\n\n  let default_toml = permissions_out_dir.join(\"default.toml\");\n  let toml_content = format!(\n    r#\"{LICENSE_HEADER}\n\n[default]\ndescription = \"Default core plugins set.\"\npermissions = [{}]\n\"#,\n    PLUGINS\n      .iter()\n      .map(|(k, _)| format!(\"\\\"{k}:default\\\"\"))\n      .collect::<Vec<_>>()\n      .join(\",\")\n  );\n\n  write_if_changed(default_toml, toml_content)\n    .unwrap_or_else(|_| panic!(\"unable to autogenerate core:default set\"));","sourceCodeStart":430,"sourceCodeEnd":466,"githubUrl":"https://github.com/tauri-apps/tauri/blob/460ec35447493200d64290dd7f015d5a91d0fd58/crates/tauri/build.rs#L430-L466","documentation":"Panic in define_default_permission_set when fs::create_dir_all fails to create <OUT_DIR>/permissions, the directory where the core:default permission set (default.toml) is generated. OUT_DIR is cargo's build output dir for the crate, so failure usually indicates an environment/filesystem problem rather than bad configuration.","triggerScenarios":"OUT_DIR missing or deleted mid-build, target directory owned by another user, read-only filesystem, or a regular file occupying the OUT_DIR/permissions path.","commonSituations":"Concurrent cargo builds sharing one target directory, builds run with sudo after earlier user builds, CI runners with odd permission setups, or disk-full conditions.","solutions":["Delete the target directory (or cargo clean) and rebuild to recreate OUT_DIR","Fix ownership/permissions of the target directory for the current build user","Ensure only one build process uses the target directory at a time","Verify the build volume is writable and has free space"],"exampleFix":"// before\nsudo chown -R root:root target\n// after\nsudo chown -R $(whoami) target\ncargo clean","handlingStrategy":"validation","validationCode":"let dir = std::path::Path::new(&out_dir);\nassert!(dir.is_dir(), \"OUT_DIR missing: {}\", dir.display());\nlet target = dir.join(\"permissions\");\nfs::create_dir_all(&target).expect(\"cannot create OUT_DIR/permissions\");\nlet probe = target.join(\".write-test\");\nstd::fs::write(&probe, b\"\").expect(\"not writable\");\nlet _ = std::fs::remove_file(&probe);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run `cargo clean` after switching build users","Avoid concurrent builds on one target dir","Check free disk space in CI before builds"],"tags":["build-script","filesystem","out-dir","permissions"],"backgroundTag":"mkdir-permission-denied","analyzedSha":"460ec35447493200d64290dd7f015d5a91d0fd58","analyzedAt":"2026-09-18T23:55:51.277Z","contentChangedAt":"2026-09-18T23:55:51.277Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}