{"record":{"id":"909337638faf663a","repo":"angular/angular-cli","slug":"target-name-already-exists","errorCode":null,"errorMessage":"Target name already exists.","messagePattern":"Target name already exists\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/angular_devkit/core/src/workspace/definitions.ts","lineNumber":222,"sourceCode":"    }\n  }\n}\n\nexport class TargetDefinitionCollection extends DefinitionCollection<TargetDefinition> {\n  constructor(\n    initial?: Record<string, TargetDefinition>,\n    listener?: DefinitionCollectionListener<TargetDefinition>,\n  ) {\n    super(initial, listener);\n  }\n\n  add(\n    definition: {\n      name: string;\n    } & TargetDefinition,\n  ): TargetDefinition {\n    if (this.has(definition.name)) {\n      throw new Error('Target name already exists.');\n    }\n    this._validateName(definition.name);\n\n    const target = {\n      builder: definition.builder,\n      options: definition.options,\n      configurations: definition.configurations,\n      defaultConfiguration: definition.defaultConfiguration,\n    };\n\n    super.set(definition.name, target);\n\n    return target;\n  }\n\n  override set(name: string, value: TargetDefinition): this {\n    this._validateName(name);\n","sourceCodeStart":204,"sourceCodeEnd":240,"githubUrl":"https://github.com/angular/angular-cli/blob/bb72145f9ab45aee29f523236b3a25cd0813a841/packages/angular_devkit/core/src/workspace/definitions.ts#L204-L240","documentation":"TargetDefinitionCollection.add() enforces unique target names within a project. If a target with the same name is already registered (checked via has(name)) it throws before validating/creating the target. Duplicate target names would make the 'project:target' selector ambiguous.","triggerScenarios":"Calling project.addTarget({ name: 'build', builder: '...' }) when a 'build' target already exists on that project.","commonSituations":"Schematic re-run adding standard targets (build, serve, test) twice; scripts that merge configurations from two sources; applying the same generator to a project twice.","solutions":["Check project targets (has) before adding and skip or update the existing target.","Use set() on the target collection if overwriting is intended.","Remove the existing target first, then add the new one."],"exampleFix":"// before\nproject.addTarget({ name: 'build', builder: '@angular-devkit/build-angular:browser' });\n// after\nif (!project.targets.has('build')) {\n  project.addTarget({ name: 'build', builder: '@angular-devkit/build-angular:browser' });\n}","handlingStrategy":"validation","validationCode":"if (project.targets.has(targetName)) {\n  // skip or update instead of adding\n} else {\n  project.addTarget({ name: targetName, builder, options });\n}","typeGuard":"function canAddTarget(project: ProjectDefinition, name: string): boolean {\n  return typeof name === 'string' && !project.targets.has(name);\n}","tryCatchPattern":"try {\n  project.addTarget({ name, builder });\n} catch (e) {\n  if (e.message === 'Target name already exists.') {\n    project.targets.set(name, { builder, options }); // overwrite intentionally\n  } else throw e;\n}","preventionTips":["Check targets.has(name) before addTarget, especially for standard names (build, serve, test)","Make generators idempotent so re-running them does not re-add targets","Use set() when you intend to replace an existing target configuration"],"tags":["workspace","duplicate-name","targets","angular-devkit"],"backgroundTag":"duplicate-key-conflict","analyzedSha":"bb72145f9ab45aee29f523236b3a25cd0813a841","analyzedAt":"2026-08-30T02:47:34.745Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}