angular/angular-cli · error · Error

Build target is not defined for this project.

Error message

Build target is not defined for this project.

What it means

When adding a web worker, the schematic wires a webWorkerTsConfig option into the project's "build" target. If the project has no "build" target defined, this Error is thrown since the tsconfig cannot be attached anywhere meaningful.

Source

Thrown at packages/schematics/angular/web-worker/index.ts:113

    const root = project.root || '';
    const templateSourceWorkerConfig = apply(url('./files/worker-tsconfig'), [
      applyTemplates({
        ...options,
        relativePathToWorkspaceRoot: relativePathToWorkspaceRoot(root),
      }),
      move(root),
    ]);

    return chain([
      // Add project configuration.
      updateWorkspace((workspace) => {
        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
        const project = workspace.projects.get(options.project)!;
        const buildTarget = project.targets.get('build');
        const testTarget = project.targets.get('test');
        if (!buildTarget) {
          throw new Error(`Build target is not defined for this project.`);
        }

        const workerConfigPath = join(root, 'tsconfig.worker.json');
        (buildTarget.options ??= {}).webWorkerTsConfig ??= workerConfigPath;
        if (testTarget) {
          (testTarget.options ??= {}).webWorkerTsConfig ??= workerConfigPath;
        }
      }),
      // Create the worker in a sibling module.
      options.snippet ? addSnippet(options) : noop(),
      // Add the worker.
      mergeWith(templateSourceWorkerCode),
      mergeWith(templateSourceWorkerConfig),
    ]);
  },
);

export default webWorkerSchematic;

View on GitHub (pinned to bb72145f9a)

Solutions

  1. Add a "build" target to the project in angular.json configured with @angular/build:application (or build-angular:application/browser).
  2. Ensure the target is named "build" — if you renamed it (e.g. to "compile"), rename it back or add an alias target.
  3. After the build target exists, rerun `ng g web-worker <name> --project=<project>` so the worker tsconfig gets wired in.

Example fix

// before (angular.json project)
"architect": { "test": { ... } }
// after
"architect": { "build": { "builder": "@angular/build:application", "options": { ... } }, "test": { ... } }
Defensive patterns

Strategy: validation

Validate before calling

const ws = JSON.parse(fs.readFileSync('angular.json', 'utf8'));
const p = ws.projects?.[name];
if (!p?.architect?.build && !p?.targets?.build) {
  throw new Error(`Project "${name}" has no "build" target; add @angular/build:application first.`);
}

Try / catch

try {
  await ngGenerate(['web-worker', workerName, '--project', name]);
} catch (e) {
  if (String((e as Error).message).includes('Build target is not defined')) {
    console.error(`Add a "build" target for "${name}" in angular.json, then retry.`);
  } else throw e;
}

Prevention

When it happens

Trigger: Running `ng generate web-worker` on a project (after the project lookup succeeds) whose angular.json targets/architect section lacks a "build" target — e.g. custom projects, test-only projects, or heavily restructured workspaces.

Common situations: Projects assembled manually without the standard application builder targets, monorepo setups where the build target was renamed, or projects migrated where the architect section was trimmed.

Related errors


AI-assisted analysis of angular/angular-cli@bb72145f9a (2026-08-30). Data as JSON: /api/errors/76278ffb599fe175. Report an issue: GitHub.