From a308e1dc6b90cf45515cbd4e626308ce36c63f97 Mon Sep 17 00:00:00 2001 From: Craigory Coppola Date: Fri, 31 May 2024 18:05:26 -0400 Subject: [PATCH] fix(core): prevent graph output from being truncated (#23446) ## Current Behavior --graph stdout and --file stdout aren't documented. When printing graph to stdout, its possible for some output to get missed. ## Expected Behavior Existing flags are documented, and `--print` is more discoverable. We await stdout finishing before exiting the program. ## Related Issue(s) Fixes #18689 --- docs/generated/cli/affected.md | 22 ++- docs/generated/cli/graph.md | 14 +- docs/generated/cli/release.md | 2 +- docs/generated/cli/run-many.md | 20 ++- docs/generated/cli/run.md | 143 ++++++++++++++++-- docs/generated/cli/show.md | 8 +- .../packages/nx/documents/affected.md | 22 ++- .../packages/nx/documents/dep-graph.md | 14 +- .../packages/nx/documents/release.md | 2 +- .../packages/nx/documents/run-many.md | 20 ++- docs/generated/packages/nx/documents/run.md | 143 ++++++++++++++++-- docs/generated/packages/nx/documents/show.md | 8 +- docs/shared/cli/run.md | 44 ------ .../deprecated/command-objects.ts | 4 +- packages/nx/src/command-line/examples.ts | 80 +++++++++- .../src/command-line/graph/command-object.ts | 75 ++++++++- packages/nx/src/command-line/graph/graph.ts | 3 +- packages/nx/src/command-line/nx-commands.ts | 4 +- .../yargs-utils/shared-options.ts | 56 +------ .../generators/generate-cli-data.ts | 5 +- 20 files changed, 532 insertions(+), 157 deletions(-) delete mode 100644 docs/shared/cli/run.md diff --git a/docs/generated/cli/affected.md b/docs/generated/cli/affected.md index fe90d4ffaf321..2847b063d2d68 100644 --- a/docs/generated/cli/affected.md +++ b/docs/generated/cli/affected.md @@ -59,12 +59,30 @@ Run build for only projects with the tag `dotnet`: nx affected -t=build --exclude='*,!tag:dotnet' ``` -Use the currently executing project name in your command.: +Use the currently executing project name in your command: ```shell nx affected -t build --tag=$NX_TASK_TARGET_PROJECT:latest ``` +Preview the task graph that Nx would run inside a webview: + +```shell + nx affected -t=build --graph +``` + +Save the task graph to a file: + +```shell + nx affected -t=build --graph=output.json +``` + +Print the task graph to the console: + +```shell + nx affected -t=build --graph=stdout +``` + ## Options ### ~~all~~ @@ -109,7 +127,7 @@ Change the way Nx is calculating the affected command by providing directly chan Type: `string` -Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. +Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal. ### head diff --git a/docs/generated/cli/graph.md b/docs/generated/cli/graph.md index 99d1723d7c8cd..32a53e42933a9 100644 --- a/docs/generated/cli/graph.md +++ b/docs/generated/cli/graph.md @@ -35,6 +35,12 @@ Generate a static website with project graph into an html file, accompanied by a nx graph --file=output.html ``` +Print the project graph as JSON to the console: + +```shell + nx graph --print +``` + Show the graph where every node is either an ancestor or a descendant of todos-feature-main: ```shell @@ -89,7 +95,7 @@ Exclude certain projects from being processed Type: `string` -Output file (e.g. --file=output.json or --file=dep-graph.html) +Output file (e.g. --file=output.json or --file=dep-graph.html). ### files @@ -141,6 +147,12 @@ Type: `number` Bind the project graph server to a specific port. +### print + +Type: `boolean` + +Print the project graph to stdout in the terminal. + ### targets Type: `string` diff --git a/docs/generated/cli/release.md b/docs/generated/cli/release.md index c77e5712ea6e9..ae7a7ccf07f0f 100644 --- a/docs/generated/cli/release.md +++ b/docs/generated/cli/release.md @@ -301,7 +301,7 @@ Exclude certain projects from being processed Type: `string` -Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. +Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal. ##### help diff --git a/docs/generated/cli/run-many.md b/docs/generated/cli/run-many.md index 8f76df7b70e3a..3b6d94cbc4188 100644 --- a/docs/generated/cli/run-many.md +++ b/docs/generated/cli/run-many.md @@ -71,6 +71,24 @@ Run lint, test, and build targets for all projects. Requires Nx v15.4+: nx run-many --targets=lint,test,build ``` +Preview the task graph that Nx would run inside a webview: + +```shell + nx run-many -t=build --graph +``` + +Save the task graph to a file: + +```shell + nx run-many -t=build --graph=output.json +``` + +Print the task graph to the console: + +```shell + nx run-many -t=build --graph=stdout +``` + ## Options ### all @@ -105,7 +123,7 @@ Exclude certain projects from being processed Type: `string` -Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. +Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal. ### help diff --git a/docs/generated/cli/run.md b/docs/generated/cli/run.md index 82c9688f27f4b..59b12f9581b8f 100644 --- a/docs/generated/cli/run.md +++ b/docs/generated/cli/run.md @@ -1,44 +1,163 @@ --- title: 'run - CLI command' -description: 'Runs a target defined for your project. Target definitions can be found in the `scripts` property of the project `package.json`, or in the `targets` property of the project `project.json` file.' +description: 'Run a target for a project + (e.g., nx run myapp:serve:production). + + You can also use the infix notation to run a target: + (e.g., nx serve myapp --configuration=production) + + You can skip the use of Nx cache by using the --skip-nx-cache option.' --- # run -Runs a target defined for your project. Target definitions can be found in the `scripts` property of the project `package.json`, or in the `targets` property of the project `project.json` file. +Run a target for a project +(e.g., nx run myapp:serve:production). + + You can also use the infix notation to run a target: + (e.g., nx serve myapp --configuration=production) + + You can skip the use of Nx cache by using the --skip-nx-cache option. ## Usage ```shell -nx run [options] +nx run [project][:target][:configuration] [_..] ``` -Install `nx` globally to invoke the command directly using `nx`, or use `npx nx`, `yarn nx`, or `pnpx nx`. +Install `nx` globally to invoke the command directly using `nx`, or use `npx nx`, `yarn nx`, or `pnpm nx`. ### Examples -Run the `build` target for the `myapp` : +Run the target build for the myapp project: + +```shell + nx run myapp:build +``` + +Run the target build for the myapp project, with production configuration: + +```shell + nx run myapp:build:production +``` + +Preview the task graph that Nx would run inside a webview: + +```shell + nx run myapp:build --graph +``` + +Save the task graph to a file: + +```shell + nx run myapp:build --graph=output.json +``` + +Print the task graph to the console: ```shell -nx run myapp:build + nx run myapp:build --graph=stdout ``` -Run the `build` target for the `myapp` project with a `production` configuration: +Run's a target named build:test for the myapp project. Note the quotes around the target name to prevent "test" from being considered a configuration: ```shell -nx run myapp:build:production + nx run myapp:"build:test" ``` ## Options -### configuration (-c) +### batch + +Type: `boolean` + +Default: `false` + +Run task(s) in batches for executors which support batches + +### configuration + +Type: `string` + +This is the configuration to use when performing tasks on projects + +### exclude + +Type: `string` + +Exclude certain projects from being processed + +### graph -A named builder configuration, defined in the "configurations" section of the workspace configuration file. The builder uses the named configuration to run the given target. +Type: `string` -### help +Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal. -Show help +### nxBail + +Type: `boolean` + +Default: `false` + +Stop command execution after the first failed task + +### nxIgnoreCycles + +Type: `boolean` + +Default: `false` + +Ignore cycles in the task graph + +### output-style + +Type: `string` + +Choices: [dynamic, static, stream, stream-without-prefixes, compact] + +Defines how Nx emits outputs tasks logs + +| option | description | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| dynamic | use dynamic output life cycle, previous content is overwritten or modified as new outputs are added, display minimal logs by default, always show errors. This output format is recommended on your local development environments. | +| static | uses static output life cycle, no previous content is rewritten or modified as new outputs are added. This output format is recommened for CI environments. | +| stream | nx by default logs output to an internal output stream, enable this option to stream logs to stdout / stderr | +| stream-without-prefixes | nx prefixes the project name the target is running on, use this option remove the project name prefix from output | + +### parallel + +Type: `string` + +Max number of parallel processes [default is 3] + +### project + +Type: `string` + +Target project + +### runner + +Type: `string` + +This is the name of the tasks runner configured in nx.json + +### skipNxCache + +Type: `boolean` + +Default: `false` + +Rerun the tasks even when the results are available in the cache + +### verbose + +Type: `boolean` + +Prints additional information about the commands (e.g., stack traces) ### version +Type: `boolean` + Show version number diff --git a/docs/generated/cli/show.md b/docs/generated/cli/show.md index 63571e855373d..a959973d33067 100644 --- a/docs/generated/cli/show.md +++ b/docs/generated/cli/show.md @@ -23,7 +23,7 @@ Show all projects in the workspace: nx show projects ``` -Show all projects with names starting with "api-". The "projects" option is useful to see which projects would be selected by run-many.: +Show all projects with names starting with "api-". The "projects" option is useful to see which projects would be selected by run-many: ```shell nx show projects --projects api-* @@ -53,19 +53,19 @@ Show affected projects in the workspace, excluding end-to-end projects: nx show projects --affected --exclude=*-e2e ``` -If in an interactive terminal, opens the project detail view. If not in an interactive terminal, defaults to JSON.: +If in an interactive terminal, opens the project detail view. If not in an interactive terminal, defaults to JSON: ```shell nx show project my-app ``` -Show detailed information about "my-app" in a json format.: +Show detailed information about "my-app" in a json format: ```shell nx show project my-app --json ``` -Show information about "my-app" in a human readable format.: +Show information about "my-app" in a human readable format: ```shell nx show project my-app --json false diff --git a/docs/generated/packages/nx/documents/affected.md b/docs/generated/packages/nx/documents/affected.md index fe90d4ffaf321..2847b063d2d68 100644 --- a/docs/generated/packages/nx/documents/affected.md +++ b/docs/generated/packages/nx/documents/affected.md @@ -59,12 +59,30 @@ Run build for only projects with the tag `dotnet`: nx affected -t=build --exclude='*,!tag:dotnet' ``` -Use the currently executing project name in your command.: +Use the currently executing project name in your command: ```shell nx affected -t build --tag=$NX_TASK_TARGET_PROJECT:latest ``` +Preview the task graph that Nx would run inside a webview: + +```shell + nx affected -t=build --graph +``` + +Save the task graph to a file: + +```shell + nx affected -t=build --graph=output.json +``` + +Print the task graph to the console: + +```shell + nx affected -t=build --graph=stdout +``` + ## Options ### ~~all~~ @@ -109,7 +127,7 @@ Change the way Nx is calculating the affected command by providing directly chan Type: `string` -Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. +Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal. ### head diff --git a/docs/generated/packages/nx/documents/dep-graph.md b/docs/generated/packages/nx/documents/dep-graph.md index 99d1723d7c8cd..32a53e42933a9 100644 --- a/docs/generated/packages/nx/documents/dep-graph.md +++ b/docs/generated/packages/nx/documents/dep-graph.md @@ -35,6 +35,12 @@ Generate a static website with project graph into an html file, accompanied by a nx graph --file=output.html ``` +Print the project graph as JSON to the console: + +```shell + nx graph --print +``` + Show the graph where every node is either an ancestor or a descendant of todos-feature-main: ```shell @@ -89,7 +95,7 @@ Exclude certain projects from being processed Type: `string` -Output file (e.g. --file=output.json or --file=dep-graph.html) +Output file (e.g. --file=output.json or --file=dep-graph.html). ### files @@ -141,6 +147,12 @@ Type: `number` Bind the project graph server to a specific port. +### print + +Type: `boolean` + +Print the project graph to stdout in the terminal. + ### targets Type: `string` diff --git a/docs/generated/packages/nx/documents/release.md b/docs/generated/packages/nx/documents/release.md index c77e5712ea6e9..ae7a7ccf07f0f 100644 --- a/docs/generated/packages/nx/documents/release.md +++ b/docs/generated/packages/nx/documents/release.md @@ -301,7 +301,7 @@ Exclude certain projects from being processed Type: `string` -Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. +Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal. ##### help diff --git a/docs/generated/packages/nx/documents/run-many.md b/docs/generated/packages/nx/documents/run-many.md index 8f76df7b70e3a..3b6d94cbc4188 100644 --- a/docs/generated/packages/nx/documents/run-many.md +++ b/docs/generated/packages/nx/documents/run-many.md @@ -71,6 +71,24 @@ Run lint, test, and build targets for all projects. Requires Nx v15.4+: nx run-many --targets=lint,test,build ``` +Preview the task graph that Nx would run inside a webview: + +```shell + nx run-many -t=build --graph +``` + +Save the task graph to a file: + +```shell + nx run-many -t=build --graph=output.json +``` + +Print the task graph to the console: + +```shell + nx run-many -t=build --graph=stdout +``` + ## Options ### all @@ -105,7 +123,7 @@ Exclude certain projects from being processed Type: `string` -Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. +Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal. ### help diff --git a/docs/generated/packages/nx/documents/run.md b/docs/generated/packages/nx/documents/run.md index 82c9688f27f4b..59b12f9581b8f 100644 --- a/docs/generated/packages/nx/documents/run.md +++ b/docs/generated/packages/nx/documents/run.md @@ -1,44 +1,163 @@ --- title: 'run - CLI command' -description: 'Runs a target defined for your project. Target definitions can be found in the `scripts` property of the project `package.json`, or in the `targets` property of the project `project.json` file.' +description: 'Run a target for a project + (e.g., nx run myapp:serve:production). + + You can also use the infix notation to run a target: + (e.g., nx serve myapp --configuration=production) + + You can skip the use of Nx cache by using the --skip-nx-cache option.' --- # run -Runs a target defined for your project. Target definitions can be found in the `scripts` property of the project `package.json`, or in the `targets` property of the project `project.json` file. +Run a target for a project +(e.g., nx run myapp:serve:production). + + You can also use the infix notation to run a target: + (e.g., nx serve myapp --configuration=production) + + You can skip the use of Nx cache by using the --skip-nx-cache option. ## Usage ```shell -nx run [options] +nx run [project][:target][:configuration] [_..] ``` -Install `nx` globally to invoke the command directly using `nx`, or use `npx nx`, `yarn nx`, or `pnpx nx`. +Install `nx` globally to invoke the command directly using `nx`, or use `npx nx`, `yarn nx`, or `pnpm nx`. ### Examples -Run the `build` target for the `myapp` : +Run the target build for the myapp project: + +```shell + nx run myapp:build +``` + +Run the target build for the myapp project, with production configuration: + +```shell + nx run myapp:build:production +``` + +Preview the task graph that Nx would run inside a webview: + +```shell + nx run myapp:build --graph +``` + +Save the task graph to a file: + +```shell + nx run myapp:build --graph=output.json +``` + +Print the task graph to the console: ```shell -nx run myapp:build + nx run myapp:build --graph=stdout ``` -Run the `build` target for the `myapp` project with a `production` configuration: +Run's a target named build:test for the myapp project. Note the quotes around the target name to prevent "test" from being considered a configuration: ```shell -nx run myapp:build:production + nx run myapp:"build:test" ``` ## Options -### configuration (-c) +### batch + +Type: `boolean` + +Default: `false` + +Run task(s) in batches for executors which support batches + +### configuration + +Type: `string` + +This is the configuration to use when performing tasks on projects + +### exclude + +Type: `string` + +Exclude certain projects from being processed + +### graph -A named builder configuration, defined in the "configurations" section of the workspace configuration file. The builder uses the named configuration to run the given target. +Type: `string` -### help +Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal. -Show help +### nxBail + +Type: `boolean` + +Default: `false` + +Stop command execution after the first failed task + +### nxIgnoreCycles + +Type: `boolean` + +Default: `false` + +Ignore cycles in the task graph + +### output-style + +Type: `string` + +Choices: [dynamic, static, stream, stream-without-prefixes, compact] + +Defines how Nx emits outputs tasks logs + +| option | description | +| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| dynamic | use dynamic output life cycle, previous content is overwritten or modified as new outputs are added, display minimal logs by default, always show errors. This output format is recommended on your local development environments. | +| static | uses static output life cycle, no previous content is rewritten or modified as new outputs are added. This output format is recommened for CI environments. | +| stream | nx by default logs output to an internal output stream, enable this option to stream logs to stdout / stderr | +| stream-without-prefixes | nx prefixes the project name the target is running on, use this option remove the project name prefix from output | + +### parallel + +Type: `string` + +Max number of parallel processes [default is 3] + +### project + +Type: `string` + +Target project + +### runner + +Type: `string` + +This is the name of the tasks runner configured in nx.json + +### skipNxCache + +Type: `boolean` + +Default: `false` + +Rerun the tasks even when the results are available in the cache + +### verbose + +Type: `boolean` + +Prints additional information about the commands (e.g., stack traces) ### version +Type: `boolean` + Show version number diff --git a/docs/generated/packages/nx/documents/show.md b/docs/generated/packages/nx/documents/show.md index 63571e855373d..a959973d33067 100644 --- a/docs/generated/packages/nx/documents/show.md +++ b/docs/generated/packages/nx/documents/show.md @@ -23,7 +23,7 @@ Show all projects in the workspace: nx show projects ``` -Show all projects with names starting with "api-". The "projects" option is useful to see which projects would be selected by run-many.: +Show all projects with names starting with "api-". The "projects" option is useful to see which projects would be selected by run-many: ```shell nx show projects --projects api-* @@ -53,19 +53,19 @@ Show affected projects in the workspace, excluding end-to-end projects: nx show projects --affected --exclude=*-e2e ``` -If in an interactive terminal, opens the project detail view. If not in an interactive terminal, defaults to JSON.: +If in an interactive terminal, opens the project detail view. If not in an interactive terminal, defaults to JSON: ```shell nx show project my-app ``` -Show detailed information about "my-app" in a json format.: +Show detailed information about "my-app" in a json format: ```shell nx show project my-app --json ``` -Show information about "my-app" in a human readable format.: +Show information about "my-app" in a human readable format: ```shell nx show project my-app --json false diff --git a/docs/shared/cli/run.md b/docs/shared/cli/run.md deleted file mode 100644 index 82c9688f27f4b..0000000000000 --- a/docs/shared/cli/run.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: 'run - CLI command' -description: 'Runs a target defined for your project. Target definitions can be found in the `scripts` property of the project `package.json`, or in the `targets` property of the project `project.json` file.' ---- - -# run - -Runs a target defined for your project. Target definitions can be found in the `scripts` property of the project `package.json`, or in the `targets` property of the project `project.json` file. - -## Usage - -```shell -nx run [options] -``` - -Install `nx` globally to invoke the command directly using `nx`, or use `npx nx`, `yarn nx`, or `pnpx nx`. - -### Examples - -Run the `build` target for the `myapp` : - -```shell -nx run myapp:build -``` - -Run the `build` target for the `myapp` project with a `production` configuration: - -```shell -nx run myapp:build:production -``` - -## Options - -### configuration (-c) - -A named builder configuration, defined in the "configurations" section of the workspace configuration file. The builder uses the named configuration to run the given target. - -### help - -Show help - -### version - -Show version number diff --git a/packages/nx/src/command-line/deprecated/command-objects.ts b/packages/nx/src/command-line/deprecated/command-objects.ts index 072ff834ca737..ec19de708ac42 100644 --- a/packages/nx/src/command-line/deprecated/command-objects.ts +++ b/packages/nx/src/command-line/deprecated/command-objects.ts @@ -2,9 +2,9 @@ import { CommandModule } from 'yargs'; import { handleErrors } from '../../utils/params'; import { withAffectedOptions, - withDepGraphOptions, withTargetAndConfigurationOption, } from '../yargs-utils/shared-options'; +import { withGraphOptions } from '../graph/command-object'; const affectedGraphDeprecationMessage = 'Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command has been removed in Nx 19.'; @@ -18,7 +18,7 @@ export const yargsAffectedGraphCommand: CommandModule = { command: 'affected:graph', describe: false, aliases: ['affected:dep-graph'], - builder: (yargs) => withAffectedOptions(withDepGraphOptions(yargs)), + builder: (yargs) => withAffectedOptions(withGraphOptions(yargs)), handler: (args) => handleErrors(false, () => { throw new Error(affectedGraphDeprecationMessage); diff --git a/packages/nx/src/command-line/examples.ts b/packages/nx/src/command-line/examples.ts index deccf9363eb67..1d6cdeee0e5b4 100644 --- a/packages/nx/src/command-line/examples.ts +++ b/packages/nx/src/command-line/examples.ts @@ -39,7 +39,22 @@ export const examples: Record = { }, { command: 'affected -t build --tag=$NX_TASK_TARGET_PROJECT:latest', - description: 'Use the currently executing project name in your command.', + description: 'Use the currently executing project name in your command', + }, + + { + command: 'affected -t=build --graph', + description: 'Preview the task graph that Nx would run inside a webview', + }, + + { + command: 'affected -t=build --graph=output.json', + description: 'Save the task graph to a file', + }, + + { + command: 'affected -t=build --graph=stdout', + description: 'Print the task graph to the console', }, ], 'affected:test': [ @@ -142,6 +157,12 @@ export const examples: Record = { description: 'Generate a static website with project graph into an html file, accompanied by an asset folder called static', }, + + { + command: 'graph --print', + description: 'Print the project graph as JSON to the console', + }, + { command: 'graph --focus=todos-feature-main', description: @@ -217,6 +238,54 @@ export const examples: Record = { description: 'Run lint, test, and build targets for all projects. Requires Nx v15.4+', }, + + { + command: 'run-many -t=build --graph', + description: 'Preview the task graph that Nx would run inside a webview', + }, + + { + command: 'run-many -t=build --graph=output.json', + description: 'Save the task graph to a file', + }, + + { + command: 'run-many -t=build --graph=stdout', + description: 'Print the task graph to the console', + }, + ], + run: [ + { + command: 'run myapp:build', + description: 'Run the target build for the myapp project', + }, + + { + command: 'run myapp:build:production', + description: + 'Run the target build for the myapp project, with production configuration', + }, + + { + command: 'run myapp:build --graph', + description: 'Preview the task graph that Nx would run inside a webview', + }, + + { + command: 'run myapp:build --graph=output.json', + description: 'Save the task graph to a file', + }, + + { + command: 'run myapp:build --graph=stdout', + description: 'Print the task graph to the console', + }, + + { + command: 'run myapp:"build:test"', + description: + 'Run\'s a target named build:test for the myapp project. Note the quotes around the target name to prevent "test" from being considered a configuration', + }, ], migrate: [ { @@ -276,7 +345,7 @@ export const examples: Record = { { command: 'show projects --projects api-*', description: - 'Show all projects with names starting with "api-". The "projects" option is useful to see which projects would be selected by run-many.', + 'Show all projects with names starting with "api-". The "projects" option is useful to see which projects would be selected by run-many', }, { @@ -303,18 +372,17 @@ export const examples: Record = { { command: 'show project my-app', description: - 'If in an interactive terminal, opens the project detail view. If not in an interactive terminal, defaults to JSON.', + 'If in an interactive terminal, opens the project detail view. If not in an interactive terminal, defaults to JSON', }, { command: 'show project my-app --json', - description: 'Show detailed information about "my-app" in a json format.', + description: 'Show detailed information about "my-app" in a json format', }, { command: 'show project my-app --json false', - description: - 'Show information about "my-app" in a human readable format.', + description: 'Show information about "my-app" in a human readable format', }, { diff --git a/packages/nx/src/command-line/graph/command-object.ts b/packages/nx/src/command-line/graph/command-object.ts index d63e80b3dd7da..654e3601d7802 100644 --- a/packages/nx/src/command-line/graph/command-object.ts +++ b/packages/nx/src/command-line/graph/command-object.ts @@ -1,18 +1,18 @@ -import { CommandModule } from 'yargs'; +import { Argv, CommandModule } from 'yargs'; import { linkToNxDevAndExamples } from '../yargs-utils/documentation'; import { + parseCSV, withAffectedOptions, - withDepGraphOptions, withVerbose, } from '../yargs-utils/shared-options'; -export const yargsDepGraphCommand: CommandModule = { +export const yargsGraphCommand: CommandModule = { command: 'graph', describe: 'Graph dependencies within workspace', aliases: ['dep-graph'], builder: (yargs) => linkToNxDevAndExamples( - withVerbose(withAffectedOptions(withDepGraphOptions(yargs))), + withVerbose(withAffectedOptions(withGraphOptions(yargs))), 'dep-graph' ) .option('affected', { @@ -27,3 +27,70 @@ export const yargsDepGraphCommand: CommandModule = { handler: async (args) => await (await import('./graph')).generateGraph(args as any, []), }; + +export function withGraphOptions(yargs: Argv) { + return yargs + .option('file', { + describe: + 'Output file (e.g. --file=output.json or --file=dep-graph.html).', + type: 'string', + }) + + .option('print', { + describe: 'Print the project graph to stdout in the terminal.', + type: 'boolean', + }) + + .option('view', { + describe: 'Choose whether to view the projects or task graph', + type: 'string', + default: 'projects', + choices: ['projects', 'tasks'], + }) + + .option('targets', { + describe: 'The target to show tasks for in the task graph', + type: 'string', + coerce: parseCSV, + }) + + .option('focus', { + describe: + 'Use to show the project graph for a particular project and every node that is either an ancestor or a descendant.', + type: 'string', + }) + + .option('exclude', { + describe: + 'List of projects delimited by commas to exclude from the project graph.', + type: 'string', + coerce: parseCSV, + }) + + .option('groupByFolder', { + describe: 'Group projects by folder in the project graph', + type: 'boolean', + }) + + .option('host', { + describe: 'Bind the project graph server to a specific ip address.', + type: 'string', + }) + + .option('port', { + describe: 'Bind the project graph server to a specific port.', + type: 'number', + }) + + .option('watch', { + describe: 'Watch for changes to project graph and update in-browser', + type: 'boolean', + default: true, + }) + + .option('open', { + describe: 'Open the project graph in the browser.', + type: 'boolean', + default: true, + }); +} diff --git a/packages/nx/src/command-line/graph/graph.ts b/packages/nx/src/command-line/graph/graph.ts index 94643d1ee526c..55ecb5e4af357 100644 --- a/packages/nx/src/command-line/graph/graph.ts +++ b/packages/nx/src/command-line/graph/graph.ts @@ -349,7 +349,7 @@ export async function generateGraph( splitArgsIntoNxArgsAndOverrides( args, 'affected', - { printWarnings: true }, + { printWarnings: args.file !== 'stdout' }, readNxJson() ).nxArgs, rawGraph @@ -401,6 +401,7 @@ export async function generateGraph( 2 ) ); + await output.drain(); process.exit(0); } diff --git a/packages/nx/src/command-line/nx-commands.ts b/packages/nx/src/command-line/nx-commands.ts index 7c0c66df2d251..6ba7000c61781 100644 --- a/packages/nx/src/command-line/nx-commands.ts +++ b/packages/nx/src/command-line/nx-commands.ts @@ -13,7 +13,7 @@ import { yargsViewLogsCommand, } from './connect/command-object'; import { yargsDaemonCommand } from './daemon/command-object'; -import { yargsDepGraphCommand } from './graph/command-object'; +import { yargsGraphCommand } from './graph/command-object'; import { yargsExecCommand } from './exec/command-object'; import { yargsFormatCheckCommand, @@ -68,7 +68,7 @@ export const commandsObject = yargs .command(yargsAffectedGraphCommand) .command(yargsConnectCommand) .command(yargsDaemonCommand) - .command(yargsDepGraphCommand) + .command(yargsGraphCommand) .command(yargsExecCommand) .command(yargsFormatCheckCommand) .command(yargsFormatWriteCommand) 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 12d554eb9667a..bc200ecd5802a 100644 --- a/packages/nx/src/command-line/yargs-utils/shared-options.ts +++ b/packages/nx/src/command-line/yargs-utils/shared-options.ts @@ -52,7 +52,7 @@ export function withRunOptions(yargs: Argv): Argv { .option('graph', { type: 'string', describe: - 'Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser.', + 'Show the task graph of the command. Pass a file path to save the graph data instead of viewing it in the browser. Pass "stdout" to print the results to the terminal.', coerce: (value) => // when the type of an opt is "string", passing `--opt` comes through as having an empty string value. // this coercion allows `--graph` to be passed through as a boolean directly, and also normalizes the @@ -273,60 +273,6 @@ export function withOutputStyleOption( }); } -export function withDepGraphOptions(yargs: Argv) { - return yargs - .option('file', { - describe: - 'Output file (e.g. --file=output.json or --file=dep-graph.html)', - type: 'string', - }) - .option('view', { - describe: 'Choose whether to view the projects or task graph', - type: 'string', - default: 'projects', - choices: ['projects', 'tasks'], - }) - .option('targets', { - describe: 'The target to show tasks for in the task graph', - type: 'string', - coerce: parseCSV, - }) - .option('focus', { - describe: - 'Use to show the project graph for a particular project and every node that is either an ancestor or a descendant.', - type: 'string', - }) - .option('exclude', { - describe: - 'List of projects delimited by commas to exclude from the project graph.', - type: 'string', - coerce: parseCSV, - }) - - .option('groupByFolder', { - describe: 'Group projects by folder in the project graph', - type: 'boolean', - }) - .option('host', { - describe: 'Bind the project graph server to a specific ip address.', - type: 'string', - }) - .option('port', { - describe: 'Bind the project graph server to a specific port.', - type: 'number', - }) - .option('watch', { - describe: 'Watch for changes to project graph and update in-browser', - type: 'boolean', - default: true, - }) - .option('open', { - describe: 'Open the project graph in the browser.', - type: 'boolean', - default: true, - }); -} - export function withRunOneOptions(yargs: Argv) { const executorShouldShowHelp = !( process.argv[2] === 'run' && process.argv[3] === '--help' diff --git a/scripts/documentation/generators/generate-cli-data.ts b/scripts/documentation/generators/generate-cli-data.ts index 7f498abe47814..f8f66cd854d20 100644 --- a/scripts/documentation/generators/generate-cli-data.ts +++ b/scripts/documentation/generators/generate-cli-data.ts @@ -17,7 +17,10 @@ import { const importFresh = require('import-fresh'); -const sharedCommands = ['generate', 'run', 'exec']; +// Docs for these commands are inside docs/shared/cli - they are not dynamically generated. +const sharedCommands = ['generate', 'exec']; + +// These commands are hidden from the documentation. const hiddenCommands = ['$0']; export async function generateCliDocumentation(