jdx/mise · error

dependency locking does not support uvx_args or pipx_args

Error message

{} dependency locking does not support uvx_args or pipx_args

What it means

validate_lock_options in the pipx lock module rejects replaying/creating a uv dependency lock when uvx_args or pipx_args are configured. Custom uvx/pipx CLI arguments make the dependency resolution non-reproducible through the lock machinery, so the combination is disallowed.

Solutions

  1. Remove uvx_args/pipx_args from the tool options, then run `mise lock`
  2. Keep uvx_args/pipx_args but skip dependency locking (install resolves version-only)
  3. Fold needed flags into supported options where possible

Example fix

// before
[tools]
"pipx:ruff" = { version = "latest", uvx_args = "--python 3.12" }
// after
[tools]
"pipx:ruff" = { version = "latest" }
Defensive patterns

Strategy: validation

Validate before calling

if ((opts.uvx_args?.trim() || opts.pipx_args?.trim()) && lockEnabled)
  throw new Error("uvx_args/pipx_args are incompatible with dependency locking");

Prevention

When it happens

Trigger: Running `mise lock` or installing from a lock (prepare_install_version, resolve_uv_lock, validate_uv_lock) for a pipx tool whose options set uvx_args or pipx_args with non-empty values while dependency locking is in play.

Common situations: Config carries extra uv CLI flags (e.g. --index-url, --python) passed via uvx_args; user tries to lock a tool that previously used custom args; migration of old config with args into a locked setup.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/28f60732d6a12a5e. Report an issue: GitHub.

Appendix: source

Thrown at src/backend/pipx/lock.rs:62

            && !PipxOptions::new(&tv.request.options()).uvx_disabled()
            && matches!(
                self.tool_name().parse::<PipxRequest>(),
                Ok(PipxRequest::Pypi(_))
            )
    }

    pub(super) fn uv_lock_options_supported(&self, tv: &ToolVersion) -> bool {
        let raw = tv.request.options();
        let opts = PipxOptions::new(&raw);
        [opts.uvx_args(), opts.pipx_args()]
            .into_iter()
            .flatten()
            .all(|s| s.trim().is_empty())
    }

    pub(super) fn validate_lock_options(&self, tv: &ToolVersion) -> Result<()> {
        if !self.uv_lock_options_supported(tv) {
            bail!(
                "{} dependency locking does not support uvx_args or pipx_args",
                self.ba.short
            );
        }
        if !self.uv_lock_allowed(tv) {
            bail!(
                "{} has a uv dependency graph; use uv with a PyPI package to replay it",
                self.ba.short
            );
        }
        Ok(())
    }

    async fn lock_uv_program(&self, config: &Arc<Config>) -> Result<PathBuf> {
        let uv = self.spawnable_dependency(config, None, "uv").await
            .ok_or_else(|| eyre!("Python dependency locks require uv >= {MIN_UV_VERSION}; install it with `mise use uv`"))?;
        let output = CmdLineRunner::new(&uv).arg("--version").read().await?;
        let version = output

View on GitHub (pinned to 533346cc37)