diff --git a/common/reviews/api/rush-lib.api.md b/common/reviews/api/rush-lib.api.md index da26a3aa3ec..37a1f05dbfa 100644 --- a/common/reviews/api/rush-lib.api.md +++ b/common/reviews/api/rush-lib.api.md @@ -798,6 +798,8 @@ export class RushConfigurationProject { get rushConfiguration(): RushConfiguration; get shouldPublish(): boolean; get skipRushCheck(): boolean; + // (undocumented) + readonly splitWorkspace: boolean; // @beta get tags(): ReadonlySet; get tempProjectName(): string; diff --git a/libraries/rush-lib/src/api/RushConfiguration.ts b/libraries/rush-lib/src/api/RushConfiguration.ts index 9f9df7cf9fc..24498991721 100644 --- a/libraries/rush-lib/src/api/RushConfiguration.ts +++ b/libraries/rush-lib/src/api/RushConfiguration.ts @@ -4,6 +4,7 @@ /* eslint max-lines: off */ import * as path from 'path'; +import * as process from 'process'; import * as semver from 'semver'; import { JsonFile, @@ -769,9 +770,14 @@ export class RushConfiguration { this._projects = []; this._projectsByName = new Map(); + let filteredProjects: IRushConfigurationProjectJson[] = this._rushConfigurationJson.projects; + if (process.argv.indexOf('install') >= 0 || process.argv.indexOf('update') >= 0) { + filteredProjects = filteredProjects.filter((x) => !x.splitWorkspace); + } + // We sort the projects array in alphabetical order. This ensures that the packages // are processed in a deterministic order by the various Rush algorithms. - const sortedProjectJsons: IRushConfigurationProjectJson[] = this._rushConfigurationJson.projects.slice(0); + const sortedProjectJsons: IRushConfigurationProjectJson[] = filteredProjects.slice(0); sortedProjectJsons.sort((a: IRushConfigurationProjectJson, b: IRushConfigurationProjectJson) => a.packageName.localeCompare(b.packageName) ); diff --git a/libraries/rush-lib/src/api/RushConfigurationProject.ts b/libraries/rush-lib/src/api/RushConfigurationProject.ts index 7fa43a5d801..fea5dacbee5 100644 --- a/libraries/rush-lib/src/api/RushConfigurationProject.ts +++ b/libraries/rush-lib/src/api/RushConfigurationProject.ts @@ -25,6 +25,7 @@ export interface IRushConfigurationProjectJson { skipRushCheck?: boolean; publishFolder?: string; tags?: string[]; + splitWorkspace?: boolean; } /** @@ -77,6 +78,8 @@ export class RushConfigurationProject { private _dependencyProjects: Set | undefined = undefined; private _consumingProjects: Set | undefined = undefined; + public readonly splitWorkspace: boolean; + /** @internal */ public constructor(options: IRushConfigurationProjectOptions) { const { projectJson, rushConfiguration, tempProjectName, allowedProjectTags } = options; @@ -187,6 +190,8 @@ export class RushConfigurationProject { } else { this._tags = new Set(projectJson.tags); } + + this.splitWorkspace = !!projectJson.splitWorkspace; } /** diff --git a/libraries/rush-lib/src/schemas/rush.schema.json b/libraries/rush-lib/src/schemas/rush.schema.json index 967031824ac..92d757d710b 100644 --- a/libraries/rush-lib/src/schemas/rush.schema.json +++ b/libraries/rush-lib/src/schemas/rush.schema.json @@ -294,7 +294,7 @@ } } }, - "additionalProperties": false, + "additionalProperties": true, "required": ["packageName", "projectFolder"] } },