我正在尝试将我的角度2项目从2.0.0升级到2.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版本的手动方法......
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"
}
}
尝试2 - 使用npm-check-updates
因为当我试图挑选我的角度依赖关系以进行更新时,我最终在一个需要更新的其他依赖关系的spiderweb中,我接下来尝试更新所有内容 .
根据this answer我尝试了以下内容:
npm i -g npm-check-updates
npm-check-updates -u
npm install
这很好,但是当我尝试服务时,我收到以下错误:
AppModule中的错误不是NgModule
使用收集的信息here,我降级了我的打字稿版本,该错误消失了,但是出现了一个新的错误 .
ERROR in Error遇到静态解析符号值 . 引用非导出函数(原始.ts文件中的位置29:10),解析rest-paths.ts中的符号restPaths,解析app.module.ts中的符号AppModule,解析app.module.ts中的符号AppModule
我一直在努力解决这些错误,但我遇到这么多麻烦的事实是引发了危险信号 .
Can anybody help? Am I taking the wrong approach?
请注意,我已经看到一些关于更新angular-cli项目的建议,建议卸载angular-cli并重新安装它,然后执行ng init并覆盖配置文件 . 这对我不起作用,因为我已经有了最新版本 .
编辑:关于拥有最新的角度cli的声明是不正确的 . 我有angular-cli版本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命令 .
6 回答
UPDATED 08/05/2018:
Angular CLI 1.7引入了
ng update
.1.7 to 6 update
CLI 1.7不支持自动v6更新 . 通过包管理器手动安装@ angular / cli,然后运行更新迁移原理图以完成该过程 .
UPDATED 30/04/2017:
1.0 Update
你现在应该按照 Angular CLI migration guide
UPDATED 04/03/2017:
RC Update
你应该按照 Angular CLI RC migration guide
UPDATED 20/02/2017:
请注意1.0.0-beta.32有重大更改并已删除
ng init and ng update
拉请求here表示以下内容:
angular-cli CHANGELOG.md陈述如下:
UPDATED 17/02/2017:
Angular-cli现已添加到NPM @angular包中 . 您现在应该使用以下命令替换上述命令 -
Global package:
Local project package:
ORIGINAL ANSWER
您应该按照GitHub上README.md的步骤通过angular-cli更新角度 .
他们来了:
Updating angular-cli
要将angular-cli更新为新版本,必须同时更新全局包和项目的本地包 .
Global package:
Local project package:
运行
ng init
将检查由ng new创建的所有自动生成文件的更改,并允许您更新自己的文件 . 每个更改的文件都有四个选项:y(覆盖),n(不覆盖),d(显示文件和更新文件之间的差异)和h(帮助) .仔细阅读每个代码文件的差异,并接受更改或在ng init完成后手动合并它们 .
JJB的回答让我走上正轨,但升级并不顺利 . 我的流程详述如下 . 希望将来这个过程变得更加容易,并且可以使用JJB的答案或者更直接的答案 .
解决方案详情
我已按照JJB答案中捕获的步骤精确更新了角度cli . 然而,在运行
npm install
之后,angular-cli被打破了 . 即使尝试做ng version
也会产生错误 . 所以我不能做ng init
命令 . 见下面的错误:为了能够使用任何angular-cli命令,我必须手动更新我的package.json文件并将@angular依赖项置于2.4.1,然后执行另一个
npm install
.在此之后,我能够做到
ng init
. 我更新了配置文件,但没有更新我的app / *文件 . 完成后,我仍然遇到错误 . 第一个详述如下,第二个是相同类型的错误,但在不同的文件中 .此错误与AppModule中的以下工厂提供程序相关联
为解决此错误,我使用了导出的函数并对提供程序进行了以下更改 .
摘要
总结一下我理解的最重要的细节,需要进行以下更改:
使用JJB答案(及其github页面)中详述的步骤更新angular-cli版本 .
手动更新@angular版本,angular-cli版本1.0.0-beta.24似乎不支持2.0.0
在angular-cli和
ng init
命令的帮助下,我更新了配置文件 . 我认为关键的变化是angular-cli.json和package.json . 请参阅底部的配置文件更改 .在我引用代码之前,将代码更改为导出函数,如解决方案详细信息中所示 .
关键配置更改
angular-cli.json改变了
变成...
在考虑ng-init使用的版本的手动合并之后,我的package.json看起来像这样 . 注意我的角度版本不是2.4.1,但我之后的变化是2.3中引入的组件继承,所以我对这些版本没问题 . 最初的package.json就在问题中 .
只需使用Angular CLI的内置功能即可
更新到最新版本 .
根据这里的文件http://angularjs.blogspot.co.uk/2017/03/angular-400-now-available.html你'should'只能运行...
由于我的zone.js和ngrx / store库是旧版本,我尝试了它并得到了一些错误 .
将那些更新到最新版本
npm install zone.js@latest --save
和npm install @ngrx/store@latest -save
,然后再次运行角度安装对我有用 .去掉 :
重新安装(带纱线)
重新安装(使用npm)
另一种方法是不使用全局安装,并在PATH中添加
/node_modules/.bin
文件夹,或使用npm脚本 . 升级会更软 .要将Angular CLI更新为新版本,必须同时更新全局包和项目的本地包 .
Global package:
Local project package:
参见参考资料https://github.com/angular/angular-cli