Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to upgrade Angular CLI project?

I'm attempting to upgrade my angular 2 project from 2.0.0 to 2.4.1. I understand that semantic versioning has been adopted since the 2.0.0 release and 2.x.x releases should be drop-in replacements. My experience seems to indicate otherwise. Maybe I just don't know what I'm doing but I have not found this to be straightforward...

Attempt 1 - Manual Version Upgrade

My naive first approach was to manually update my @angular dependencies. You can reference my package.json below (update 1). I made these changes, then did an npm install and I got several warnings then got the following error when I tried to do an ng serve.

Cannot read property 'AssetUrl' of undefined

And my warnings...

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.0.0 (node_modules\chokidar\node_modules\fsevents): npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"}) npm WARN @angular/[email protected] requires a peer of rxjs@^5.0.1 but none was installed. npm WARN @angular/[email protected] requires a peer of zone.js@^0.7.2 but none was installed. npm WARN @angular/[email protected] requires a peer of rxjs@^5.0.1 but none was installed. npm WARN @angular/[email protected] requires a peer of @angular/[email protected] but none was installed. npm WARN @angular/[email protected] requires a peer of @angular/[email protected] but none was installed. npm WARN @angular/[email protected] requires a peer of @angular/[email protected] but none was installed. npm WARN @ngtools/[email protected] requires a peer of @angular/compiler-cli@^2.3.1 but none was installed. npm WARN @ngtools/[email protected] requires a peer of @angular/tsc-wrapped@^0.5.0 but none was installed. npm WARN @ngtools/[email protected] requires a peer of webpack@^2.1.0-beta.25 but none was installed. 

So I went down the rabbit hole of trying to fix these warnings but I don't know how to fix all of them (e.g. @ngtools/webpack) and some of them appear to be in conflict with each other. So I abandoned the manual approach of updating my angular 2 version...

Original package.json

{   "name": "frontend",   "version": "0.0.0",   "license": "MIT",   "angular-cli": {},   "scripts": {     "start": "ng serve",     "lint": "tslint \"src/**/*.ts\"",     "test": "ng test",     "pree2e": "webdriver-manager update",     "e2e": "protractor",     "build": "ng build",     "buildProd": "ng build --env=prod"   },   "private": true,   "dependencies": {     "@angular/common": "2.0.0",     "@angular/compiler": "2.0.0",     "@angular/core": "2.0.0",     "@angular/forms": "2.0.0",     "@angular/http": "2.0.0",     "@angular/material": "^2.0.0-alpha.9-experimental-pizza",     "@angular/platform-browser": "2.0.0",     "@angular/platform-browser-dynamic": "2.0.0",     "@angular/router": "3.0.0",     "@types/google-libphonenumber": "^7.4.8",     "angular2-datatable": "^0.4.2",     "apollo-client": "^0.4.22",     "core-js": "^2.4.1",     "google-libphonenumber": "^2.0.4",     "graphql-tag": "^0.1.15",     "hammerjs": "^2.0.8",     "ng2-bootstrap": "^1.1.16",     "rxjs": "5.0.0-beta.12",     "ts-helpers": "^1.1.2",     "zone.js": "^0.6.26"   },   "devDependencies": {     "@types/hammerjs": "^2.0.33",     "@types/jasmine": "^2.2.30",     "@types/lodash": "^4.14.39",     "angular-cli": "1.0.0-beta.16",     "codelyzer": "~0.0.26",     "jasmine-core": "2.4.1",     "jasmine-spec-reporter": "2.5.0",     "karma": "1.2.0",     "karma-chrome-launcher": "^2.0.0",     "karma-cli": "^1.0.1",     "karma-jasmine": "^1.0.2",     "karma-remap-istanbul": "^0.2.1",     "protractor": "4.0.9",     "ts-node": "1.2.1",     "tslint": "3.13.0",     "typescript": "2.0.2",     "typings": "1.4.0"   } } 

Update 1 of package.json

{   "name": "frontend",   "version": "0.0.0",   "license": "MIT",   "angular-cli": {},   "scripts": {     "start": "ng serve",     "lint": "tslint \"src/**/*.ts\"",     "test": "ng test",     "pree2e": "webdriver-manager update",     "e2e": "protractor",     "build": "ng build",     "buildProd": "ng build --env=prod"   },   "private": true,   "dependencies": {     "@angular/common": "2.4.1",     "@angular/compiler": "2.4.1",     "@angular/core": "2.4.1",     "@angular/forms": "2.4.1",     "@angular/http": "2.4.1",     "@angular/material": "^2.0.0-alpha.9-experimental-pizza",     "@angular/platform-browser": "2.4.1",     "@angular/platform-browser-dynamic": "2.4.1",     "@angular/router": "3.0.0",     "@types/google-libphonenumber": "^7.4.8",     "angular2-datatable": "^0.4.2",     "apollo-client": "^0.4.22",     "core-js": "^2.4.1",     "google-libphonenumber": "^2.0.4",     "graphql-tag": "^0.1.15",     "hammerjs": "^2.0.8",     "ng2-bootstrap": "^1.1.16",     "rxjs": "5.0.1",     "ts-helpers": "^1.1.2",     "zone.js": "^0.7.2"   },   "devDependencies": {     "@types/hammerjs": "^2.0.33",     "@types/jasmine": "^2.2.30",     "@types/lodash": "^4.14.39",     "angular-cli": "1.0.0-beta.16",     "codelyzer": "~0.0.26",     "jasmine-core": "2.4.1",     "jasmine-spec-reporter": "2.5.0",     "karma": "1.2.0",     "karma-chrome-launcher": "^2.0.0",     "karma-cli": "^1.0.1",     "karma-jasmine": "^1.0.2",     "karma-remap-istanbul": "^0.2.1",     "protractor": "4.0.9",     "ts-node": "1.2.1",     "tslint": "3.13.0",     "typescript": "2.0.2",     "typings": "1.4.0"   } } 

