2017-07-15 11:38:10 -04:00
# Overview
2017-12-30 08:38:30 -05:00
Many of the documentation pages contain snippets of code examples. Extract these snippets from
2017-09-21 06:16:27 -04:00
real working example applications, which are stored in subfolders of the `/aio/content/examples`
folder. Each example can be built and run independently. Each example also provides e2e specs, which
2019-01-05 15:09:34 -05:00
are run as part of our CircleCI legacy build tasks, to verify that the examples continue to work as
expected, as changes are made to the core Angular libraries.
2017-07-18 10:17:30 -04:00
2017-12-30 08:38:30 -05:00
In order to build, run and test these examples independently you need to install dependencies into
2017-09-21 06:16:27 -04:00
their sub-folder. Also there are a number of common boilerplate files that are needed to configure
2017-12-30 08:38:30 -05:00
each example's project. Maintain these common boilerplate files centrally to reduce the amount
2017-09-21 06:16:27 -04:00
of effort if one of them needs to change.
2017-07-18 10:17:30 -04:00
2019-08-27 14:53:04 -04:00
> **Note for Windows users**
>
> Setting up the examples involves creating some [symbolic links](https://en.wikipedia.org/wiki/Symbolic_link) (see [here](#symlinked-node_modules) for details). On Windows, this requires to either have [Developer Mode enabled](https://blogs.windows.com/windowsdeveloper/2016/12/02/symlinks-windows-10) (supported on Windows 10 or newer) or run the setup commands as administrator.
2017-07-18 10:17:30 -04:00
## Boilerplate overview
2017-09-21 06:16:27 -04:00
As mentioned, many of the documentation pages contain snippets extracted from real example applications.
To achieve that, all those applications needs to contain a basic boilerplate. E.g. a `node_modules`
2017-12-30 08:38:30 -05:00
folder, `package.json` with scripts, etc.
2017-07-18 10:17:30 -04:00
2019-05-09 16:56:24 -04:00
No one wants to maintain the boilerplate on each example, so the goal of this tool is to provide a set of files that works across all the examples.
2017-07-18 10:17:30 -04:00
### Boilerplate files
2019-05-09 16:56:24 -04:00
Inside `/aio/tools/examples/shared/boilerplate` you will find a set of folders representing each project type.
2017-07-18 10:17:30 -04:00
2019-05-09 16:56:24 -04:00
Currently you will find the next project types:
2017-07-18 10:17:30 -04:00
2019-05-09 16:56:24 -04:00
* cli - For CLI based examples. This is the default one, to be used in the majority of the examples.
* getting-started - CLI-based with its own set of styles.
* i18n - CLI-based with additional scripts for internationalization.
* schematics - CLI-based with additional scripts for building schematics.
* service-worker - CLI-based with additional packages and configuration for service workers.
2019-04-22 21:12:32 -04:00
* systemjs - Currently in deprecation, only used in a few examples.
2019-05-09 16:56:24 -04:00
* testing - CLI-based with additional styles for jasmine testing.
* universal - CLI-based with an extra server target.
2020-04-06 15:57:58 -04:00
* viewengine - Additional configuration for running CLI-/SystemJS-based examples with `ViewEngine` (the pre-Ivy compiler/renderer).
2017-07-18 10:17:30 -04:00
2017-12-30 08:38:30 -05:00
There is also a `common` folder that contains files used in all different examples.
2017-07-18 10:17:30 -04:00
2017-12-30 08:38:30 -05:00
### The example-config.json
2017-07-18 10:17:30 -04:00
2017-12-30 08:38:30 -05:00
Each example is identified by an **example-config.json** configuration file in its root folder.
This configuration file indicates what type of boilerplate this example needs. E.g.
2017-07-18 10:17:30 -04:00
```json
2019-05-09 16:56:24 -04:00
{
"projectType": "cli",
"useCommonBoilerplate": true
}
2017-07-18 10:17:30 -04:00
```
2017-12-30 08:38:30 -05:00
If the file is empty then the default type of cli is assumed.
2019-05-09 16:56:24 -04:00
When the boilerplate tooling runs, it will copy into the example folder all of the appropriate files based on the project type.
2017-07-18 10:17:30 -04:00
2019-08-27 14:53:04 -04:00
< a name = "symlinked-node_modules" > < / a >
2017-07-18 10:17:30 -04:00
### A node_modules to share
2017-09-21 06:16:27 -04:00
With all the boilerplate files in place, the only missing piece are the installed packages. For
2017-12-30 08:38:30 -05:00
that you have a `/aio/tools/examples/shared/package.json` which contains **all** the packages
needed to run all the examples through all different boilerplates.
2017-07-18 10:17:30 -04:00
2019-08-27 14:53:04 -04:00
After installing these dependencies, a `node_modules/` folder will be created at
`/aio/tools/examples/shared/node_modules/` . This folder will be **symlinked** into each example.
So it is not a copy like the other boilerplate files.
2017-07-18 10:17:30 -04:00
### End to end tests
2017-12-30 08:38:30 -05:00
End to end changes between boilerplates.
For CLI applications, create a `app.e2e-spec.ts` inside the `e2e` folder. The tooling will run
`ng e2e` for each CLI based examples.
2017-07-18 10:17:30 -04:00
2017-12-30 08:38:30 -05:00
For SystemJS, each example contains an `e2e-spec.ts` file. You can find all the related configuration files
in the `/aio/tools/examples/shared` folder.
2017-07-18 10:17:30 -04:00
2017-11-21 16:48:14 -05:00
### example-boilerplate.js
2017-07-18 10:17:30 -04:00
2017-09-21 06:16:27 -04:00
This script installs all the dependencies that are shared among all the examples, creates the
`node_modules` symlinks and copy all the boilerplate files where needed. It won't do anything
2017-11-03 13:08:28 -04:00
about stackblitz nor e2e tests.
2017-07-18 10:17:30 -04:00
2017-09-21 06:16:27 -04:00
It also contains a function to remove all the boilerplate. It uses a `git clean -xdf` to do
the job. It will remove all files that don't exist in the git repository, **including any
new file that you are working on that hasn't been stage yet.** So be sure to save your work
before removing the boilerplate.
2017-07-18 10:17:30 -04:00
### run-example-e2e.js
This script will find all the `e2e-spec.ts` files and run them.
2017-09-21 06:16:27 -04:00
To not run all tests, you can use the `--filter=name` flag to run the example's e2e that contains
that name.
2017-07-18 10:17:30 -04:00
2017-11-21 16:48:14 -05:00
It also has an optional `--setup` flag to run the `example-boilerplate.js` script and install
2017-09-21 06:16:27 -04:00
the latest `webdriver` .
2017-07-18 10:17:30 -04:00
2019-05-09 16:56:24 -04:00
It will create a `/aio/protractor-results.txt` file when it finishes running tests.
### Updating example dependencies
With every major release, we update the examples to be on the latest version. The following steps to update are:
* In the `shared/package.json` file, bump all the `@angular/*` , `@angular-devkit/*` , `rxjs` , `typescript` , and `zone.js` package versions to the version that corresponds with the [framework version ](../../../package.json ).
* In the `shared` folder, run `yarn` to update the dependencies for the shared `node_modules` and the `yarn.lock` file.
* In the `boilerplate` folder, go through each sub-folder and update the `package.json` dependencies if one is present.
2019-08-27 14:53:04 -04:00
* Follow the [update guide ](./shared/boilerplate/UPDATING_CLI.md ) to update the common files used in the examples based on project type.