diff --git a/goldens/public-api/angular/build/index.api.md b/goldens/public-api/angular/build/index.api.md index 79240b301679..482e152629ad 100644 --- a/goldens/public-api/angular/build/index.api.md +++ b/goldens/public-api/angular/build/index.api.md @@ -109,7 +109,7 @@ export enum BuildOutputFileType { // @public export type DevServerBuilderOptions = { allowedHosts?: AllowedHosts; - buildTarget: string; + buildTarget?: string; headers?: { [key: string]: string; }; diff --git a/packages/angular/build/src/builders/dev-server/options.ts b/packages/angular/build/src/builders/dev-server/options.ts index 3e0f59319117..0f953d036fc0 100644 --- a/packages/angular/build/src/builders/dev-server/options.ts +++ b/packages/angular/build/src/builders/dev-server/options.ts @@ -36,8 +36,10 @@ export async function normalizeOptions( const cacheOptions = normalizeCacheOptions(projectMetadata, workspaceRoot); - // Target specifier defaults to the current project's build target using a development configuration - const buildTargetSpecifier = options.buildTarget ?? `::development`; + // Target specifier defaults to the current project's build target using the provided dev-server + // configuration if a configuration is present or the 'development' configuration if not. + const buildTargetSpecifier = + options.buildTarget ?? `::${context.target?.configuration || 'development'}`; const buildTarget = targetFromTargetString(buildTargetSpecifier, projectName, 'build'); // Get the application builder options. diff --git a/packages/angular/build/src/builders/dev-server/schema.json b/packages/angular/build/src/builders/dev-server/schema.json index 41902e43d8d0..09d30c2ca84e 100644 --- a/packages/angular/build/src/builders/dev-server/schema.json +++ b/packages/angular/build/src/builders/dev-server/schema.json @@ -127,5 +127,5 @@ } }, "additionalProperties": false, - "required": ["buildTarget"] + "required": [] } diff --git a/packages/angular/cli/src/commands/serve/cli.ts b/packages/angular/cli/src/commands/serve/cli.ts index 3b38fa122acd..9324487946e8 100644 --- a/packages/angular/cli/src/commands/serve/cli.ts +++ b/packages/angular/cli/src/commands/serve/cli.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ +import { workspaces } from '@angular-devkit/core'; import { ArchitectCommandModule } from '../../command-builder/architect-command-module'; import { CommandModuleImplementation } from '../../command-builder/command-module'; import { RootCommands } from '../command-config'; @@ -19,4 +20,41 @@ export default class ServeCommandModule aliases = RootCommands['serve'].aliases; describe = 'Builds and serves your application, rebuilding on file changes.'; longDescriptionPath?: string | undefined; + + override async findDefaultBuilderName( + project: workspaces.ProjectDefinition, + ): Promise { + // Only application type projects have a dev server target + if (project.extensions['projectType'] !== 'application') { + return; + } + + const buildTarget = project.targets.get('build'); + if (!buildTarget) { + // No default if there is no build target + return; + } + + // Provide a default based on the defined builder for the 'build' target + switch (buildTarget.builder) { + case '@angular-devkit/build-angular:application': + case '@angular-devkit/build-angular:browser-esbuild': + case '@angular-devkit/build-angular:browser': + return '@angular-devkit/build-angular:dev-server'; + case '@angular/build:application': + return '@angular/build:dev-server'; + } + + // For other builders, attempt to resolve a 'dev-server' builder from the 'build' target package name + const [buildPackageName] = buildTarget.builder.split(':', 1); + if (buildPackageName) { + try { + const qualifiedBuilderName = `${buildPackageName}:dev-server`; + await this.getArchitectHost().resolveBuilder(qualifiedBuilderName); + + // Use builder if it resolves successfully + return qualifiedBuilderName; + } catch {} + } + } } diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/options.ts b/packages/angular_devkit/build_angular/src/builders/dev-server/options.ts index 6fa23123a236..88844b3e51eb 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/options.ts +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/options.ts @@ -36,8 +36,10 @@ export async function normalizeOptions( const cacheOptions = normalizeCacheOptions(projectMetadata, workspaceRoot); - // Target specifier defaults to the current project's build target using a development configuration - const buildTargetSpecifier = options.buildTarget ?? `::development`; + // Target specifier defaults to the current project's build target using the provided dev-server + // configuration if a configuration is present or the 'development' configuration if not. + const buildTargetSpecifier = + options.buildTarget ?? `::${context.target?.configuration || 'development'}`; const buildTarget = targetFromTargetString(buildTargetSpecifier, projectName, 'build'); // Get the application builder options. diff --git a/packages/angular_devkit/build_angular/src/builders/dev-server/schema.json b/packages/angular_devkit/build_angular/src/builders/dev-server/schema.json index 495f244b1722..38d91d5dd2d1 100644 --- a/packages/angular_devkit/build_angular/src/builders/dev-server/schema.json +++ b/packages/angular_devkit/build_angular/src/builders/dev-server/schema.json @@ -130,6 +130,5 @@ ] } }, - "additionalProperties": false, - "required": ["buildTarget"] + "additionalProperties": false }