From 1aac2445417b4d179c9b6a287decc7491db0c1f0 Mon Sep 17 00:00:00 2001 From: Doug Parker <dgp1130@users.noreply.github.com> Date: Tue, 12 Nov 2019 11:36:52 -0800 Subject: [PATCH] docs(@angular/cli): Adds developer documentation. I wrote down my understanding of the best ways to build/run/test/debug this repository. A couple other random things included here: * Removed an extraneous `debugger;` statement which I kept hitting. * Removed the `watch` scripts which are no longer used and don't need to be supported. * Removed `yarn test-cli-e2e`, as it alters the $PATH and can use the wrong `ng` instance. --- README.md | 102 +++++++++++++++++- docs/images/run-configurations.png | Bin 0 -> 28019 bytes package.json | 2 - scripts/templates/readme.ejs | 102 +++++++++++++++++- .../extra-properties/factory.ts | 1 - 5 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 docs/images/run-configurations.png diff --git a/README.md b/README.md index c6b65b18b2..22eb60c2d9 100644 --- a/README.md +++ b/README.md @@ -44,16 +44,114 @@ analyze your code. # Getting Started - Local Development ## Installation + To get started locally, follow these instructions: 1. If you haven't done it already, [make a fork of this repo](https://github.com/angular/angular-cli/fork). 1. Clone to your local computer using `git`. 1. Make sure that you have Node 10.13 or later installed. See instructions [here](https://nodejs.org/en/download/). 1. Make sure that you have `yarn` installed; see instructions [here](https://yarnpkg.com/lang/en/docs/install/). -1. Run `yarn` (no arguments) from the root of your clone of this project. -1. Run `yarn link` to add all custom scripts we use to your global install. +1. Run `yarn` (no arguments) from the root of your clone of this project to install dependencies. + +## Building and Installing the CLI + +To make a local build: + +```shell +yarn build --local +``` + +This generates a number of tarballs in the `dist/` directory. To actually use +the locally built tools, switch to another repository reproducing the specific +issue you want to fix (or just generate a local repo with `ng new`). Then +install the locally built packages: + +```shell +cd "${EXAMPLE_ANGULAR_PROJECT_REPO}" +npm install -D ${CLI_REPO}/dist/*.tgz +``` + +Builds of this example project will use tooling created from the previous local +build and include any local changes. When using the CLI, it will automatically +check for a local install and use that if present. This means you can just run: + +```shell +npm install -g @angular/cli +``` + +to get a global install of the latest CLI release. Then running any `ng` command +in the example project will automatically find and use the local build of the +CLI. + +Note: If you are testing `ng update`, be aware that installing all the tarballs +will also update the framework (`@angular/core`) to the latest version. In this +case, simply install the CLI alone with +`npm install -D ${CLI_REPO}/dist/_angular_cli.tgz`, that way the rest of the +project remains to be upgraded with `ng update`. + +## Debugging + +To debug an invocation of the CLI, [build and install the CLI for an example +project](#building-and-installing-the-cli), then run the desired `ng` command +as: + +```shell +node --inspect-brk node_modules/.bin/ng ... +``` + +This will trigger a breakpoint as the CLI starts up. You can connect to this +using the supported mechanisms for your IDE, but the simplest option is to open +Chrome to [chrome://inspect](chrome://inspect) and then click on the `inspect` +link for the `node_modules/.bin/ng` Node target. + +Unfortunately, the CLI dynamically `require()`'s other files mid-execution, so +the debugger is not aware of all the source code files before hand. As a result, +it is tough to put breakpoints on files before the CLI loads them. The easiest +workaround is to use the `debugger;` statement to stop execution in the file you +are interested in, and then you should be able to step around and set breakpoints +as expected. + +## Testing + +There are three different test suites which can be run locally: + +* Unit tests + * Run: `yarn test --full` + * Debug: `yarn debug:test --full` +* Large tests + * Run: `yarn test-large --full` + * Debug: `yarn debug:test-large --full` +* End to end tests + * Run: `node tests/legacy-cli/run_e2e.js` + * Run subset of tests: `node tests/legacy-cli/run_e2e.js tests/legacy-cli/e2e/tests/i18n/ivy-localize-*` + +When running the debug commands, Node will stop and wait for a debugger to +attach. You can attach your IDE to the debugger to stop on breakpoints and step through the code. Also see [IDE Specific Usage](#ide-specific-usage) for a +simpler debug story. + +When debugging a specific test, change `describe()` or `it()` to `fdescribe()` +and `fit()` to focus execution to just that one test. This will keep the output clean and speed up execution by not running irrelevant tests. + +## IDE Specific Usage + +Some additional tips for developing in specific IDEs. + +### Intellij IDEA / WebStorm + +To load the project in Intellij products, simply `Open` the repository folder. +Do **not** `Import Project`, because that will overwrite the existing +configuration. + +Once opened, the editor should automatically detect run configurations in the +workspace. Use the drop down to choose which one to run and then click the `Run` +button to start it. When executing a debug target, make sure to click the +`Debug` icon to automatically attach the debugger (if you click `Run`, Node will +wait forever for a debugger to attach). + + ## Creating New Packages + Adding a package to this repository means running two separate commands: 1. `schematics devkit:package PACKAGE_NAME`. This will update the `.monorepo` file, and create the diff --git a/docs/images/run-configurations.png b/docs/images/run-configurations.png new file mode 100644 index 0000000000000000000000000000000000000000..b81207f163a243606f453c04c05439225f47fcf2 GIT binary patch literal 28019 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
$26ujZ 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index ab58784d79..0570138460 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,6 @@ "templates": "node ./bin/devkit-admin templates", "test": "node ./bin/devkit-admin test", "test-large": "node ./bin/devkit-admin test --large --spec-reporter", - "test-cli-e2e": "node ./tests/legacy-cli/run_e2e", - "test:watch": "nodemon --watch packages -e ts ./bin/devkit-admin test", "validate": "node ./bin/devkit-admin validate", "validate-commits": "./bin/devkit-admin validate-commits", "preinstall": "node ./tools/yarn/check-yarn.js", diff --git a/scripts/templates/readme.ejs b/scripts/templates/readme.ejs index 5138da33d4..67f46f3703 100644 --- a/scripts/templates/readme.ejs +++ b/scripts/templates/readme.ejs @@ -52,16 +52,114 @@ analyze your code. # Getting Started - Local Development ## Installation + To get started locally, follow these instructions: 1. If you haven't done it already, [make a fork of this repo](https://github.com/angular/angular-cli/fork). 1. Clone to your local computer using `git`. 1. Make sure that you have Node 10.13 or later installed. See instructions [here](https://nodejs.org/en/download/). 1. Make sure that you have `yarn` installed; see instructions [here](https://yarnpkg.com/lang/en/docs/install/). -1. Run `yarn` (no arguments) from the root of your clone of this project. -1. Run `yarn link` to add all custom scripts we use to your global install. +1. Run `yarn` (no arguments) from the root of your clone of this project to install dependencies. + +## Building and Installing the CLI + +To make a local build: + +```shell +yarn build --local +``` + +This generates a number of tarballs in the `dist/` directory. To actually use +the locally built tools, switch to another repository reproducing the specific +issue you want to fix (or just generate a local repo with `ng new`). Then +install the locally built packages: + +```shell +cd "${EXAMPLE_ANGULAR_PROJECT_REPO}" +npm install -D ${CLI_REPO}/dist/*.tgz +``` + +Builds of this example project will use tooling created from the previous local +build and include any local changes. When using the CLI, it will automatically +check for a local install and use that if present. This means you can just run: + +```shell +npm install -g @angular/cli +``` + +to get a global install of the latest CLI release. Then running any `ng` command +in the example project will automatically find and use the local build of the +CLI. + +Note: If you are testing `ng update`, be aware that installing all the tarballs +will also update the framework (`@angular/core`) to the latest version. In this +case, simply install the CLI alone with +`npm install -D ${CLI_REPO}/dist/_angular_cli.tgz`, that way the rest of the +project remains to be upgraded with `ng update`. + +## Debugging + +To debug an invocation of the CLI, [build and install the CLI for an example +project](#building-and-installing-the-cli), then run the desired `ng` command +as: + +```shell +node --inspect-brk node_modules/.bin/ng ... +``` + +This will trigger a breakpoint as the CLI starts up. You can connect to this +using the supported mechanisms for your IDE, but the simplest option is to open +Chrome to [chrome://inspect](chrome://inspect) and then click on the `inspect` +link for the `node_modules/.bin/ng` Node target. + +Unfortunately, the CLI dynamically `require()`'s other files mid-execution, so +the debugger is not aware of all the source code files before hand. As a result, +it is tough to put breakpoints on files before the CLI loads them. The easiest +workaround is to use the `debugger;` statement to stop execution in the file you +are interested in, and then you should be able to step around and set breakpoints +as expected. + +## Testing + +There are three different test suites which can be run locally: + +* Unit tests + * Run: `yarn test --full` + * Debug: `yarn debug:test --full` +* Large tests + * Run: `yarn test-large --full` + * Debug: `yarn debug:test-large --full` +* End to end tests + * Run: `node tests/legacy-cli/run_e2e.js` + * Run subset of tests: `node tests/legacy-cli/run_e2e.js tests/legacy-cli/e2e/tests/i18n/ivy-localize-*` + +When running the debug commands, Node will stop and wait for a debugger to +attach. You can attach your IDE to the debugger to stop on breakpoints and step through the code. Also see [IDE Specific Usage](#ide-specific-usage) for a +simpler debug story. + +When debugging a specific test, change `describe()` or `it()` to `fdescribe()` +and `fit()` to focus execution to just that one test. This will keep the output clean and speed up execution by not running irrelevant tests. + +## IDE Specific Usage + +Some additional tips for developing in specific IDEs. + +### Intellij IDEA / WebStorm + +To load the project in Intellij products, simply `Open` the repository folder. +Do **not** `Import Project`, because that will overwrite the existing +configuration. + +Once opened, the editor should automatically detect run configurations in the +workspace. Use the drop down to choose which one to run and then click the `Run` +button to start it. When executing a debug target, make sure to click the +`Debug` icon to automatically attach the debugger (if you click `Run`, Node will +wait forever for a debugger to attach). + + ## Creating New Packages + Adding a package to this repository means running two separate commands: 1. `schematics devkit:package PACKAGE_NAME`. This will update the `.monorepo` file, and create the diff --git a/tests/angular_devkit/schematics/tools/file-system-engine-host/extra-properties/factory.ts b/tests/angular_devkit/schematics/tools/file-system-engine-host/extra-properties/factory.ts index 6c1beda510..a0fe71e473 100644 --- a/tests/angular_devkit/schematics/tools/file-system-engine-host/extra-properties/factory.ts +++ b/tests/angular_devkit/schematics/tools/file-system-engine-host/extra-properties/factory.ts @@ -10,7 +10,6 @@ import { SchematicContext, Tree } from '@angular-devkit/schematics'; export default function(options: {}) { return (tree: Tree, context: SchematicContext) => { - debugger; // We pass information back to the test. tree.create( (context.schematic.description as any).extra, // tslint:disable-line:no-any