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

  1. Set the same value for both `pypi.{name}` and `pipx.{name}`, or
  2. Delete the legacy `pipx.{name}` key and keep only `pypi.{name}`.
  3. 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

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


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)