Cómo actualizar la versión Angular en angular - cli proyecto?


Estoy intentando actualizar mi proyecto angular 2 de 2.0.0 a 2.4.1. Entiendo que el versionado semántico ha sido adoptado desde la versión 2.0.0 y 2.las versiones x.x deben ser reemplazos directos. Mi experiencia parece indicar lo contrario. Tal vez simplemente no sé lo que estoy haciendo, pero no he encontrado que esto sea sencillo...

Intento 1-Actualización manual de la versión

Mi primer enfoque ingenuo fue actualizar manualmente mis dependencias @angular. Puedes referencia de mi paquete.json a continuación (actualización 1). Hice estos cambios, luego hice un npm install y recibí varias advertencias, luego obtuve el siguiente error cuando traté de hacer un ng serve.

No se puede leer la propiedad 'AssetUrl' de undefined

Y mis advertencias...

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.

Así que me fui por el agujero del conejo de tratar de arreglar estas advertencias, pero no se cómo arreglar todos ellos (por ejemplo, @ngtools/webpack) y algunos de ellos parecen estar en conflicto entre sí. Así que abandoné la enfoque manual de actualización de mi versión angular 2...

Paquete original.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"
  }
}

Actualización 1 del paquete.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"
  }
}

Intento 2-Usar npm-check-updates

Desde que intenté seleccionar mis dependencias angulares para actualizaciones terminé en una telaraña de otras dependencias que necesitaban ser actualizadas, luego intenté simplemente actualizar todo.

Basado en esta respuesta Probé el siguiente:

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

Esto salió bien, pero cuando traté ng servir me sale el siguiente error:

ERROR en AppModule no es un NgModule

Usando la información recopilada aquí, bajé mi versión de typescript, ese error desapareció, pero apareció un nuevo error.

ERROR en Error encontrado resolviendo valores de símbolos estáticamente. Referencia a una función no exportada (posición 29: 10 en el original .archivo ts), resolviendo restPaths de símbolos en los caminos de descanso.ts, símbolo de resolución AppModule en app.módulo.ts, resolución de símbolo AppModule en app.módulo.ts

He estado luchando a mi manera a través de estos errores, pero el hecho de que estoy teniendo tantos problemas está levantando banderas rojas.

¿alguien Puede ayudar? ¿Estoy tomando el enfoque equivocado?

Tenga en cuenta que he visto algunas sugerencias sobre la actualización de proyectos angular-cli que recomiendan desinstalar angular-cli y reinstalarlo, luego hacer un inicio ng y sobrescribir los archivos de configuración. Esto no funcionó para mí porque ya tenía la última versión.

Editar: La declaración sobre tener la última angular-cli era incorrecta. Tenía angular-cli versión 1.0.0-beta.16 mientras que el último en el momento de esta edición es 1.0.0-beta.24. Sin embargo, traté de actualizar mi angular-cli y ejecutar ng init en mi proyecto existente. Ahora me doy cuenta de que no seguí los pasos descritos en la página de angular-cli github con precisión. Me salté el mnp install install save-dev angular-cli@latest, y volé todos mis node_modules en lugar de usar el comando rm que describen.

Author: J J B, 2016-12-31

6 answers

ÚTIL:

Utilice la guía oficial de actualización de Angular seleccione su versión actual y la versión a la que desea actualizar para la guía de actualización correspondiente. https://update.angular.io /

Vea GitHub repository Angular CLI diff para comparar los cambios de Angular CLI. https://github.com/cexbrayat/angular-cli-diff /

ACTUALIZADO 08/05/2018:

Introducción de Angular CLI 1.7 ng update.

Ng update

Un nuevo comando Angular CLI para ayudar a simplificar el mantenimiento de sus proyectos al día con las últimas versiones. Los paquetes pueden definir la lógica que se aplicará a sus proyectos para garantizar el uso de las últimas características, así como hacer cambios para reducir o eliminar el impacto relacionado con los cambios de ruptura.

La información de configuración para ng update se puede encontrar aquí

1.7 a 6 update

CLI 1.7 no admite una actualización automática de v6. Instale manualmente @angular / cli a través de su gestor de paquetes y, a continuación, ejecute el esquema de migración de actualización para finalizar el proceso.

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

ACTUALIZADO 30/04/2017:

1.0 Update

Ahora debe seguir la Guía de migración de Angular CLI


ACTUALIZADO 04/03/2017:

RC Update

Usted debe seguir la Guía de migración Angular CLI RC


ACTUALIZADO 20/02/2017:

Tenga en cuenta 1.0.0-beta.32 tiene cambios de ruptura y ha eliminado ng init and ng update

La pull request aquí establece lo siguiente:

