jdx/mise · error
conflicting pypi. and pipx. settings
Error message
conflicting pypi.{name} and pipx.{name} settings What it means
After layers are merged, mise collapses each legacy `pipx.{name}` setting into its preferred `pypi.{name}` counterpart. If both are set to different values it cannot pick one and bails with this message. If only one is set, that value is used and the legacy field is cleared.
Solutions
- Set the same value for both `pypi.{name}` and `pipx.{name}`, or
- Delete the legacy `pipx.{name}` key and keep only `pypi.{name}`.
- Check global (~/.config/mise/config.toml), project, and MISE_* environment overrides — the conflict may span files.
Example fix
# before [settings] pipx.uvx = "uvx" pypi.uvx = "/usr/local/bin/uvx" # after [settings] pypi.uvx = "/usr/local/bin/uvx"
Defensive patterns
Strategy: validation
Validate before calling
# shell: find files that set both keys grep -rl 'pipx\.' ~/.config/mise $(mise cfg ls 2>/dev/null || true) 2>/dev/null | xargs -r grep -l 'pypi\.'
Prevention
- Treat `pypi.*` as the canonical key and never set `pipx.*` in new configs.
- Audit global and project configs after mise upgrades that renamed settings.
- Set MISE_* env overrides in only one place to avoid layer conflicts.
When it happens
Trigger: Both `pypi.<name>` and `pipx.<name>` (e.g. uvx or registry_url) are defined anywhere in the settings hierarchy with non-equal values when the merge/dedup helper runs.
Common situations: Global config sets the old `pipx.*` key while a project config sets the new `pypi.*` key to a different value; stale settings left after a mise upgrade that renamed pipx settings to pypi.
Understand the failure class
Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.
Related errors
- conflicting pypi and pipx settings in the same file
- bootstrap service ' ' cannot be both masked and running
- bootstrap service ' ' cannot be both masked and enabled
- conflicting bootstrap secret declarations for
- conflicting bootstrap service declarations for
AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17).
Data as JSON: /api/errors/b576b2a886730ea6.
Report an issue: GitHub.
Appendix: source
Thrown at src/config/settings.rs:1251
warn_deprecated_env_settings();
for msg in pending_files {
warn_once!("{msg}");
}
for key in pending {
warn_deprecated_now(key);
}
}
fn normalize_pypi_aliases(&mut self) -> Result<()> {
fn merge<T: PartialEq>(
preferred: &mut Option<T>,
legacy: &mut Option<T>,
name: &str,
) -> Result<()> {
if let (Some(a), Some(b)) = (preferred.as_ref(), legacy.as_ref())
&& a != b
{
eyre::bail!("conflicting pypi.{name} and pipx.{name} settings");
}
if preferred.is_none() {
*preferred = legacy.take();
} else {
legacy.take();
}
Ok(())
}
merge(
&mut self.pypi.registry_url,
&mut self.pipx.registry_url,
"registry_url",
)?;
merge(&mut self.pypi.uvx, &mut self.pipx.uvx, "uvx")?;
self.pypi
.registry_url
.get_or_insert_with(|| "https://pypi.org/pypi/{}/json".to_owned());
Ok(())View on GitHub (pinned to 533346cc37)