Skip to content

Commit fe720ca

Browse files
hawkgsclydin
authored andcommitted
feat(@angular/build): add process.env.PORT support to the dev server
Make possible to set the dev server port via `process.env.PORT`. BREAKING CHANGE: The `@angular/build:dev-server (ng serve)` now assigns the highest priority to the `PORT` environment variable. This value will override any port configurations specified in `angular.json` or via the `--port` command-line flag. This includes the default port 4200. Resolves #32236
1 parent 93b1deb commit fe720ca

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

packages/angular/build/src/builders/dev-server/options.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,20 @@ export async function normalizeOptions(
8686
}
8787
}
8888

89+
let port = options.port ?? 4200;
90+
// Overwrite port, if process.env.PORT is available.
91+
if (process.env.PORT) {
92+
const envPort = Number(process.env.PORT);
93+
94+
if (!isNaN(envPort)) {
95+
port = envPort;
96+
logger.info(`Environment variable "PORT" detected. Using port ${envPort}.`);
97+
}
98+
}
99+
89100
// Initial options to keep
90101
const {
91102
host,
92-
port,
93103
poll,
94104
open,
95105
verbose,
@@ -111,7 +121,7 @@ export async function normalizeOptions(
111121
return {
112122
buildTarget,
113123
host: host ?? 'localhost',
114-
port: port ?? 4200,
124+
port,
115125
poll,
116126
open,
117127
verbose,

packages/angular/build/src/builders/dev-server/tests/options/port_spec.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT
4242
port: undefined,
4343
});
4444

45-
const { result, response, logs } = await executeOnceAndFetch(harness, '/');
45+
const { result, response } = await executeOnceAndFetch(harness, '/');
4646

4747
expect(result?.success).toBeTrue();
4848
expect(getResultPort(result)).toBe('4200');
@@ -55,7 +55,7 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT
5555
port: 0,
5656
});
5757

58-
const { result, response, logs } = await executeOnceAndFetch(harness, '/');
58+
const { result, response } = await executeOnceAndFetch(harness, '/');
5959

6060
expect(result?.success).toBeTrue();
6161
const port = getResultPort(result);
@@ -73,11 +73,30 @@ describeServeBuilder(executeDevServer, DEV_SERVER_BUILDER_INFO, (harness, setupT
7373
port: 8000,
7474
});
7575

76-
const { result, response, logs } = await executeOnceAndFetch(harness, '/');
76+
const { result, response } = await executeOnceAndFetch(harness, '/');
7777

7878
expect(result?.success).toBeTrue();
7979
expect(getResultPort(result)).toBe('8000');
8080
expect(await response?.text()).toContain('<title>');
8181
});
82+
83+
it('should be overwritten by process.env.PORT if it exists', async () => {
84+
try {
85+
harness.useTarget('serve', {
86+
...BASE_OPTIONS,
87+
port: 8000,
88+
});
89+
90+
process.env.PORT = '4201';
91+
92+
const { result, response } = await executeOnceAndFetch(harness, '/');
93+
94+
expect(result?.success).toBeTrue();
95+
expect(getResultPort(result)).toBe('4201');
96+
expect(await response?.text()).toContain('<title>');
97+
} finally {
98+
delete process.env.PORT;
99+
}
100+
});
82101
});
83102
});

0 commit comments

Comments
 (0)