2016-12-15 14:19:21 -05:00
# Building and Testing Angular
2015-03-17 21:48:02 -04:00
2016-12-15 14:19:21 -05:00
This document describes how to set up your development environment to build and test Angular.
2016-08-16 22:38:49 -04:00
It also explains the basic mechanics of using `git` , `node` , and `npm` .
2015-03-17 21:48:02 -04:00
2015-04-09 12:33:10 -04:00
* [Prerequisite Software ](#prerequisite-software )
* [Getting the Sources ](#getting-the-sources )
2016-07-21 14:48:23 -04:00
* [Installing NPM Modules ](#installing-npm-modules )
2016-07-08 15:00:27 -04:00
* [Building ](#building )
2015-04-09 12:33:10 -04:00
* [Running Tests Locally ](#running-tests-locally )
See the [contribution guidelines ](https://github.com/angular/angular/blob/master/CONTRIBUTING.md )
if you'd like to contribute to Angular.
2015-03-17 21:48:02 -04:00
## Prerequisite Software
Before you can build and test Angular, you must install and configure the
following products on your development machine:
2016-01-21 16:30:03 -05:00
* [Git ](http://git-scm.com ) and/or the **GitHub app** (for [Mac ](http://mac.github.com ) or
[Windows ](http://windows.github.com )); [GitHub's Guide to Installing
Git](https://help.github.com/articles/set-up-git) is a good source of information.
2017-12-06 12:22:45 -05:00
* [Node.js ](http://nodejs.org ), (version specified in the engines field of [`package.json` ](../package.json )) which is used to run a development web server,
run tests, and generate distributable files.
2016-01-21 16:30:03 -05:00
2017-12-06 12:22:45 -05:00
* [Yarn ](https://yarnpkg.com ) (version specified in the engines field of [`package.json` ](../package.json )) which is used to install dependencies.
2017-09-21 09:39:43 -04:00
2016-01-08 04:04:28 -05:00
* [Java Development Kit ](http://www.oracle.com/technetwork/es/java/javase/downloads/index.html ) which is used
to execute the selenium standalone server for e2e testing.
2015-03-17 21:48:02 -04:00
## Getting the Sources
2015-04-17 19:02:42 -04:00
Fork and clone the Angular repository:
2015-03-17 21:48:02 -04:00
2015-04-17 19:02:42 -04:00
1. Login to your GitHub account or create one by following the instructions given
2015-03-17 21:48:02 -04:00
[here ](https://github.com/signup/free ).
2. [Fork ](http://help.github.com/forking ) the [main Angular
repository](https://github.com/angular/angular).
3. Clone your fork of the Angular repository and define an `upstream` remote pointing back to
2015-04-17 19:02:42 -04:00
the Angular repository that you forked in the first place.
2015-03-17 21:48:02 -04:00
```shell
2015-04-17 19:02:42 -04:00
# Clone your GitHub repository:
2015-03-17 21:48:02 -04:00
git clone git@github.com:< github username > /angular.git
# Go to the Angular directory:
cd angular
# Add the main Angular repository as an upstream remote to your repository:
git remote add upstream https://github.com/angular/angular.git
```
2016-07-21 14:48:23 -04:00
## Installing NPM Modules
2015-03-17 21:48:02 -04:00
2016-08-16 22:38:49 -04:00
Next, install the JavaScript modules needed to build and test Angular:
2015-03-17 21:48:02 -04:00
```shell
# Install Angular project dependencies (package.json)
2017-09-21 09:39:43 -04:00
yarn install
2015-03-17 21:48:02 -04:00
```
2017-12-06 12:22:45 -05:00
**Optional**: In this document, we make use of installed npm package scripts and binaries
(stored under `./node_modules/.bin` ) by prefixing these command invocations with `$(yarn bin)` ; in
particular `gulp` and `protractor` commands.
2016-12-20 20:50:04 -05:00
2016-07-21 12:01:47 -04:00
## Windows only
In order to create the right symlinks, run **as administrator** :
```shell
./scripts/windows/create-symlinks.sh
```
Before submitting a PR, do not forget to remove them:
```shell
./scripts/windows/remove-symlinks.sh
```
2016-07-08 15:00:27 -04:00
## Building
2015-03-17 21:48:02 -04:00
2016-07-08 15:00:27 -04:00
To build Angular run:
2015-03-17 21:48:02 -04:00
```shell
2016-07-08 15:00:27 -04:00
./build.sh
2015-03-17 21:48:02 -04:00
```
2016-07-08 15:00:27 -04:00
* Results are put in the dist folder.
2015-03-17 21:48:02 -04:00
## Running Tests Locally
2016-07-08 15:00:27 -04:00
To run tests:
2015-11-06 18:16:53 -05:00
2015-09-02 20:08:16 -04:00
```shell
2016-07-29 17:10:20 -04:00
$ ./test.sh node # Run all angular tests on node
2016-07-14 11:51:05 -04:00
2016-07-29 17:10:20 -04:00
$ ./test.sh browser # Run all angular tests in browser
2018-03-23 10:55:32 -04:00
2016-07-29 17:10:20 -04:00
$ ./test.sh browserNoRouter # Optionally run all angular tests without router in browser
2016-07-14 11:51:05 -04:00
2018-03-23 10:55:32 -04:00
$ ./test.sh router # Optionally run only the router tests in browser
2016-07-14 11:51:05 -04:00
```
You should execute the 3 test suites before submitting a PR to github.
2017-08-31 17:06:22 -04:00
See [DEBUG.md ](DEBUG.md ) for information on debugging the code while running the unit tests.
2016-07-14 11:51:05 -04:00
All the tests are executed on our Continuous Integration infrastructure and a PR could only be merged once the tests pass.
- CircleCI fails if your code is not formatted properly,
2016-10-02 17:19:47 -04:00
- Travis CI fails if any of the test suites described above fails.
2016-07-14 11:51:05 -04:00
2016-12-05 13:27:20 -05:00
## <a name="clang-format"></a> Formatting your source code
2016-07-14 11:51:05 -04:00
2018-11-21 11:03:37 -05:00
Angular uses [clang-format ](http://clang.llvm.org/docs/ClangFormat.html ) to format the source code.
If the source code is not properly formatted, the CI will fail and the PR can not be merged.
2016-07-14 11:51:05 -04:00
You can automatically format your code by running:
2018-11-21 11:03:37 -05:00
- `gulp format` : format all source code
- `gulp format:changed` : re-format only edited source code.
2016-07-14 11:51:05 -04:00
2018-11-21 11:03:37 -05:00
A better way is to set up your IDE to format the changed file on each file save.
2018-06-07 12:42:29 -04:00
2018-11-21 11:03:37 -05:00
### VS Code
2018-12-03 17:52:31 -05:00
1. Install [Clang-Format ](https://marketplace.visualstudio.com/items?itemName=xaver.clang-format ) extension for VS Code.
2018-11-21 11:03:37 -05:00
2. Open `settings.json` in your workspace and add these lines:
2018-06-07 12:42:29 -04:00
```json
2018-11-21 11:03:37 -05:00
"files.autoSave": "onFocusChange",
"editor.formatOnSave": true,
"clang-format.executable": "PATH_TO_YOUR_WORKSPACE/angular/node_modules/.bin/clang-format",
2018-06-07 12:42:29 -04:00
```
2016-12-30 21:54:53 -05:00
## Linting/verifying your source code
You can check that your code is properly formatted and adheres to coding style by running:
``` shell
$ gulp lint
```
2017-01-19 17:25:44 -05:00
## Publishing snapshot builds
2018-04-23 14:46:02 -04:00
When a build of any branch on the upstream fork angular/angular is green on CircleCI,
it automatically publishes build artifacts
2017-01-19 17:25:44 -05:00
to repositories in the Angular org, eg. the `@angular/core` package is published to
http://github.com/angular/core-builds.
2016-07-14 11:51:05 -04:00
2016-12-15 14:19:21 -05:00
You may find that your un-merged change needs some validation from external participants.
Rather than requiring them to pull your Pull Request and build Angular locally, you can
publish the `*-builds` snapshots just like our Travis build does.
First time, you need to create the github repositories:
``` shell
$ export TOKEN=[get one from https://github.com/settings/tokens]
2017-08-24 11:03:05 -04:00
$ CREATE_REPOS=1 TRAVIS= ./scripts/ci/publish-build-artifacts.sh [github username]
2016-12-15 14:19:21 -05:00
```
For subsequent snapshots, just run
``` shell
$ ./scripts/publish/publish-build-artifacts.sh [github username]
```
2016-12-20 17:52:50 -05:00
The script will publish the build snapshot to a branch with the same name as your current branch,
and create it if it doesn't exist.
2018-11-21 11:03:37 -05:00
## Bazel support
### VS Code
1. Install [Bazel ](https://marketplace.visualstudio.com/items?itemName=DevonDCarew.bazel-code ) extension for VS Code.
2. Open `settings.json` in your workspace and add these lines:
```json
"files.associations": {
"*.bazel": "bazel"
},
```
## General IDE settings
### VS Code
1. Open `settings.json` in your workspace and add these lines:
```json
"editor.tabSize": 2,
"files.exclude": {
"bazel-out": true,
".idea": true,
".circleci": true,
".github": true,
"dist/**": true,
"node_modules/**": true,
".rpt2_cache": true,
".vscode": true
},
```