{"record":{"id":"1c74f1d5b63380f5","repo":"astral-sh/uv","slug":"unnamed-requirements-are-not-allowed-as-exclusions","errorCode":null,"errorMessage":"Unnamed requirements are not allowed as exclusions (found: `{requirement}`)","messagePattern":"Unnamed requirements are not allowed as exclusions \\(found: `(.+?)`\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/uv-requirements/src/specification.rs","lineNumber":675,"sourceCode":"            spec.no_index |= source.no_index;\n            spec.extra_index_urls.extend(source.extra_index_urls);\n            spec.find_links.extend(source.find_links);\n            spec.no_binary.extend(source.no_binary);\n            spec.no_build.extend(source.no_build);\n            spec.require_hashes |= source.require_hashes;\n        }\n\n        // Collect excludes.\n        for source in excludes {\n            let source = Self::from_source_with_cache(source, client_builder, &mut cache).await?;\n            for req_spec in source.requirements {\n                match req_spec.requirement {\n                    UnresolvedRequirement::Named(requirement) => {\n                        spec.excludes\n                            .push(ExcludeDependency::Dependency(requirement.name));\n                    }\n                    UnresolvedRequirement::Unnamed(requirement) => {\n                        return Err(anyhow::anyhow!(\n                            \"Unnamed requirements are not allowed as exclusions (found: `{requirement}`)\"\n                        ));\n                    }\n                }\n            }\n            spec.excludes.extend(source.excludes);\n        }\n\n        Ok(spec)\n    }\n\n    /// Parse an individual package requirement.\n    pub fn parse_package(name: &str) -> Result<UnresolvedRequirementSpecification> {\n        let requirement = RequirementsTxtRequirement::parse(name, &*CWD, false)\n            .with_context(|| format!(\"Failed to parse: `{name}`\"))?;\n        Ok(UnresolvedRequirementSpecification::from(requirement))\n    }\n","sourceCodeStart":657,"sourceCodeEnd":693,"githubUrl":"https://github.com/astral-sh/uv/blob/f1a42680ff5272232d65748acf338b19778dde24/crates/uv-requirements/src/specification.rs#L657-L693","documentation":"Exclusions (e.g., `--exclude` inputs merged in RequirementsSpecification) work by package name, so each parsed requirement must be named. When an exclusion source yields an UnresolvedRequirement::Unnamed (URL/path requirement), uv errors out during the excludes-merge loop, printing the offending requirement.","triggerScenarios":"Passing `--exclude https://github.com/org/repo` or `--exclude ./local/pkg.tar.gz` to a command that supports exclusions; feeding an exclusion file that lists a direct URL dependency instead of a package name.","commonSituations":"Assuming `--exclude` accepts the same syntax as requirements (URLs, paths, VCS specs); scripted dependency pruning that copies requirement lines verbatim into an exclusion list.","solutions":["Replace the unnamed entry with the package's name only, e.g., `--exclude my-pkg`.","If you meant to remove a URL requirement from the resolve, delete or edit that line in the requirements source instead of using --exclude.","For VCS/URL deps, find their distribution name (from the wheel/sdist metadata) and exclude that name."],"exampleFix":"# before\nuv pip compile requirements.txt --exclude ./wheels/team-util-1.0-py3-none-any.whl\n# after\nuv pip compile requirements.txt --exclude team-util","handlingStrategy":"validation","validationCode":"# Rust: only pass named requirements into the excludes pipeline\nfn exclusion_names(reqs: &[RequirementEntry]) -> anyhow::Result<Vec<PackageName>> {\n    reqs.iter()\n        .map(|entry| match &entry.requirement {\n            UnresolvedRequirement::Named(r) => Ok(r.name.clone()),\n            UnresolvedRequirement::Unnamed(r) => {\n                anyhow::bail!(\"exclusions must be named, got: {r}\")\n            }\n        })\n        .collect()\n}","typeGuard":"fn is_excludable(entry: &RequirementEntry) -> bool {\n    matches!(entry.requirement, UnresolvedRequirement::Named(_))\n}","tryCatchPattern":null,"preventionTips":["Pass package names (not URLs/paths) to --exclude.","When scripting exclusions from an existing requirements list, map each URL entry to its distribution name first."],"tags":["exclusions","requirements","validation"],"backgroundTag":null,"analyzedSha":"f1a42680ff5272232d65748acf338b19778dde24","analyzedAt":"2026-08-16T04:51:47.599Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}