{"record":{"id":"6b26898d340d2e9a","repo":"jdx/mise","slug":"with-expose-and-dependency-prereleases-cannot-be-combined","errorCode":null,"errorMessage":"with, expose, and dependency_prereleases cannot be combined with uvx = false","messagePattern":"with, expose, and dependency_prereleases cannot be combined with uvx = false","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/backend/pipx.rs","lineNumber":152,"sourceCode":"            !matches!(value, \"disallow\" | \"allow\" | \"if-necessary\" | \"explicit\")\n        }) {\n            bail!(\"dependency_prereleases must be disallow, allow, if-necessary, or explicit\");\n        }\n        Ok(value)\n    }\n\n    fn has_uv_only_options(&self) -> Result<bool> {\n        Ok(!self.with()?.is_empty()\n            || !self.expose()?.is_empty()\n            || self.dependency_prereleases()?.is_some())\n    }\n\n    fn validate_semantic(&self) -> Result<()> {\n        self.with()?;\n        self.exposed_package_names()?;\n        self.dependency_prereleases()?;\n        if self.has_uv_only_options()? && self.uvx_disabled() {\n            bail!(\"with, expose, and dependency_prereleases cannot be combined with uvx = false\");\n        }\n        Ok(())\n    }\n\n    fn uv_install_args(&self) -> Result<Vec<String>> {\n        let mut args = Vec::new();\n        for requirement in self.with()? {\n            args.extend([\"--with\".to_string(), requirement]);\n        }\n        for package in self.expose()? {\n            args.extend([\"--with-executables-from\".to_string(), package]);\n        }\n        if let Some(value) = self.dependency_prereleases()? {\n            args.extend([\"--prerelease\".to_string(), value.to_string()]);\n        }\n        Ok(args)\n    }\n","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/backend/pipx.rs#L134-L170","documentation":"validate_semantic rejects combining the uv-only semantic install options (with, expose, dependency_prereleases) with uvx = false. Those options are implemented by delegating resolution to uv/uvx; when uvx is disabled the backend falls back to plain pipx, which cannot honor them, so the combination is treated as contradictory.","triggerScenarios":"Configuring a pipx tool with uvx = false AND any of with = [...], expose = [...], or dependency_prereleases = \"...\" in the same tool options; validate_semantic is invoked via lockfile_options when resolving or locking the tool.","commonSituations":"User disables uvx to force classic pipx behavior but keeps leftover with/expose options from earlier config; team templates that set uvx = false globally while individual tool entries add uv-only options.","solutions":["Remove uvx = false so uv/uvx handles the install, or remove the with/expose/dependency_prereleases options","Set uvx = true explicitly in the tool options","Reinstall uv and keep uvx enabled if you need semantic dependency options"],"exampleFix":"// before\n[tools]\n\"pipx:ruff\" = { version = \"latest\", uvx = false, with = [\"rich\"] }\n// after\n[tools]\n\"pipx:ruff\" = { version = \"latest\", with = [\"rich\"] }","handlingStrategy":"validation","validationCode":"const uvOnly = [\"with\", \"expose\", \"dependency_prereleases\"].some(k => k in opts);\nif (opts.uvx === false && uvOnly)\n  throw new Error(\"with/expose/dependency_prereleases require uvx enabled\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["When setting uvx = false, audit the tool entry for uv-only options","Keep uv-only options in a shared config block only applied where uvx is enabled"],"tags":["config-validation","pipx","uv","conflicting-options"],"backgroundTag":"conflicting-config-options","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"}