如何升级Angular CLI项目?


69

我正在尝试将我的angular 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),其中一些似乎相互冲突。所以我放弃了手动更新我的angular 2版本的方法...

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

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-updates

因为当我尝试挑选我的角度依赖项进行更新时,我最终陷入了需要更新的其他依赖项的蜘蛛网中,所以我接下来尝试仅更新所有内容。

基于此答案,我尝试了以下操作:

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

这很好,但是当我尝试ng服务时,出现以下错误:

AppModule中的错误不是NgModule

使用此处收集的信息,我将打字稿版本降级,该错误消失了,但是弹出了一个新错误。

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

我一直在努力克服这些错误,但是我遇到很多麻烦的事实是在发出危险信号。

有人可以帮忙吗?我采用错误的方法吗?

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

编辑:关于具有最新的angular-cli的声明不正确。我angular-cli version 1.0.0-beta.16在编辑时最新的是1.0.0-beta.24。不过,我确实尝试更新我的angular-cli并在现有项目上运行init。我现在注意到,我没有完全按照angular-cli github页面上概述的步骤进行操作。我跳过了npm install --save-dev angular-cli@latest,我删除了所有的node_modules而不是使用它们概述的rm命令。

Answers:


84

有用:

使用官方的《Angular Update Guide》(Angular更新指南)为相关的升级指南选择您的当前版本以及您希望升级到的版本。 https://update.angular.io/

请参阅GitHub存储库Angular CLI差异以比较Angular CLI更改。 https://github.com/cexbrayat/angular-cli-diff/

2018年12月26日更新:

使用上面有用的部分中提到的官方Angular Update Guide。它提供了最新信息以及指向其他资源的链接,这些链接在升级过程中可能会很有用。

2018年8月5日更新:

引入了Angular CLI 1.7 ng update

ng更新

全新的Angular CLI命令可帮助简化项目的最新版本。程序包可以定义将应用于您的项目的逻辑,以确保使用最新功能以及进行更改以减少或消除与重大更改相关的影响。

ng update的配置信息可以在这里找到

1.7至6更新

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

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

2017年4月30日更新:

1.0更新

您现在应该遵循Angular CLI迁移指南


2017年4月3日更新:

RC更新

您应该遵循Angular CLI RC迁移指南


2017年2月20日更新:

请注意1.0.0-beta.32有重大更改并已删除 ng init and ng update

这里的拉取请求说明以下内容:

突破性变化:删除ng init和ng update命令,因为它们的当前实现导致更多的问题而不是解决的问题。更新功能将返回到CLI,直到随后需要手动进行应用程序更新。

angular-cli CHANGELOG.md声明以下内容:

突破性变化 -@ angular / cli:删除ng init和ng更新命令,因为它们的当前实现导致更多的问题而不是解决的问题。RC发布后,我们将不再需要使用这些更新来进行更新,因为该步骤就像安装最新版本的CLI一样简单。


2017年2月17日更新:

现在已将Angular-cli添加到NPM @angular软件包中。您现在应该将以下命令替换为以下命令:

全球套餐:

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的步骤操作,以通过angular-cli更新angular 。

他们来了:

更新angular-cli

要将angular-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完成后手动将其合并。


3
在我在其他地方看到的所有“答案”中,您的答案是唯一包含更新项目的angular-cli的答案,这是我所缺少的..谢谢!
Dave Nottage '17

2
“指定的命令更新无效。有关可用选项,请参见ng help。” -对ng update吗?
Thomas Wang

1
通过查看更改日志,他们删除了ng init和ng update。看到这里github.com/angular/angular-cli/pull/4628
JJB

1
@JJB感谢您的更新!当您发布该更新时,它实际上在升级过程中。现在要手动升级。谢谢!
Moustache_Me_A_Question

2
很好的答案,我已经使用了好几次...但是还需要进一步修复,我现在正在研究它,或者我将提供答案,但是由于他们已删除了当前创建新项目的“ ng init”,似乎需要在package.json上进行复制。有人说您可以在现有项目上执行“ ng new projectname”,但这似乎很可怕,只是在立即确定它的过程中。
四元论

4

JJB的答案使我步入正轨,但升级进展得并不顺利。我的过程在下面详细说明。希望该过程将来会变得更容易,并且可以使用JJB的答案,甚至可以更直接地使用。

解决方案详细信息

我已经按照JJB的答案中捕获的步骤进行操作,以精确地更新angle-cli。但是,运行后npm installangular-cli被打破了。即使尝试这样做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)
    ...

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

在此之后我能够做ng init。我更新了配置文件,但没有更新任何app / *文件。完成此操作后,我仍然遇到错误。第一个在下面详细说明,第二个是相同类型的错误,但是在不同的文件中。

ERROR in Error遇到静态解析符号值的错误。不支持函数调用。考虑使用对导出函数的引用(原始.ts文件中的位置62:9)替换函数或lambda,在C:/ _ git / my-project / code / src / main / frontend / src / app中解析符号AppModule /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页面)中详述的步骤更新angular-cli版本。

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

  3. 借助angular-cli和ng init命令,我更新了配置文件。我认为关键的更改是angular-cli.json和package.json。请参阅底部的配置文件更改。

  4. 如解决方案详细信息所述,在我引用导出功能之前对它们进行代码更改。

关键配置更改

angular-cli.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"
  }
}

是否npm install -g @angular/cli@latest安装了包含beta版的最新版本?
alltej

@alltej npm install -g @ angular / cli @ latest将安装最新版本的angular-cli,它是一个beta版。在生成或更新package.json时,它不一定会使用最新版本的angular。
吉尔伯特·阿里纳斯匕首


1

根据此处http://angularjs.blogspot.co.uk/2017/03/angular-400-now-available.html上的文档,您“应该”可以运行...

npm install @ angular / {common,compiler,compiler-cli,core,forms,http,platform-b​​rowser,platform-b​​rowser-dynamic,platform-server,router,animations} @latest typescript @ latest --save

我尝试了一下,由于我的zone.js和ngrx / store库是较旧的版本,因此出现了一些错误。

将它们更新到最新版本npm install zone.js@latest --savenpm install @ngrx/store@latest -save,然后再次运行角度安装对我来说很有效。


0

去掉 :

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

另一种方法是不使用全局安装,而不/node_modules/.bin在PATH中添加文件夹,或使用npm脚本。升级起来会比较软。


0

对我有用的解决方案:

  • 删除node_modulesdist文件夹
  • (以cmd为单位)>> ng update --all --force
  • (在cmd中)>> npm install typescript @“> = 3.4.0和<3.5.0” --save-dev --save-exact
  • (在cmd中)>> npm install --save core-js
  • 评论import'core-js / es7 / reflect'; polyfill.ts中
  • (以cmd为单位)>> ng服务

-1

要将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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.