From 150d8bf1a11eaae7f2d042cc5b51b33364f130a6 Mon Sep 17 00:00:00 2001 From: Noel Mace Date: Thu, 19 Apr 2018 23:09:45 +0200 Subject: [PATCH] feat(@angular/cli): build only the projects of a certain type This commit is just a first example for #10369, following the discussion started in angular/devkit#730. angular/devkit#739 would be needed. This example would also require some evolutions on @angular-devkit/architect, but I'm sure there is a way to do this. --- packages/@angular/cli/commands/build.ts | 7 +++++++ packages/@angular/cli/models/architect-command.ts | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/@angular/cli/commands/build.ts b/packages/@angular/cli/commands/build.ts index 744f405f191f..0109e0c33156 100644 --- a/packages/@angular/cli/commands/build.ts +++ b/packages/@angular/cli/commands/build.ts @@ -1,13 +1,16 @@ import { ArchitectCommand } from '../models/architect-command'; import { Option, CommandScope } from '../models/command'; import { Version } from '../upgrade/version'; +import { experimental } from '@angular-devkit/core'; export interface Options { project?: string; configuration?: string; + projectType?: string; prod: boolean; } + export default class BuildCommand extends ArchitectCommand { public readonly name = 'build'; public readonly target = 'build'; @@ -38,9 +41,13 @@ export default class BuildCommand extends ArchitectCommand { delete overrides.configuration; delete overrides.prod; + const filter: experimental.workspace.projectFilter = options.projectType + && ((project) => project.projectType === options.projectType); + return this.runArchitectTarget({ project: options.project, target: this.target, + projectFilter: filter, configuration, overrides }, options); diff --git a/packages/@angular/cli/models/architect-command.ts b/packages/@angular/cli/models/architect-command.ts index 0e7d289d6400..d7634f3fcaef 100644 --- a/packages/@angular/cli/models/architect-command.ts +++ b/packages/@angular/cli/models/architect-command.ts @@ -10,6 +10,8 @@ import { from } from 'rxjs'; import { concatMap, map, tap, toArray } from 'rxjs/operators'; import { WorkspaceLoader } from '../models/workspace-loader'; +type projectFilter = experimental.workspace.projectFilter; + export abstract class ArchitectCommand extends Command { private _host = new NodeJsSyncHost(); @@ -161,7 +163,7 @@ export abstract class ArchitectCommand extends Command { if (!targetSpec.project && this.target) { // This runs each target sequentially. // Running them in parallel would jumble the log messages. - return await from(this.getProjectNamesByTarget(this.target)).pipe( + return await from(this.getProjectNamesByTarget(this.target, targetSpec.projectFilter)).pipe( concatMap(project => runSingleTarget({ ...targetSpec, project })), toArray(), ).toPromise().then(results => results.every(res => res === 0) ? 0 : 1); @@ -194,8 +196,8 @@ export abstract class ArchitectCommand extends Command { } } - private getProjectNamesByTarget(targetName: string): string[] { - const allProjectsForTargetName = this._workspace.listProjectNames().map(projectName => + private getProjectNamesByTarget(targetName: string, filter?: projectFilter): string[] { + const allProjectsForTargetName = this._workspace.listProjectNames(filter).map(projectName => this._architect.listProjectTargets(projectName).includes(targetName) ? projectName : null ).filter(x => !!x);