{"record":{"id":"49506146e1c635f9","repo":"tauri-apps/tauri","slug":"failed-to-extract-external-binary-filename-rpm","errorCode":null,"errorMessage":"failed to extract external binary filename","messagePattern":"failed to extract external binary filename","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tauri-bundler/src/bundle/linux/rpm.rs","lineNumber":153,"sourceCode":"    .unwrap_or_default()\n  {\n    builder = builder.obsoletes(Dependency::any(dep));\n  }\n\n  // Add binaries\n  for bin in settings.binaries() {\n    let src = settings.binary_path(bin);\n    let dest = Path::new(\"/usr/bin\").join(bin.name());\n    builder = builder.with_file(src, FileOptions::new(dest.to_string_lossy()))?;\n  }\n\n  // Add external binaries\n  for src in settings.external_binaries() {\n    let src = src?;\n    let dest = Path::new(\"/usr/bin\").join(\n      src\n        .file_name()\n        .expect(\"failed to extract external binary filename\")\n        .to_string_lossy()\n        .replace(&format!(\"-{}\", settings.target()), \"\"),\n    );\n    builder = builder.with_file(&src, FileOptions::new(dest.to_string_lossy()))?;\n  }\n\n  // Add scripts\n  if let Some(script_path) = &settings.rpm().pre_install_script {\n    let script = fs::read_to_string(script_path)?;\n    builder = builder.pre_install_script(script);\n  }\n\n  if let Some(script_path) = &settings.rpm().post_install_script {\n    let script = fs::read_to_string(script_path)?;\n    builder = builder.post_install_script(script);\n  }\n\n  if let Some(script_path) = &settings.rpm().pre_remove_script {","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/tauri-apps/tauri/blob/460ec35447493200d64290dd7f015d5a91d0fd58/crates/tauri-bundler/src/bundle/linux/rpm.rs#L135-L171","documentation":"In the RPM bundler, each external binary (sidecar) is placed under /usr/bin by taking its `file_name()` and stripping the target-triple suffix. If a sidecar path has no final component, file_name() returns None and the expect panics. The bundler assumes `settings.external_binaries()` always yields paths that end in a real file name.","triggerScenarios":"tauri build producing an RPM bundle with `bundle.externalBin` entries whose resolved path lacks a filename component — trailing separator, `..`, or an empty name after variable substitution.","commonSituations":"Config like `\"externalBin\": [\"binaries/\"]`; a script-generated sidecar path where the binary name variable was empty; renaming a sidecar without updating the config so a stale directory path lingers.","solutions":["Correct the externalBin entry in tauri.conf.json to end with the actual binary file name (target triple is appended automatically, e.g. `binaries/myapp`).","Ensure the sidecar file exists for the current target triple (`myapp-x86_64-unknown-linux-gnu`) next to the configured path.","Normalize any dynamically generated paths (no trailing slashes, no `..`) before building.","Test with `tauri build --bundles rpm` after fixing to confirm the path resolves."],"exampleFix":"// before\n\"externalBin\": [\"binaries/myapp-\"]\n// after\n\"externalBin\": [\"binaries/myapp\"]","handlingStrategy":"validation","validationCode":"for bin in &config.bundle.external_bin {\n  let p = std::path::Path::new(bin);\n  assert!(p.file_name().is_some(), \"externalBin path has no filename: {bin}\");\n  let with_triple = format!(\"{}-{}\", bin, target_triple);\n  assert!(std::path::Path::new(&with_triple).is_file(), \"sidecar missing: {with_triple}\");\n}","typeGuard":"fn has_file_name(p: &std::path::Path) -> bool { p.file_name().is_some() }","tryCatchPattern":null,"preventionTips":["Configure sidecars without trailing separators and without the target-triple suffix.","Build sidecars for every target triple you release for.","Rename sidecars and their config entries together."],"tags":["linux","rpm","sidecar","path","panic"],"backgroundTag":"null-argument","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"}