BREAKING CHANGE: Eliminar los comandos ng init y ng update porque su implementación actual causa más problemas de los que resuelve. La funcionalidad de actualización volverá a la CLI, hasta entonces actualizaciones manuales de aplicaciones tendrá que hacer.

El angular-cli CHANGELOG.md establece lo siguiente:

CAMBIOS DE RUPTURA - @angular / cli: Eliminar los comandos ng init y ng update porque su implementación actual causa más problemas de los que resuelve. Una vez RC está liberado, no necesitaremos usarlos para actualizar ya que el el paso será tan simple como instalar la última versión de la CLI.


ACTUALIZADO 17/02/2017:

Angular-cli se ha añadido al paquete NPM @angular. Ahora debe reemplazar el comando anterior con el siguiente -

Paquete global:

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

Paquete de proyectos locales:

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

RESPUESTA ORIGINAL

Debe seguir los pasos de la README.md en GitHub para actualizar angular a través del angular-cli.

Aquí están:

Actualización angular-cli

Para actualizar angular-cli a una nueva versión, debe actualizar tanto el paquete global como el paquete local de su proyecto.

Paquete global:

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

Paquete de proyectos locales:

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

Ejecutando ng init comprobará si hay cambios en todos los archivos generados automáticamente creados por ng new y le permitirá actualizar los suyos. Se le ofrecen cuatro opciones para cada archivo cambiado: y (sobrescribir), n( no sobrescribir), d (mostrar diferencias entre el archivo y el archivo actualizado) y h (ayuda).

Lea cuidadosamente las diferencias para cada archivo de código, y acepte los cambios o incorpórelos manualmente después de que finalice ng init.

 70
Author: J J B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 17:19:06

La respuesta de JJB me puso en el camino correcto, pero la actualización no fue muy bien. Mi proceso se detalla a continuación. Esperemos que el proceso se vuelva más fácil en el futuro y la respuesta de JJB se pueda usar o algo aún más sencillo.

Detalles de la solución

He seguido los pasos capturados en la respuesta de JJB para actualizar la angular-cli con precisión. Sin embargo, después de ejecutar npm install angular-cli se rompió. Incluso tratando de hacer ng version produciría un error. Así que no pude hacer el ng init comando. Ver error más abajo:

$ ng init
core_1.Version is not a constructor
TypeError: core_1.Version is not a constructor
    at Object.<anonymous> (C:\_git\my-project\code\src\main\frontend\node_modules\@angular\compiler-cli\src\version.js:18:19)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    ...

Para poder usar cualquier comando angular-cli, tuve que actualizar mi paquete.archivo json a mano y subir las dependencias @ angular a 2.4.1, luego hacer otro npm install.