Attempt 2 - Use npm-check-updates

Since when I tried to cherry-pick my angular dependencies for updates I ended up in a spiderweb of other dependencies that needed to be updated, I next tried to just update everything.

Based on this answer I tried the following:

npm i -g npm-check-updates npm-check-updates -u npm install 

This went fine but when I tried ng serve I get the following error:

ERROR in AppModule is not a NgModule

Using information gathered here, I downgraded my typescript version, that error went away, but a new error popped up.

ERROR in Error encountered resolving symbol values statically. Reference to a non-exported function (position 29:10 in the original .ts file), resolving symbol restPaths in rest-paths.ts, resolving symbol AppModule in app.module.ts, resolving symbol AppModule in app.module.ts

I've been fighting my way through these errors but the fact that I am having so much trouble is raising red flags.

Can anybody help? Am I taking the wrong approach?

Note that I have seen some suggestions about updating angular-cli projects that recommend uninstalling angular-cli and reinstalling it, then doing an ng init and overwriting your configuration files. This didn't work for me because I already had the latest version.

Edit: The statement about having the latest angular-cli was incorrect. I had angular-cli version 1.0.0-beta.16 whereas the latest at the time of this edit is 1.0.0-beta.24. Nevertheless, I did try to update my angular-cli and run ng init on my existing project. I notice now that I didn't follow the steps outlined on the angular-cli github page precisely. I skipped the npm install --save-dev angular-cli@latest, and I blew away all my node_modules instead of using the rm command they outline.

like image 582
The Gilbert Arenas Dagger Avatar asked Dec 30 '16 23:12

The Gilbert Arenas Dagger


People also ask

How can I update my Angular project from 8 to 11?

You can run ng add @angular/localize to include required packages. Finally, run ng update @angular/core @angular/cli command to update to Angular 11. This will migrate your project to latest Angular release. After the update to Angular 11 is done your project will be using Typescript 4.

How can I update my Angular project from 10 to 11?

As of now, going from Angular 10 to Angular 11 requires no changes to your current system. You need to run ng update @angular/core @angular/cli. It will push you to the Angular 11 update. The ng update part will automatically migrate you to TypeScript 4.0.


1 Answers

USEFUL:

Use the official Angular Update Guide select your current version and the version you wish to upgrade to for the relevant upgrade guide. https://update.angular.io/

See GitHub repository Angular CLI diff for comparing Angular CLI changes. https://github.com/cexbrayat/angular-cli-diff/

UPDATED 26/12/2018:

Use the official Angular Update Guide mentioned in the useful section above. It provides the most up to date information with links to other resources that may be useful during the upgrade.

UPDATED 08/05/2018:

Angular CLI 1.7 introduced ng update.

ng update

A new Angular CLI command to help simplify keeping your projects up to date with the latest versions. Packages can define logic which will be applied to your projects to ensure usage of latest features as well as making changes to reduce or eliminate the impact related to breaking changes.

Configuration information for ng update can be found here

1.7 to 6 update

CLI 1.7 does not support an automatic v6 update. Manually install @angular/cli via your package manager, then run the update migration schematic to finish the process.

npm install @angular/cli@^6.0.0 ng update @angular/cli --migrate-only --from=1 

UPDATED 30/04/2017:

1.0 Update

You should now follow the Angular CLI migration guide


UPDATED 04/03/2017:

RC Update

You should follow the Angular CLI RC migration guide


UPDATED 20/02/2017:

Please be aware 1.0.0-beta.32 has breaking changes and has removed ng init and ng update

The pull request here states the following:

BREAKING CHANGE: Removing the ng init & ng update commands because their current implementation causes more problems than it solves. Update functionality will return to the CLI, until then manual updates of applications will need done.

The angular-cli CHANGELOG.md states the following:

BREAKING CHANGES - @angular/cli: Removing the ng init & ng update commands because their current implementation causes more problems than it solves. Once RC is released, we won't need to use those to update anymore as the step will be as simple as installing the latest version of the CLI.


UPDATED 17/02/2017:

Angular-cli has now been added to the NPM @angular package. You should now replace the above command with the following -

Global package:

npm uninstall -g angular-cli @angular/cli npm cache clean npm install -g @angular/cli@latest 

Local project package:

rm -rf node_modules dist # On Windows use rmdir /s /q node_modules dist npm install --save-dev @angular/cli@latest npm install ng init 

ORIGINAL ANSWER

You should follow the steps from the README.md on GitHub for updating angular via the angular-cli.

Here they are:

Updating angular-cli

To update angular-cli to a new version, you must update both the global package and your project's local package.

Global package:

npm uninstall -g angular-cli npm cache clean npm install -g angular-cli@latest 

Local project package:

rm -rf node_modules dist tmp # On Windows use rmdir /s /q node_modules dist tmp npm install --save-dev angular-cli@latest npm install ng init 

Running ng init will check for changes in all the auto-generated files created by ng new and allow you to update yours. You are offered four choices for each changed file: y (overwrite), n (don't overwrite), d (show diff between your file and the updated file) and h (help).

Carefully read the diffs for each code file, and either accept the changes or incorporate them manually after ng init finishes.

like image 173
J J B Avatar answered Sep 19 '22 03:09

J J B