{"record":{"id":"ecf038797c23e05b","repo":"jdx/mise","slug":"additional-asset-is-not-an-archive","errorCode":null,"errorMessage":"additional asset '{}' is not an archive","messagePattern":"additional asset '(.+?)' is not an archive","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/backend/github.rs","lineNumber":1859,"sourceCode":"                );\n            }\n        } else if Settings::get().lockfile_enabled() {\n            artifact.size = Some(file_path.metadata()?.len());\n        }\n        Ok(())\n    }\n\n    fn install_additional_archive(\n        &self,\n        install_path: &Path,\n        file_path: &Path,\n        pr: Option<&dyn crate::ui::progress_report::SingleReport>,\n    ) -> Result<()> {\n        let format = file::ExtractionFormat::from_file_name(\n            &file_path.file_name().unwrap_or_default().to_string_lossy(),\n        );\n        if !format.is_archive() {\n            eyre::bail!(\n                \"additional asset '{}' is not an archive\",\n                file_path.display()\n            );\n        }\n        let extract_opts = file::ExtractOptions {\n            pr,\n            ..Default::default()\n        };\n        file::extract_archive(file_path, install_path, format, &extract_opts)\n    }\n\n    /// Discovers bin paths in the installation directory\n    fn discover_bin_paths(&self, tv: &ToolVersion) -> Result<Vec<std::path::PathBuf>> {\n        let raw_opts = tv.request.options();\n        let opts = self.options(&raw_opts);\n        if let Some(bin_path_template) = opts.bin_path() {\n            let bin_path = template_string(&bin_path_template, tv);\n            return Ok(vec![tv.install_path().join(&bin_path)]);","sourceCodeStart":1841,"sourceCodeEnd":1877,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/backend/github.rs#L1841-L1877","documentation":"Additional assets configured for a GitHub-backend tool are extracted into the install directory after download, so each must be a recognized archive format (tar, zip, etc.). If `ExtractionFormat::from_file_name` cannot identify the file as an archive, mise refuses to process it.","triggerScenarios":"additional_assets/additional patterns pointing at a raw binary, plain text file, or extension-less file that ExtractionFormat::from_file_name does not recognize during additional-asset extraction.","commonSituations":"Configuring `extra Binaries` style patterns that match a bare executable published alongside the release; upstream renamed an asset losing its .tar.gz/.zip extension.","solutions":["Point the additional-asset pattern at an archived asset (.tar.gz, .tgz, .zip, etc.)","Ask the upstream project to publish the file with a recognized archive extension","Download the raw file out-of-band (e.g. a task/link step) instead of using additional assets"],"exampleFix":"// before (mise.toml)\n[tools.\"github:owner/repo\"]\nadditional_assets = [\"bintool\"]\n// after\nadditional_assets = [\"bintool-linux-x64.tar.gz\"]","handlingStrategy":"validation","validationCode":"// bash: check each configured additional asset is a recognized archive\nfor a in $ADDITIONAL_ASSETS; do\n  case \"$a\" in *.tar.gz|*.tgz|*.tar.xz|*.tar.bz2|*.zip) ;; *) echo \"not an archive: $a\"; exit 1;; esac\ndone","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Only list archived assets (.tar.gz/.zip) in additional_assets patterns","Check the upstream release page's asset extensions before configuring patterns","Prefer patterns that match archived bundles over bare binaries"],"tags":["archive","extraction","github-backend","config"],"backgroundTag":"unsupported-operation","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}