{"record":{"id":"4400322375732fed","repo":"rust-lang/cargo","slug":"library-target-names-cannot-contain-hyphens","errorCode":null,"errorMessage":"library target names cannot contain hyphens: {}","messagePattern":"library target names cannot contain hyphens: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/workspace/parser/targets.rs","lineNumber":1152,"sourceCode":"fn validate_build_name(build: &str) -> CargoResult<()> {\n    if Path::new(build).file_stem().is_none() {\n        anyhow::bail!(\"invalid `package.build` file name\");\n    }\n    Ok(())\n}\n\nfn name_or_panic(target: &TomlTarget) -> &str {\n    target\n        .name\n        .as_deref()\n        .unwrap_or_else(|| panic!(\"target name is required\"))\n}\n\nfn validate_lib_name(target: &TomlTarget, warnings: &mut Vec<String>) -> CargoResult<()> {\n    validate_target_name(target, TARGET_KIND_HUMAN_LIB, TARGET_KIND_LIB, warnings)?;\n    let name = name_or_panic(target);\n    if name.contains('-') {\n        anyhow::bail!(\"library target names cannot contain hyphens: {}\", name)\n    }\n\n    Ok(())\n}\n\nfn validate_bin_name(bin: &TomlTarget, warnings: &mut Vec<String>) -> CargoResult<()> {\n    validate_target_name(bin, TARGET_KIND_HUMAN_BIN, TARGET_KIND_BIN, warnings)?;\n    let name = name_or_panic(bin).to_owned();\n    if restricted_names::is_conflicting_artifact_name(&name) {\n        anyhow::bail!(\n            \"the binary target name `{name}` is forbidden, \\\n                 it conflicts with cargo's build directory names\",\n        )\n    }\n\n    Ok(())\n}\n","sourceCodeStart":1134,"sourceCodeEnd":1170,"githubUrl":"https://github.com/rust-lang/cargo/blob/eb98b54bc9f3c74519f43d066cb3fd02ebc88df0/src/workspace/parser/targets.rs#L1134-L1170","documentation":"A library target's explicit `name` (the `[lib] name` field, not the package name) cannot contain hyphens, because it maps to a Rust crate identifier and module path. Cargo would normally derive the underscore form from the package name, but an explicit hyphenated lib name is rejected at targets.rs:1157-1159.","triggerScenarios":"Cargo.toml has `[lib] name = \"my-lib\"`. The `name.contains('-')` check fires.","commonSituations":"Setting `[lib] name` to match a hyphenated package name verbatim. Renaming a lib target without converting hyphens. Confusing the package name (hyphens allowed) with the lib crate name (underscores only).","solutions":["Replace hyphens with underscores: `name = \"my_lib\"`.","Omit the `[lib] name` field to let Cargo derive it from the package name automatically.","Keep the package name hyphenated; only the lib `name` must use underscores."],"exampleFix":"# before\n[lib]\nname = \"my-lib\"\n\n# after\n[lib]\nname = \"my_lib\"","handlingStrategy":"validation","validationCode":"fn lib_name_valid(name: &str) -> bool {\n    !name.contains('-')\n}\n// enforce underscores for explicit `[lib] name` values","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use underscores in `[lib] name`; hyphens are fine only in `[package] name`.","Omit `[lib] name` to let Cargo derive the underscore form.","Remember package name and lib crate name are distinct concepts."],"tags":["cargo","config","library","naming","manifest"],"backgroundTag":null,"analyzedSha":"eb98b54bc9f3c74519f43d066cb3fd02ebc88df0","analyzedAt":"2026-08-11T17:42:36.556Z","contentChangedAt":"2026-08-11T17:42:36.556Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}