【问题标题】:How to upgrade Angular CLI project?如何升级 Angular CLI 项目?
【发布时间】:2017-05-15 04:50:39
【问题描述】:

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

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

基于this answer 我尝试了以下方法:

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

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

AppModule 中的错误不是 NgModule

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

错误中的错误遇到静态解析符号值。 引用了一个非导出函数(原文位置 29:10 .ts 文件),在 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 并在我现有的项目上运行 ng init。我现在注意到我没有完全按照 angular-cli github 页面上列出的步骤进行操作。我跳过了npm install --save-dev angular-cli@latest,我吹走了我所有的node_modules,而不是使用他们概述的rm 命令。

【问题讨论】:

    标签: angular angular-cli


    【解决方案1】:

    有用:

    使用官方Angular Update Guide选择您当前的版本和您希望升级到的版本以获得相关的升级指南。 https://update.angular.io/

    请参阅 GitHub 存储库 Angular CLI diff 以比较 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更新的配置信息可以找到here

    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 migration guide


    2017 年 4 月 3 日更新:

    RC 更新

    您应该关注Angular CLI RC migration guide


    2017 年 2 月 20 日更新:

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

    拉取请求 here 声明如下:

    重大更改: 删除 ng init 和 ng update 命令,因为它们当前的实现导致的问题多于解决的问题。 更新功能将返回 CLI,在此之前手动更新 的应用程序需要完成。

    angular-cli CHANGELOG.md 声明如下:

    重大变化 - @angular/cli:删除 ng init 和 ng update 命令,因为它们当前的实现导致的问题多于解决的问题。一次 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 完成后接受更改或手动合并它们。

    【讨论】:

    • 在我在其他地方看到的所有“答案”中,您的唯一包含更新项目的 angular-cli,这是我所缺少的.. 谢谢!
    • "指定的命令更新无效。可用选项见ng help。" - ng update 正确吗?
    • 查看更改日志,他们删除了 ng init 和 ng update。看这里github.com/angular/angular-cli/pull/4628
    • @JJB 感谢您的更新!当您发布该更新时,实际上是在升级过程中。现在要手动升级。谢谢!
    • 很好的答案,我已经用过好几次了......但是还需要另一个修复,我现在正在处理它或者我会提供一个答案,但是因为他们已经删除了“ng init”目前正在创建一个新项目并复制 package.json 似乎是必需的。有人说您可以在现有项目上执行“ng new projectname”,但这似乎很可怕,只是现在正在弄清楚。
    【解决方案2】:

    JJB 的回答让我走上了正轨,但升级并不顺利。下面详细介绍我的过程。希望这个过程在未来变得更容易,并且可以使用 JJB 的答案或更简单的方法。

    解决方案详情

    我已按照 JJB 的答案中捕获的步骤精确更新 angular-cli。然而,在运行npm install angular-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/* 文件。完成后,我仍然遇到错误。第一个在下面详细说明,第二个是相同类型的错误,但在不同的文件中。

    错误中的错误遇到静态解析符号值。 不支持函数调用。考虑更换功能或 lambda 引用导出的函数(位置 62:9 在 原始 .ts 文件),解析符号 AppModule 在 C:/_git/my-project/code/src/main/frontend/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 页面)中详述的步骤更新 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"
          ],
    ...
    

    在考虑 ng-init 使用的版本的手动合并后,我的 package.json 看起来像这样。请注意,我的 Angular 版本不是 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 是否安装包含测试版的最新版本?
    • @alltej npm install -g @angular/cli@latest 将安装 angular-cli 的最新版本,这是一个 beta 版本。当您生成或更新您的 package.json 时,它不一定会使用最新版本的 angular。
    【解决方案3】:

    根据此处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 --save 和 npm install @ngrx/store@latest -save,然后再次运行角度安装对我有用。

    【讨论】:

      【解决方案4】:

      删除:

      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 脚本。升级会更软。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          只需使用 Angular CLI 的内置功能

          ng update
          

          更新到最新版本。

          【讨论】:

            【解决方案7】:

            对我有用的解决方案:

            • 删除 node_modules 和 dist 文件夹
            • (在 cmd 中)>> ng update --all --force
            • (在 cmd 中)>> npm install typescript@">=3.4.0 和
            • (在 cmd 中)>> npm install --save core-js
            • 在 polyfill.ts 中评论 import 'core-js/es7/reflect';
            • (在 cmd 中)>> ng 服务

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-01-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-12-23
              相关资源
              最近更新 更多