From 9a556f45b8af7660ebd2ce1b54dcc49bb4d4017c Mon Sep 17 00:00:00 2001 From: Craigory Coppola Date: Fri, 26 Jul 2024 13:48:50 -0400 Subject: [PATCH] feat(core): add --exclude-task-dependencies flag (#27137) ## Current Behavior There is no option to exclude dependent tasks when running Nx. ## Expected Behavior There is a flag, `--exclude-task-dependencies`, to exclude task deps from running. This is inline with other tools: - [dotnet cli](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-build#:~:text=%2D%2Dno%2D-,dependencies,-Ignores%20project%2Dto) ## Related Issue(s) Fixes #18053 --- docs/generated/cli/affected.md | 8 +++++ docs/generated/cli/release.md | 8 +++++ docs/generated/cli/run-many.md | 8 +++++ docs/generated/cli/run.md | 8 +++++ .../packages/nx/documents/affected.md | 8 +++++ .../packages/nx/documents/release.md | 8 +++++ .../packages/nx/documents/run-many.md | 8 +++++ docs/generated/packages/nx/documents/run.md | 8 +++++ e2e/nx/src/run.test.ts | 34 +++++++++++++++++++ .../nx/src/command-line/affected/affected.ts | 2 +- .../nx/src/command-line/release/publish.ts | 4 ++- .../nx/src/command-line/run-many/run-many.ts | 2 +- packages/nx/src/command-line/run/run-one.ts | 2 +- .../yargs-utils/shared-options.ts | 6 ++++ .../commands-runner/create-command-graph.ts | 6 ++-- packages/nx/src/utils/command-line-utils.ts | 1 + 16 files changed, 115 insertions(+), 6 deletions(-) diff --git a/docs/generated/cli/affected.md b/docs/generated/cli/affected.md index 2847b063d2..4b07c4290e 100644 --- a/docs/generated/cli/affected.md +++ b/docs/generated/cli/affected.md @@ -117,6 +117,14 @@ Type: `string` Exclude certain projects from being processed +### excludeTaskDependencies + +Type: `boolean` + +Default: `false` + +Skips running dependent tasks first + ### files Type: `string` diff --git a/docs/generated/cli/release.md b/docs/generated/cli/release.md index 71f0569719..d034dc0a2e 100644 --- a/docs/generated/cli/release.md +++ b/docs/generated/cli/release.md @@ -309,6 +309,14 @@ Type: `string` Exclude certain projects from being processed +##### excludeTaskDependencies + +Type: `boolean` + +Default: `false` + +Skips running dependent tasks first + ##### first-release Type: `boolean` diff --git a/docs/generated/cli/run-many.md b/docs/generated/cli/run-many.md index 3b6d94cbc4..ef6d5cdbea 100644 --- a/docs/generated/cli/run-many.md +++ b/docs/generated/cli/run-many.md @@ -119,6 +119,14 @@ Type: `string` Exclude certain projects from being processed +### excludeTaskDependencies + +Type: `boolean` + +Default: `false` + +Skips running dependent tasks first + ### graph Type: `string` diff --git a/docs/generated/cli/run.md b/docs/generated/cli/run.md index 59b12f9581..1685ab868d 100644 --- a/docs/generated/cli/run.md +++ b/docs/generated/cli/run.md @@ -87,6 +87,14 @@ Type: `string` Exclude certain projects from being processed +### excludeTaskDependencies + +Type: `boolean` + +Default: `false` + +Skips running dependent tasks first + ### graph Type: `string` diff --git a/docs/generated/packages/nx/documents/affected.md b/docs/generated/packages/nx/documents/affected.md index 2847b063d2..4b07c4290e 100644 --- a/docs/generated/packages/nx/documents/affected.md +++ b/docs/generated/packages/nx/documents/affected.md @@ -117,6 +117,14 @@ Type: `string` Exclude certain projects from being processed +### excludeTaskDependencies + +Type: `boolean` + +Default: `false` + +Skips running dependent tasks first + ### files Type: `string` diff --git a/docs/generated/packages/nx/documents/release.md b/docs/generated/packages/nx/documents/release.md index 71f0569719..d034dc0a2e 100644 --- a/docs/generated/packages/nx/documents/release.md +++ b/docs/generated/packages/nx/documents/release.md @@ -309,6 +309,14 @@ Type: `string` Exclude certain projects from being processed +##### excludeTaskDependencies + +Type: `boolean` + +Default: `false` + +Skips running dependent tasks first + ##### first-release Type: `boolean` diff --git a/docs/generated/packages/nx/documents/run-many.md b/docs/generated/packages/nx/documents/run-many.md index 3b6d94cbc4..ef6d5cdbea 100644 --- a/docs/generated/packages/nx/documents/run-many.md +++ b/docs/generated/packages/nx/documents/run-many.md @@ -119,6 +119,14 @@ Type: `string` Exclude certain projects from being processed +### excludeTaskDependencies + +Type: `boolean` + +Default: `false` + +Skips running dependent tasks first + ### graph Type: `string` diff --git a/docs/generated/packages/nx/documents/run.md b/docs/generated/packages/nx/documents/run.md index 59b12f9581..1685ab868d 100644 --- a/docs/generated/packages/nx/documents/run.md +++ b/docs/generated/packages/nx/documents/run.md @@ -87,6 +87,14 @@ Type: `string` Exclude certain projects from being processed +### excludeTaskDependencies + +Type: `boolean` + +Default: `false` + +Skips running dependent tasks first + ### graph Type: `string` diff --git a/e2e/nx/src/run.test.ts b/e2e/nx/src/run.test.ts index 7d07f8c393..1b888fb3bc 100644 --- a/e2e/nx/src/run.test.ts +++ b/e2e/nx/src/run.test.ts @@ -254,6 +254,40 @@ describe('Nx Running Tests', () => { const output = runCLI(`echo ${mylib}`); expect(output).toContain('TWO'); }); + + it('should not run dependencies if --no-dependencies is passed', () => { + const mylib = uniq('mylib'); + runCLI(`generate @nx/js:lib ${mylib}`); + + updateJson(`libs/${mylib}/project.json`, (c) => { + c.targets['one'] = { + executor: 'nx:run-commands', + options: { + command: 'echo ONE', + }, + }; + c.targets['two'] = { + executor: 'nx:run-commands', + options: { + command: 'echo TWO', + }, + dependsOn: ['one'], + }; + c.targets['three'] = { + executor: 'nx:run-commands', + options: { + command: 'echo THREE', + }, + dependsOn: ['two'], + }; + return c; + }); + + const output = runCLI(`one ${mylib} --no-deps`); + expect(output).toContain('ONE'); + expect(output).not.toContain('TWO'); + expect(output).not.toContain('THREE'); + }); }); describe('Nx Bail', () => { diff --git a/packages/nx/src/command-line/affected/affected.ts b/packages/nx/src/command-line/affected/affected.ts index 24be3c9048..e97a6cb922 100644 --- a/packages/nx/src/command-line/affected/affected.ts +++ b/packages/nx/src/command-line/affected/affected.ts @@ -32,7 +32,7 @@ export async function affected( (TargetDependencyConfig | string)[] > = {}, extraOptions = { - excludeTaskDependencies: false, + excludeTaskDependencies: args.excludeTaskDependencies, loadDotEnvFiles: process.env.NX_LOAD_DOT_ENV_FILES !== 'false', } as { excludeTaskDependencies: boolean; diff --git a/packages/nx/src/command-line/release/publish.ts b/packages/nx/src/command-line/release/publish.ts index 364f487012..5320407dd2 100644 --- a/packages/nx/src/command-line/release/publish.ts +++ b/packages/nx/src/command-line/release/publish.ts @@ -79,7 +79,9 @@ export async function releasePublish( * for dependencies, because that could cause projects outset of the filtered set to be published. */ const shouldExcludeTaskDependencies = - _args.projects?.length > 0 || _args.groups?.length > 0; + _args.projects?.length > 0 || + _args.groups?.length > 0 || + args.excludeTaskDependencies; let overallExitStatus = 0; diff --git a/packages/nx/src/command-line/run-many/run-many.ts b/packages/nx/src/command-line/run-many/run-many.ts index 6b56e5aafc..2bd0e621e6 100644 --- a/packages/nx/src/command-line/run-many/run-many.ts +++ b/packages/nx/src/command-line/run-many/run-many.ts @@ -26,7 +26,7 @@ export async function runMany( (TargetDependencyConfig | string)[] > = {}, extraOptions = { - excludeTaskDependencies: false, + excludeTaskDependencies: args.excludeTaskDependencies, loadDotEnvFiles: process.env.NX_LOAD_DOT_ENV_FILES !== 'false', } as { excludeTaskDependencies: boolean; diff --git a/packages/nx/src/command-line/run/run-one.ts b/packages/nx/src/command-line/run/run-one.ts index 74797bdc08..c09d843b89 100644 --- a/packages/nx/src/command-line/run/run-one.ts +++ b/packages/nx/src/command-line/run/run-one.ts @@ -28,7 +28,7 @@ export async function runOne( (TargetDependencyConfig | string)[] > = {}, extraOptions = { - excludeTaskDependencies: false, + excludeTaskDependencies: args.excludeTaskDependencies, loadDotEnvFiles: process.env.NX_LOAD_DOT_ENV_FILES !== 'false', } as { excludeTaskDependencies: boolean; diff --git a/packages/nx/src/command-line/yargs-utils/shared-options.ts b/packages/nx/src/command-line/yargs-utils/shared-options.ts index 3196074425..7f92ec50fa 100644 --- a/packages/nx/src/command-line/yargs-utils/shared-options.ts +++ b/packages/nx/src/command-line/yargs-utils/shared-options.ts @@ -27,6 +27,7 @@ export interface RunOptions { dte: boolean; batch: boolean; useAgents: boolean; + excludeTaskDependencies: boolean; } export function withRunOptions(yargs: Argv): Argv { @@ -79,6 +80,11 @@ export function withRunOptions(yargs: Argv): Argv { type: 'boolean', default: false, }) + .options('excludeTaskDependencies', { + describe: 'Skips running dependent tasks first', + type: 'boolean', + default: false, + }) .options('cloud', { type: 'boolean', hidden: true, diff --git a/packages/nx/src/commands-runner/create-command-graph.ts b/packages/nx/src/commands-runner/create-command-graph.ts index e46f893438..25f2c63fa4 100644 --- a/packages/nx/src/commands-runner/create-command-graph.ts +++ b/packages/nx/src/commands-runner/create-command-graph.ts @@ -50,8 +50,10 @@ export function createCommandGraph( nxArgs: NxArgs ): CommandGraph { const dependencies: Record = {}; - for (const projectName of projectNames) { - recursiveResolveDeps(projectGraph, projectName, dependencies); + if (!nxArgs.excludeTaskDependencies) { + for (const projectName of projectNames) { + recursiveResolveDeps(projectGraph, projectName, dependencies); + } } const roots = Object.keys(dependencies).filter( (d) => dependencies[d].length === 0 diff --git a/packages/nx/src/utils/command-line-utils.ts b/packages/nx/src/utils/command-line-utils.ts index 11928b3129..31ef722f2d 100644 --- a/packages/nx/src/utils/command-line-utils.ts +++ b/packages/nx/src/utils/command-line-utils.ts @@ -36,6 +36,7 @@ export interface NxArgs { nxIgnoreCycles?: boolean; type?: string; batch?: boolean; + excludeTaskDependencies?: boolean; } export function createOverrides(__overrides_unparsed__: string[] = []) {