diff --git a/packages/angular/build/src/builders/dev-server/options.ts b/packages/angular/build/src/builders/dev-server/options.ts index b6da278f2936..5473da832449 100644 --- a/packages/angular/build/src/builders/dev-server/options.ts +++ b/packages/angular/build/src/builders/dev-server/options.ts @@ -86,10 +86,20 @@ export async function normalizeOptions( } } + let port = options.port ?? 4200; + // Overwrite port, if process.env.PORT is available. + if (process.env.PORT) { + const envPort = Number(process.env.PORT); + + if (!isNaN(envPort)) { + port = envPort; + logger.info(`Environment variable "PORT" detected. Using port ${envPort}.`); + } + } + // Initial options to keep const { host, - port, poll, open, verbose, @@ -111,7 +121,7 @@ export async function normalizeOptions( return { buildTarget, host: host ?? 'localhost', - port: port ?? 4200, + port, poll, open, verbose, diff --git a/packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts b/packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts index 8869dd20dcbb..d3e860023bde 100644 --- a/packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts +++ b/packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts @@ -42,7 +42,7 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT port: undefined, }); - const { result, response, logs } = await executeOnceAndFetch(harness, '/'); + const { result, response } = await executeOnceAndFetch(harness, '/'); expect(result?.success).toBeTrue(); expect(getResultPort(result)).toBe('4200'); @@ -55,7 +55,7 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT port: 0, }); - const { result, response, logs } = await executeOnceAndFetch(harness, '/'); + const { result, response } = await executeOnceAndFetch(harness, '/'); expect(result?.success).toBeTrue(); const port = getResultPort(result); @@ -73,11 +73,30 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT port: 8000, }); - const { result, response, logs } = await executeOnceAndFetch(harness, '/'); + const { result, response } = await executeOnceAndFetch(harness, '/'); expect(result?.success).toBeTrue(); expect(getResultPort(result)).toBe('8000'); expect(await response?.text()).toContain(''); }); + + it('should be overwritten by process.env.PORT if it exists', async () => { + try { + harness.useTarget('serve', { + ...BASE_OPTIONS, + port: 8000, + }); + + process.env.PORT = '4201'; + + const { result, response } = await executeOnceAndFetch(harness, '/'); + + expect(result?.success).toBeTrue(); + expect(getResultPort(result)).toBe('4201'); + expect(await response?.text()).toContain('<title>'); + } finally { + delete process.env.PORT; + } + }); }); });