如何升级角度 CLI 项目?

我试图升级我的角度2项目从 2.0.02.4.1。我知道自从 2.0.0发行版以来,语义版本控制已经被采用,而 2.x.x发行版应该是插入式的替代品。我的经验似乎表明并非如此。也许我只是不知道我在做什么,但我没有发现这是直截了当的..。

尝试1-手动版本升级

我天真的第一个方法是手动更新我的 @angular依赖项。您可以在下面引用我的 package.json (更新1)。我做了这些修改,然后做了一个 npm install和我得到了几个警告,然后得到了下面的错误,当我试图做一个 ng serve

无法读取未定义的属性“ AssetUrl”

我的警告。

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 fsevents@1.0.15: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
npm WARN @angular/core@2.4.1 requires a peer of rxjs@^5.0.1 but none was installed.
npm WARN @angular/core@2.4.1 requires a peer of zone.js@^0.7.2 but none was installed.
npm WARN @angular/http@2.4.1 requires a peer of rxjs@^5.0.1 but none was installed.
npm WARN @angular/compiler-cli@0.6.4 requires a peer of @angular/compiler@2.0.2 but none was installed.
npm WARN @angular/compiler-cli@0.6.4 requires a peer of @angular/platform-server@2.0.2 but none was installed.
npm WARN @angular/compiler-cli@0.6.4 requires a peer of @angular/core@2.0.2 but none was installed.
npm WARN @ngtools/webpack@1.2.1 requires a peer of @angular/compiler-cli@^2.3.1 but none was installed.
npm WARN @ngtools/webpack@1.2.1 requires a peer of @angular/tsc-wrapped@^0.5.0 but none was installed.
npm WARN @ngtools/webpack@1.2.1 requires a peer of webpack@^2.1.0-beta.25 but none was installed.

因此,我陷入了试图修复这些警告的兔子洞,但我不知道如何修复所有这些警告(例如@ngtools/webpack) ,其中一些警告似乎相互冲突。所以我放弃了手动更新我的角度2版本..。

原始包裹 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"
}
}

更新 package.json 的1

{
"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"
}
}

尝试2-使用 npm-check-update

因为当我试图挑选我的角度依赖更新,我结束了一个蜘蛛网的其他依赖需要更新,我接下来试图只是更新一切。

基于 这个答案,我尝试了以下方法:

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

这很好,但是当我尝试发球时,我得到了下面的错误:

AppModule 中的 ERROR 不是 NgModule

利用收集到的 给你信息,我降低了打印版本的等级,这个错误消失了,但是出现了一个新的错误。

遇到静态解析符号值的错误。 对非导出函数的引用(原文中的位置29:10) . ts 文件) ,解析符号 restPath 中的 rest-path. ts,解析符号 中的 AppModule, 在 app.module.ts 中解析符号 AppModule

我一直在努力克服这些错误,但是我遇到这么多麻烦的事实却引起了人们的警觉。

有人能帮忙吗,我是不是走错路了?

注意,我已经看到了一些关于更新 angle-cli 项目的建议,这些建议建议卸载 angle-cli 并重新安装它,然后执行 ng init 并覆盖您的配置文件。这对我不起作用,因为我已经有了最新的版本。

编辑: 有关最新角斜率的说法是不正确的。我有 angular-cli version 1.0.0-beta.16,而最新的在这个编辑时间是 1.0.0-beta.24。尽管如此,我还是尝试更新我的角度斜面,并在我现有的项目上运行 init。我现在注意到,我没有遵循的步骤概述了棱角-cli github 页面精确。我跳过了 npm install --save-dev angular-cli@latest,并且删除了所有 node _ module,而没有使用它们概述的 rm 命令。

135866 次浏览

有用的:

使用官方的 角度更新指南选择您当前的版本和您希望升级到的版本,以获得相关的升级指南。 Https://update.angular.io/

有关比较角度 CLI 更改的信息,请参见 GitHub 存储库 角度 CLI 差Https://github.com/cexbrayat/angular-cli-diff/

更新于2018年12月26日:

使用上面有用的部分中提到的官方 角度更新指南。它提供了最新的信息,并提供了在升级过程中可能有用的其他资源的链接。

更新于2018年8月5日:

角 CLI 1.7引入了 ng update

最新消息

一个新的 Angular CLI 命令可以帮助您使项目与最新版本保持同步。包可以定义将应用于您的项目的逻辑,以确保使用最新的特性,以及进行更改,以减少或消除与破坏性更改相关的影响。

可以找到 ng 更新的配置信息 给你

1.7至6更新

CLI 1.7不支持自动的 v6更新。通过软件包管理器手动安装@angle/cli,然后运行更新迁移示意图来完成这个过程。

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

更新于2017年4月30日:

1.0更新

您现在应该跟随 角 CLI 迁移指南


更新于2017年4月3日:

RC 更新

你应该遵循 角 CLI RC 迁移指南


更新于2017年2月20日:

请注意,1.0.0-beta.32有重大变化,并已删除 ng init and ng update

请求 给你说明如下:

