fix(@angular-devkit/build-angular): display incompatibility errors

The logger API writes logs in an async fasion which previously caused messages not to be printed in the terminal when `process.exit` was invoked.

Closes #21322
This commit is contained in:
Alan Agius 2021-07-12 12:43:58 +02:00 committed by Filipe Silva
parent 0907b69417
commit 2ac8e9c0e1
6 changed files with 13 additions and 11 deletions

View File

@ -171,7 +171,7 @@ export function buildWebpackBrowser(
let outputPaths: undefined | Map<string, string>; let outputPaths: undefined | Map<string, string>;
// Check Angular version. // Check Angular version.
assertCompatibleAngularVersion(context.workspaceRoot, context.logger); assertCompatibleAngularVersion(context.workspaceRoot);
return from(context.getProjectMetadata(projectName)).pipe( return from(context.getProjectMetadata(projectName)).pipe(
switchMap(async (projectMetadata) => { switchMap(async (projectMetadata) => {

View File

@ -112,7 +112,7 @@ export function serveWebpackBrowser(
): Observable<DevServerBuilderOutput> { ): Observable<DevServerBuilderOutput> {
// Check Angular version. // Check Angular version.
const { logger, workspaceRoot } = context; const { logger, workspaceRoot } = context;
assertCompatibleAngularVersion(workspaceRoot, logger); assertCompatibleAngularVersion(workspaceRoot);
const browserTarget = targetFromTargetString(options.browserTarget); const browserTarget = targetFromTargetString(options.browserTarget);

View File

@ -147,7 +147,7 @@ export async function execute(
}, },
): Promise<BuildResult> { ): Promise<BuildResult> {
// Check Angular version. // Check Angular version.
assertCompatibleAngularVersion(context.workspaceRoot, context.logger); assertCompatibleAngularVersion(context.workspaceRoot);
const browserTarget = targetFromTargetString(options.browserTarget); const browserTarget = targetFromTargetString(options.browserTarget);
const browserOptions = await context.validateOptions<JsonObject & BrowserBuilderOptions>( const browserOptions = await context.validateOptions<JsonObject & BrowserBuilderOptions>(

View File

@ -91,7 +91,7 @@ export function execute(
} = {}, } = {},
): Observable<BuilderOutput> { ): Observable<BuilderOutput> {
// Check Angular version. // Check Angular version.
assertCompatibleAngularVersion(context.workspaceRoot, context.logger); assertCompatibleAngularVersion(context.workspaceRoot);
let singleRun: boolean | undefined; let singleRun: boolean | undefined;
if (options.watch !== undefined) { if (options.watch !== undefined) {

View File

@ -60,7 +60,7 @@ export function execute(
const root = context.workspaceRoot; const root = context.workspaceRoot;
// Check Angular version. // Check Angular version.
assertCompatibleAngularVersion(root, context.logger); assertCompatibleAngularVersion(root);
const tsConfig = readTsconfig(options.tsConfig, root); const tsConfig = readTsconfig(options.tsConfig, root);
const target = tsConfig.options.target || ScriptTarget.ES5; const target = tsConfig.options.target || ScriptTarget.ES5;

View File

@ -6,10 +6,12 @@
* found in the LICENSE file at https://angular.io/license * found in the LICENSE file at https://angular.io/license
*/ */
import { logging, tags } from '@angular-devkit/core'; /* eslint-disable no-console */
import { SemVer, gte, satisfies } from 'semver';
export function assertCompatibleAngularVersion(projectRoot: string, logger: logging.LoggerApi) { import { tags } from '@angular-devkit/core';
import { SemVer, satisfies } from 'semver';
export function assertCompatibleAngularVersion(projectRoot: string): void | never {
let angularCliPkgJson; let angularCliPkgJson;
let angularPkgJson; let angularPkgJson;
let rxjsPkgJson; let rxjsPkgJson;
@ -22,7 +24,7 @@ export function assertCompatibleAngularVersion(projectRoot: string, logger: logg
angularPkgJson = require(angularPackagePath); angularPkgJson = require(angularPackagePath);
rxjsPkgJson = require(rxjsPackagePath); rxjsPkgJson = require(rxjsPackagePath);
} catch { } catch {
logger.error(tags.stripIndents` console.error(tags.stripIndents`
You seem to not be depending on "@angular/core" and/or "rxjs". This is an error. You seem to not be depending on "@angular/core" and/or "rxjs". This is an error.
`); `);
@ -30,7 +32,7 @@ export function assertCompatibleAngularVersion(projectRoot: string, logger: logg
} }
if (!(angularPkgJson && angularPkgJson['version'] && rxjsPkgJson && rxjsPkgJson['version'])) { if (!(angularPkgJson && angularPkgJson['version'] && rxjsPkgJson && rxjsPkgJson['version'])) {
logger.error(tags.stripIndents` console.error(tags.stripIndents`
Cannot determine versions of "@angular/core" and/or "rxjs". Cannot determine versions of "@angular/core" and/or "rxjs".
This likely means your local installation is broken. Please reinstall your packages. This likely means your local installation is broken. Please reinstall your packages.
`); `);
@ -63,7 +65,7 @@ export function assertCompatibleAngularVersion(projectRoot: string, logger: logg
const supportedAngularSemver = `^${cliMajor}.0.0-next || >=${cliMajor}.0.0 <${cliMajor + 1}.0.0`; const supportedAngularSemver = `^${cliMajor}.0.0-next || >=${cliMajor}.0.0 <${cliMajor + 1}.0.0`;
if (!satisfies(angularVersion, supportedAngularSemver, { includePrerelease: true })) { if (!satisfies(angularVersion, supportedAngularSemver, { includePrerelease: true })) {
logger.error( console.error(
tags.stripIndents` tags.stripIndents`
This version of CLI is only compatible with Angular versions ${supportedAngularSemver}, This version of CLI is only compatible with Angular versions ${supportedAngularSemver},
but Angular version ${angularVersion} was found instead. but Angular version ${angularVersion} was found instead.