diff --git a/packages/nx/src/config/workspaces.spec.ts b/packages/nx/src/config/workspaces.spec.ts index 4b1e66930a..6e1178d17d 100644 --- a/packages/nx/src/config/workspaces.spec.ts +++ b/packages/nx/src/config/workspaces.spec.ts @@ -79,13 +79,18 @@ describe('Workspaces', () => { }), 'libs/domain/lib4/project.json': JSON.stringify(domainLibConfig), 'libs/domain/lib4/package.json': JSON.stringify({}), + 'workspace.json': JSON.stringify({ + projects: { 'lib1-workspace': 'libs/lib1' }, + }), }, '/root' ); const workspaces = new Workspaces('/root'); const { projects } = workspaces.readWorkspaceConfiguration(); - expect(projects.lib1).toEqual(lib1Config); + // projects got deduped so the workspace one remained + expect(projects['lib1-workspace']).toEqual(lib1Config); + expect(projects['lib1']).toBeUndefined(); expect(projects.lib2).toEqual(lib2Config); expect(projects['domain-lib3']).toEqual(domainPackageConfig); expect(projects['domain-lib4']).toEqual(domainLibConfig); diff --git a/packages/nx/src/config/workspaces.ts b/packages/nx/src/config/workspaces.ts index fc5437447f..3eb828491a 100644 --- a/packages/nx/src/config/workspaces.ts +++ b/packages/nx/src/config/workspaces.ts @@ -86,10 +86,10 @@ export class Workspaces { const workspaceFile = workspaceConfigName(this.root); if (workspaceFile) { - workspace.projects = { - ...workspace.projects, - ...this.readFromWorkspaceJson().projects, - }; + workspace.projects = this.mergeWorkspaceJsonAndGlobProjects( + this.readFromWorkspaceJson().projects, + workspace.projects + ); } assertValidWorkspaceConfiguration(nxJson); @@ -100,6 +100,24 @@ export class Workspaces { return this.cachedWorkspaceConfig; } + private mergeWorkspaceJsonAndGlobProjects( + workspaceJsonProjects: { [name: string]: any }, + globProjects: { [name: string]: any } + ) { + const res = workspaceJsonProjects; + const folders = new Set(); + for (let k of Object.keys(res)) { + folders.add(res[k].root); + } + + for (let k of Object.keys(globProjects)) { + if (!folders.has(globProjects[k].root)) { + res[k] = globProjects[k]; + } + } + return res; + } + private mergeTargetDefaultsIntoProjectDescriptions( config: ProjectsConfigurations, nxJson: NxJsonConfiguration