重大改变: 删除 ng init & ng 更新命令,因为它们当前的实现造成的问题比解决的问题更多。 更新功能将返回到 CLI,直到手动更新 应用程序将需要完成。

角-cli ChangeloG.md说明如下:

重大改变 -@angle/cli: 删除 ng init & ng 更新命令,因为它们当前的实现造成的问题多于解决的问题。就一次 RC 已经发布,我们将不再需要使用它们来更新 步骤只需安装最新版本的 CLI 即可。


更新于2017年2月17日:

Angular-cli 现在已经被添加到 NPM@angle 软件包中。现在,您应该将上面的命令替换为以下命令-

全球一揽子计划:

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

本地项目组合:

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

原始答案

您应该遵循 GitHub 上 README.md的步骤,通过 角斜肌更新角度。

他们在这里:

正在更新角度角

若要将 angle-cli 更新为新版本,必须同时更新全局包和项目的本地包。

全球一揽子计划:

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

本地项目组合:

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

运行 ng init将检查所有由 ng new 创建的自动生成文件的更改,并允许您更新您的文件。对于每个已更改的文件,您可以有四种选择: y (覆盖)、 n (不覆盖)、 d (在您的文件和更新的文件之间显示差异)和 h (帮助)。

仔细阅读每个代码文件的差异,要么接受更改,要么在 ng init 完成后手动合并它们。

JJB 的回答让我找到了正确的方向,但升级进行得并不顺利。我的过程详细如下。希望将来这个过程会变得更容易,并且 JJB 的答案可以被使用,或者更简单的东西。

解决方案详情

我已经按照 JJB 的答案中捕获的步骤精确地更新了角点。然而,在运行 npm install角斜肌被打破。即使尝试执行 ng version也会产生错误。所以我无法执行 ng init命令。见下面的错误:

$ 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)
...

为了能够使用任何 angle-cli 命令,我必须手动更新 package.json 文件,并将@angle 依赖项调整到2.4.1,然后执行另一个 npm install

在这之后,我能够做 ng init。我更新了配置文件,但没有更新 app/* 文件。当这样做的时候,我仍然得到错误。第一个错误在下面有详细说明,第二个错误是同一类型的错误,但是在不同的文件中。

遇到静态解析符号值的错误。 不支持函数调用。请考虑替换函数或 Lambda,引用一个导出函数(在 中解析符号 AppModule C:/_ git/my-project/code/src/main/front/src/app/app.module.ts

此错误与 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]
}

为了解决这个错误,我使用了一个导出函数,并对提供程序进行了以下更改。

    {
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);
}

摘要

为了总结我所理解的最重要的细节,需要做以下修改:

  1. 使用 JJB 答案中详细说明的步骤(以及在他们的 github 页面上)更新 angle-cli 版本。

  2. 通过手动更新@angle 版本,2.0.0似乎不支持 angle-cli 版本1.0.0-beta.24

  3. 在 angle-cli 和 ng init命令的帮助下,我更新了我的配置文件。我认为关键的变化是角斜肌。Json 和 Package。请参见底部的配置文件更改。

  4. 在引用导出函数之前对其进行代码更改,如解决方案详细信息所示。

密钥配置更改

角-斜。 json 变化

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

变成了..。

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

我的 package.json 在进行了手动合并(考虑到了 ng-init 使用的版本)之后看起来是这样的。注意,我的角版本不是2.4.1,但是我之后的改变是在2.3中引入的组件继承,所以我对这些版本很满意。原始的 package.json 在问题中。

{
"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"
}
}

根据这里的 http://angularjs.blogspot.co.uk/2017/03/angular-400-now-available.html文档,你“应该”能够运行..。

Npm install@angle/{ common、编译器、编译器-cli、核心、表单、 http、平台-浏览器、平台-浏览器-动态、平台-服务器、路由器、动画}@best typeescript@last —— save

我试过了,但是由于 zone.js 和 ngrx/store 库是旧版本,所以出现了一些错误。

更新这些到最新版本的 npm install zone.js@latest --savenpm install @ngrx/store@latest -save,然后运行角安装再次为我工作。

删除:

npm uninstall -g angular-cli

重新安装(用纱线)

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

重新安装(使用 npm)

npm install --global @angular/cli@latest

另一种方法是不使用全局安装,在 PATH 中添加 /node_modules/.bin文件夹,或者使用 npm 脚本。升级的话会软一些。

若要将 Angular CLI 更新为新版本,必须同时更新全局包和项目的本地包。

全球一揽子计划:

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

本地项目组合:

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

参见参考 https://github.com/angular/angular-cli

只要使用角度 CLI 的内置特性

ng update

更新至最新版本。

对我有效的解决方案是:

  • 删除 Node _ module远离文件夹
  • (在 cmd) > ng update-all-force
  • (在 cmd 中) > > npm install typecript@“ > = 3.4.0 and < 3.5.0”—— save-dev —— save-確
  • (在 cmd) > > npm install-save core-js
  • 填充物中注释 导入‘ core-js/es7/response’;
  • (中文) >