Después de esto pude hacer ng init. He actualizado mis archivos de configuración, pero ninguno de mis archivos app/*. Cuando esto se hizo, todavía estaba recibiendo errores. El primero se detalla a continuación, el segundo fue el mismo tipo de error pero en un archivo diferente.

ERROR en Error encontrado resolviendo valores de símbolo estáticamente. No se admiten llamadas a funciones. Considere reemplazar la función o lambda con una referencia a una función exportada (posición 62: 9 en el original .ts file), resolviendo el símbolo AppModule en C:/_git/my-project/code/src/main/frontend/src/app/app.módulo.ts

Este error está vinculado al siguiente proveedor de fábrica en mi AppModule

{ provide: Http, useFactory: 
    (backend: XHRBackend, options: RequestOptions, router: Router, navigationService: NavigationService, errorService: ErrorService) => {
    return new HttpRerouteProvider(backend, options, router, navigationService, errorService);  
  }, deps: [XHRBackend, RequestOptions, Router, NavigationService, ErrorService]
}

Para abordar este error, había utilizado una función exportada e hizo el después del cambio al proveedor.

    { 
      provide: Http, 
      useFactory: httpFactory, 
      deps: [XHRBackend, RequestOptions, Router, NavigationService, ErrorService]
    }

... // elsewhere in AppModule

export function httpFactory(backend: XHRBackend, 
                            options: RequestOptions, 
                            router: Router, 
                            navigationService: NavigationService, 
                            errorService: ErrorService) {
  return new HttpRerouteProvider(backend, options, router, navigationService, errorService);
}

Resumen

Para resumir lo que entiendo que son los detalles más importantes, se requerían los siguientes cambios: {[13]]}

  1. Actualice la versión de angular-cli usando los pasos detallados en la respuesta de JJB (y en su página de github).

  2. Actualización @ angular versión a mano, 2.0.0 no parecía ser compatible con angular-cli versión 1.0.0-beta.24

  3. Con la ayuda de angular-cli y el ng init comando, he actualizado mis archivos de configuración. Creo que los cambios críticos fueron a angular-cli.json y paquete.json. Consulte cambios en el archivo de configuración en la parte inferior.

  4. Realice cambios de código en las funciones de exportación antes de que haga referencia a ellas, como se muestra en los detalles de la solución.

Cambios en la Configuración de las claves

Angular-cli.json changes

{
  "project": {
    "version": "1.0.0-beta.16",
    "name": "frontend"
  },
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      "assets": "assets",
...

Cambiado a...

{
  "project": {
    "version": "1.0.0-beta.24",
    "name": "frontend"
  },
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      "assets": [
        "assets",
        "favicon.ico"
      ],
...

Mi paquete.json se ve así después de una fusión manual que considera las versiones utilizadas por ng-init. Tenga en cuenta que mi versión angular no es 2.4.1, pero el cambio que buscaba era la herencia de componentes que se introdujo en 2.3, por lo que estaba bien con estas versiones. El paquete original.json está en la pregunta.

{
  "name": "frontend",
  "version": "0.0.0",
  "license": "MIT",
  "angular-cli": {},
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "lint": "tslint \"src/**/*.ts\"",
    "test": "ng test",
    "pree2e": "webdriver-manager update --standalone false --gecko false",
    "e2e": "protractor",
    "build": "ng build",
    "buildProd": "ng build --env=prod"
  },
  "private": true,
  "dependencies": {
    "@angular/common": "^2.3.1",
    "@angular/compiler": "^2.3.1",
    "@angular/core": "^2.3.1",
    "@angular/forms": "^2.3.1",
    "@angular/http": "^2.3.1",
    "@angular/platform-browser": "^2.3.1",
    "@angular/platform-browser-dynamic": "^2.3.1",
    "@angular/router": "^3.3.1",
    "@angular/material": "^2.0.0-beta.1",
    "@types/google-libphonenumber": "^7.4.8",
    "angular2-datatable": "^0.4.2",
    "apollo-client": "^0.4.22",
    "core-js": "^2.4.1",
    "rxjs": "^5.0.1",
    "ts-helpers": "^1.1.1",
    "zone.js": "^0.7.2",
    "google-libphonenumber": "^2.0.4",
    "graphql-tag": "^0.1.15",
    "hammerjs": "^2.0.8",
    "ng2-bootstrap": "^1.1.16"
  },
  "devDependencies": {
    "@types/hammerjs": "^2.0.33",
    "@angular/compiler-cli": "^2.3.1",
    "@types/jasmine": "2.5.38",
    "@types/lodash": "^4.14.39",
    "@types/node": "^6.0.42",
    "angular-cli": "1.0.0-beta.24",
    "codelyzer": "~2.0.0-beta.1",
    "jasmine-core": "2.5.2",
    "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.13",
    "ts-node": "1.2.1",
    "tslint": "^4.0.2",
    "typescript": "~2.0.3",
    "typings": "1.4.0"
  }
}
 4
Author: The Gilbert Arenas Dagger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-31 19:16:28

De acuerdo con la documentación aquí http://angularjs.blogspot.co.uk/2017/03/angular-400-now-available.html usted 'debería' simplemente ser capaz de ejecutar...

Instalación de Npm@angular/{common,compiler,compiler-cli,core,forms,http,platform-browser,platform-browser-dynamic,platform-server,router,animations}@latest typescript@latest save save

Lo intenté y obtuve un par de errores debido a mi zona.las bibliotecas js y ngrx / store son versiones anteriores.

Actualización aquellos a las últimas versiones npm install zone.js@latest --save y npm install @ngrx/store@latest -save, luego ejecutar la instalación angular de nuevo funcionó para mí.

 1
Author: Matt Sugden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-24 15:51:36

Simplemente use la función incorporada de Angular CLI

ng update

Para actualizar a la última versión.

 1
Author: Nicolas Henneaux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-24 10:35:15

Eliminar:

npm uninstall -g angular-cli

Reinstalar (con hilo)

# npm install --global yarn
yarn global add @angular/cli@latest
ng set --global packageManager=yarn  # This will help ng-cli to use yarn

Reinstalar (con npm)

npm install --global @angular/cli@latest

Otra forma es no usar la instalación global, y agregar la carpeta /node_modules/.bin en la RUTA, o usar scripts npm. Será más suave para actualizar.

 0
Author: Nicolas Zozol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-15 19:53:44

Para actualizar Angular CLI a una nueva versión, debe actualizar tanto el paquete global como el paquete local de su proyecto.

Paquete global:

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

Paquete de proyectos locales:

rm -rf node_modules dist # use rmdir /S/Q node_modules dist in Windows Command Prompt; use rm -r -fo node_modules,dist in Windows PowerShell
npm install --save-dev @angular/cli@latest
npm install

Véase la referencia https://github.com/angular/angular-cli

 -1
Author: Ranjit Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-29 05:45:54