{"id":"46b94766d2cfeea5","repo":"rust-lang/cargo","slug":"invalid-character-in-package-name-toolchai","errorCode":null,"errorMessage":"invalid character `+` in package name: `+{toolchain}`\n    Use `cargo +{toolchain} install` if you meant to use the `{toolchain}` toolchain.","messagePattern":"invalid character `\\+` in package name: `\\+(.+?)`\n    Use `cargo \\+(.+?) install` if you meant to use the `(.+?)` toolchain\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/bin/cargo/commands/install.rs","lineNumber":154,"sourceCode":"    for (crate_name, _) in krates.iter() {\n        let package_name = PackageName::new(crate_name);\n        if !crate_name.contains(\"@\") && package_name.is_err() {\n            for (idx, ch) in crate_name.char_indices() {\n                if !(unicode_ident::is_xid_continue(ch) || ch == '-') {\n                    let mut suggested_crate_name = crate_name.to_string();\n                    suggested_crate_name.insert_str(idx, \"@\");\n                    if let Ok((_, Some(_))) = parse_crate(&suggested_crate_name.as_str()) {\n                        let err = package_name.unwrap_err();\n                        return Err(\n                            anyhow::format_err!(\"{err}\\n\\n\\\n                                help: if this is meant to be a package name followed by a version, insert an `@` like `{suggested_crate_name}`\").into());\n                    }\n                }\n            }\n        }\n\n        if let Some(toolchain) = crate_name.strip_prefix(\"+\") {\n            return Err(anyhow!(\n                \"invalid character `+` in package name: `+{toolchain}`\n    Use `cargo +{toolchain} install` if you meant to use the `{toolchain}` toolchain.\"\n            )\n            .into());\n        }\n\n        if let Ok(url) = crate_name.into_url() {\n            if matches!(url.scheme(), \"http\" | \"https\") {\n                return Err(anyhow!(\n                    \"invalid package name: `{url}`\n    Use `cargo install --git {url}` if you meant to install from a git repository.\"\n                )\n                .into());\n            }\n        }\n\n        if crate_name != \".\"\n            && let Err(e) = package_name","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/rust-lang/cargo/blob/0e07a155371a6ce88ae53a2c00df940280c09a67/src/bin/cargo/commands/install.rs#L136-L172","documentation":"From install::exec (src/bin/cargo/commands/install.rs:153-159). For each crate argument, if the name begins with `+`, Cargo treats it as a misplaced toolchain override and bails, suggesting the correct `cargo +<toolchain> install` order. The `+` prefix is reserved by Cargo for toolchain selection, which must precede the subcommand.","triggerScenarios":"Running `cargo install +nightly ripgrep` instead of `cargo +nightly install ripgrep`. A shell snippet concatenating `+toolchain` in the wrong position.","commonSituations":"Misordered toolchain override in scripts/docs; copy-paste from an example that had the wrong order.","solutions":["Put the toolchain before the subcommand: `cargo +<toolchain> install <crate>`.","If `+name` was not meant as a toolchain, remove the `+`.","Check shell quoting for stray `+`."],"exampleFix":"// before\ncargo install +nightly ripgrep\n\n// after\ncargo +nightly install ripgrep","handlingStrategy":"validation","validationCode":"// Build an install command with the toolchain in the correct position\nfn build_install_cmd(toolchain: Option<&str>, crate_name: &str) -> Vec<String> {\n    let mut v: Vec<String> = vec![\"cargo\".into()];\n    if let Some(tc) = toolchain.filter(|t| !t.is_empty()) {\n        v.push(format!(\"+{tc}\"));\n    }\n    v.push(\"install\".into());\n    assert!(!crate_name.starts_with('+'), \"crate name must not start with +\");\n    v.push(crate_name.into());\n    v\n}","typeGuard":"fn looks_like_toolchain_override(arg: &str) -> bool {\n    arg.starts_with('+') && arg.len() > 1\n}","tryCatchPattern":null,"preventionTips":["Order is always `cargo +toolchain install <crate>`.","Validate crate names don't start with `+` before passing to install."],"tags":["cargo","install","toolchain","cli","argument-parsing"],"analyzedSha":"0e07a155371a6ce88ae53a2c00df940280c09a67","analyzedAt":"2026-08-06T01:46:58.334Z","schemaVersion":2}