{"id":"8c35ff2912c74680","repo":"rust-lang/cargo","slug":"cargo-run-does-not-support-glob-pattern-on","errorCode":null,"errorMessage":"`cargo run` does not support glob pattern `{}` on package selection","messagePattern":"`cargo run` does not support glob pattern `(.+?)` on package selection","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/bin/cargo/commands/run.rs","lineNumber":60,"sourceCode":"        .arg_ignore_rust_version()\n        .arg_unit_graph()\n        .arg_timings()\n        .after_help(color_print::cstr!(\n            \"Run `<bright-cyan,bold>cargo help run</>` for more detailed information.\\n\\\n             To pass `--help` to the specified binary, use `<bright-cyan,bold>-- --help</>`.\\n\",\n        ))\n}\n\npub fn exec(gctx: &mut GlobalContext, args: &ArgMatches) -> CliResult {\n    let ws = args.workspace(gctx)?;\n\n    let mut compile_opts =\n        args.compile_options(gctx, UserIntent::Build, Some(&ws), ProfileChecking::Custom)?;\n\n    // Disallow `spec` to be an glob pattern\n    if let Packages::Packages(opt_in) = &compile_opts.spec {\n        if let Some(pattern) = opt_in.iter().find(|s| is_glob_pattern(s)) {\n            return Err(anyhow::anyhow!(\n                \"`cargo run` does not support glob pattern `{}` on package selection\",\n                pattern,\n            )\n            .into());\n        }\n    }\n\n    if !args.contains_id(\"example\") && !args.contains_id(\"bin\") {\n        let default_runs: Vec<_> = compile_opts\n            .spec\n            .get_packages(&ws)?\n            .iter()\n            .filter_map(|pkg| pkg.manifest().default_run())\n            .collect();\n        if let [bin] = &default_runs[..] {\n            compile_opts.filter = CompileFilter::single_bin(bin.to_string());\n        } else {\n            // ops::run will take care of errors if len pkgs != 1.","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/rust-lang/cargo/blob/0e07a155371a6ce88ae53a2c00df940280c09a67/src/bin/cargo/commands/run.rs#L42-L78","documentation":"From run::exec (src/bin/cargo/commands/run.rs:57-66). `cargo run` must compile and execute exactly one binary, so it explicitly disallows glob patterns in -p/--package selection. It checks each package spec with util::restricted_names::is_glob_pattern and bails on the first match. Other commands (build/test) accept globs, but run does not because it cannot pick a single target from a glob.","triggerScenarios":"`cargo run -p 'serde_*'` or `cargo run -p '*derive*'` — any -p value containing glob metacharacters (* ? [ ]).","commonSituations":"Reusing a `cargo build -p '<glob>'` invocation for run; shell glob expansion leaking a `*` into the argument; copying package-selection patterns from build/test scripts.","solutions":["Name the exact package: `cargo run -p my-bin`.","Use --bin/--example to pick the target explicitly.","Run `cargo run` with no -p in a workspace whose default-run package is set in Cargo.toml."],"exampleFix":"// before\ncargo run -p 'mycli_*'\n\n// after\ncargo run -p mycli-server   # or: cargo run --bin mycli-server","handlingStrategy":"validation","validationCode":"// Reject glob patterns in -p for `cargo run`\nfn run_package_ok(spec: &str) -> bool {\n    !spec.contains(|c: char| matches!(c, '*' | '?' | '['))\n}\n\nif !pkgs.iter().all(|p| run_package_ok(p)) {\n    eprintln!(\"cargo run needs an exact package name, not a glob\");\n}","typeGuard":"fn is_exact_package_name(s: &str) -> bool {\n    !s.contains(|c: char| matches!(c, '*' | '?' | '[' | ']'))\n}","tryCatchPattern":null,"preventionTips":["Pass exact package (or --bin/--example) names to `cargo run`.","Set [package] default-run in Cargo.toml so you can `cargo run` without -p.","Don't reuse build/test glob selections for run."],"tags":["cargo","run","packages","glob","cli"],"analyzedSha":"0e07a155371a6ce88ae53a2c00df940280c09a67","analyzedAt":"2026-08-06T01:46:58.334Z","schemaVersion":2}