angular - 从 Angular 5 升级到 Angular 7 后,找不到“AppModule”的 NgModule 元数据
问题描述
我们的开发团队最近将 Angular 5 项目更新为 Angular 7。我已经下载了 repo,我正在尝试构建源代码,但是当我运行ng build命令时,我在 No NgModule metadata found for 'AppModule' 中得到一个错误.
如果我运行ng --version命令,它会显示以下内容:
- 角 CLI:7.3.6
- 节点:11.10.0
- 操作系统:win32 x64
- 角度:7.2.10
app.module.ts文件是:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { AdminComponent } from './layout/admin/admin.component';
import { AdminComponent1 } from './layout/admin1/estimate.component';
import { AuthComponent } from './layout/auth/auth.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { SharedModule } from './shared/shared.module';
import { MenuItems } from './shared/menu-items/menu-items';
import { BreadcrumbsComponent } from './layout/admin/breadcrumbs/breadcrumbs.component';
import { ServicesProvider } from '../providers/services';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { AuthGuardService } from './activate-guard';
import { AuthLoginService } from './deactivate-guard';
import { SupperAdmin } from './supperadmin-guard';
import { NgProgressModule } from 'ngx-progressbar';
import {SimpleNotificationsModule} from 'angular2-notifications';
import { ConfigService } from '../assets/config/ConfigService';
@NgModule({
declarations: [
AppComponent,
AdminComponent,
AdminComponent1,
AuthComponent,
BreadcrumbsComponent,
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
ReactiveFormsModule,
AppRoutingModule,
SharedModule,
NgProgressModule,
SimpleNotificationsModule.forRoot(),
BrowserModule,
],
providers: [MenuItems, ServicesProvider, AuthGuardService, SupperAdmin, AuthLoginService, NgProgressModule, ConfigService],
bootstrap: [AppComponent]
})
export class AppModule { }
main.ts文件是:
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.log(err));
而index.html如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome</title>
<base href="/">
<!-- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> -->
<script async defer src="https://maps.googleapis.com/maps/api/js?key=xxx"></script>
<!-- <script src="https://maps.googleapis.com/maps/api/js"
async defer></script> -->
<!-- <script src="../src/assets/js/pdf.js"></script>
<script src="../src/assets/js/pdf.worker.js"></script> -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimal-ui">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="description" content="Visual Estimator" />
<meta name="keywords" content="visualestimator" />
<meta name="author" content="phoenixcoded" />
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="0"/>
<link rel="icon" type="image/x-icon" href="favicon.ico">
<style>
</style>
<!-- Google font-->
<link href="https://fonts.googleapis.com/css?family=Roboto:400,500" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/ng2-toastr@4.1.2/ng2-toastr.css" rel="stylesheet" />
</head>
<body>
<app-root>
<div class="theme-loader">
<div class="loader-track">
<div class="preloader-wrapper">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-red">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-yellow">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
<div class="spinner-layer spinner-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="gap-patch">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
</div>
</div>
</app-root>
</body>
<script src='https://api.tiles.mapbox.com/mapbox.js/plugins/leaflet-image/v0.0.4/leaflet-image.js'></script>
<script>
</script>
</html>
以及angular.json文件:
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"mega-able": {
"root": "",
"sourceRoot": "src",
"projectType": "application",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist",
"index": "src/index.html",
"main": "src/main.ts",
"tsConfig": "src/tsconfig.app.json",
"polyfills": "src/polyfills.ts",
"assets": [
"src/assets",
"src/favicon.ico",
"src/marker-icon.png",
"src/marker-icon-2x.png"
],
"styles": [
"./node_modules/bootstrap/dist/css/bootstrap.min.css",
"./node_modules/ngx-bootstrap/datepicker/bs-datepicker.css",
"node_modules/bootstrap/scss/bootstrap.scss",
"node_modules/font-awesome-scss/scss/font-awesome.scss",
"src/assets/images/zommer/leaflet/dist/leaflet.css",
"src/assets/images/zommer/leaflet-draw-toolbar/dist/leaflet.draw-toolbar.css",
"src/assets/images/zommer/leaflet-toolbar/dist/leaflet.toolbar.css",
"src/assets/images/zommer/leaflet-draw/dist/leaflet.draw-src.css",
"src/scss/style.scss"
],
"scripts": [
"src/assets/images/zommer/jquery.min.js",
"src/assets/images/zommer/bootstrap.min.js",
"src/assets/images/zommer/leaflet/dist/leaflet-src.js",
"src/assets/images/zommer/leaflet/dist/leaflet.rotatedMarker.js",
"src/assets/images/zommer/leaflet-toolbar/dist/leaflet.toolbar-src.js",
"src/assets/images/zommer/leaflet-draw/dist/leaflet.draw-src.js",
"src/assets/images/zommer/leaflet-draw-toolbar/dist/leaflet.draw-toolbar.js",
"src/assets/images/zommer/color.js",
"src/assets/images/zommer/pdf.js",
"src/assets/images/zommer/pdf.worker.js",
"src/assets/images/zommer/leafletfunction.js"
]
},
"configurations": {
"prod": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
]
},
"production": {
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
}
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "mega-able:build"
},
"configurations": {
"prod": {
"browserTarget": "mega-able:build:prod"
},
"production": {
"browserTarget": "mega-able:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "mega-able:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"karmaConfig": "./karma.conf.js",
"polyfills": "src/polyfills.ts",
"tsConfig": "src/tsconfig.spec.json",
"scripts": [
"src/assets/images/zommer/jquery.min.js",
"src/assets/images/zommer/bootstrap.min.js",
"src/assets/images/zommer/leaflet/dist/leaflet-src.js",
"src/assets/images/zommer/leaflet/dist/leaflet.rotatedMarker.js",
"src/assets/images/zommer/leaflet-toolbar/dist/leaflet.toolbar-src.js",
"src/assets/images/zommer/leaflet-draw/dist/leaflet.draw-src.js",
"src/assets/images/zommer/leaflet-draw-toolbar/dist/leaflet.draw-toolbar.js",
"src/assets/images/zommer/color.js",
"src/assets/images/zommer/pdf.js",
"src/assets/images/zommer/pdf.worker.js",
"src/assets/images/zommer/leafletfunction.js"
],
"styles": [
"./node_modules/bootstrap/dist/css/bootstrap.min.css",
"./node_modules/ngx-bootstrap/datepicker/bs-datepicker.css",
"node_modules/bootstrap/scss/bootstrap.scss",
"node_modules/font-awesome-scss/scss/font-awesome.scss",
"src/assets/images/zommer/leaflet/dist/leaflet.css",
"src/assets/images/zommer/leaflet-draw-toolbar/dist/leaflet.draw-toolbar.css",
"src/assets/images/zommer/leaflet-toolbar/dist/leaflet.toolbar.css",
"src/assets/images/zommer/leaflet-draw/dist/leaflet.draw-src.css",
"src/scss/style.scss"
],
"assets": [
"src/assets",
"src/favicon.ico",
"src/marker-icon.png",
"src/marker-icon-2x.png"
]
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"src/tsconfig.app.json",
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
},
"mega-able-e2e": {
"root": "e2e",
"sourceRoot": "e2e",
"projectType": "application",
"architect": {
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "./protractor.conf.js",
"devServerTarget": "mega-able:serve"
}
},
"lint": {
"builder": "@angular-devkit/build-angular:tslint",
"options": {
"tsConfig": [
"e2e/tsconfig.e2e.json"
],
"exclude": [
"**/node_modules/**"
]
}
}
}
}
},
"defaultProject": "mega-able",
"schematics": {
"@schematics/angular:component": {
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
}
}
以下是我根据谷歌搜索尝试过的所有各种事情。除非另有说明,否则所有命令都是从 Git Bash 窗口运行的:
- npm install -g @angular/cli
- npm install @angular/cli
- ng更新@angular/cli
- 更新
- ng 更新 @angular/cli @angular/core
- 构建
关于 NgModule 元数据的相同问题仍然存在。接下来我尝试了以下方法:
- npm 移除 webpack
- npm install –save-dev @angular/cli@latest
- npm 缓存清理 –force
- npm 安装
- npm install –save-dev @angular/cli@latest
- 构建
问题依然存在。下一个:
- 手动删除了 node_modules 文件夹
- npm 安装
- 构建
问题依然存在。下一个:
- npm i -g @angular/cli@latest
- 手动删除 node_modules 文件夹
- npm 缓存清除 –force
- npm 缓存验证
- npm 安装
- npm 卸载 webpack
- npm install –save-dev –save-exact @angular/cli@latest
- 构建
问题依然存在。下一个:
- 手动删除了 node_modules 文件夹
- 手动删除 package-lock.json 文件
- npm 安装
- 构建
问题依然存在。下一个:
- npm 移除 webpack
- npm install –save-dev @angular/cli@latest
- 构建
问题依然存在。下一个:
- npm 缓存清理 –force
- npm 安装
- npm install –save-dev @angular/cli@latest
- 构建
问题依然存在。下一个:
- 手动删除了 node_modules 文件夹
- 手动删除 package-lock.json 文件
- npm 缓存清理 –force
- npm 安装
- npm install –save-dev @angular/cli@latest
问题依然存在。下一个:
- 在 Visual Studio 代码中打开的项目
- 在终端窗口中运行
- 确认编译错误
- 打开 app.component.ts 文件
- 添加一个空格,删除它,并保存
- 项目自动重新编译
- 成功访问网站http://localhost:4200
- 封闭的 Visual Studio 代码
- 从 Git Bash 窗口运行 ng serve
- 项目编译失败
- 重新打开 Visual Studio 代码
- 从终端窗口运行服务 - 错误仍然存在
- 重新保存了 app.component.ts 文件
- 成功访问该站点http://localhost:4200
- 重新启动 Visual Studio 代码
- 在 Visual Studio Code 中从终端窗口运行构建 – 返回错误
- 重新保存了 app.component.ts 文件
- 重新运行构建命令 - 错误仍然存在
在这一点上,我不知道还有什么可以尝试的,并且开发团队要等到周二放假,所以任何帮助或建议都将不胜感激,因为我有一些时间限制。预先感谢您的任何帮助。
解决方案
我想到目前为止,您已经阅读了这篇文章:https ://github.com/angular/angular-cli/issues/8798
如果没有,请阅读并注意 TS 还手动修改了 package.json 文件以解决他的问题。
由于我们没有在您的构建中看到实际的错误消息,因此我们无法推断问题是否与链接中的问题相同。因此,我为您解决问题的想法是执行以下操作:
- 删除 npm_modules 文件夹
- 将 package.json 文件移动到备份文件夹(以防我们需要它回来) - 所以它不应该存在于您的项目文件夹中,因为它会在您执行后续步骤时生成
- 执行 npm 安装
- 做构建
- 发球
完成上述操作后,或者如果您再次使用它,我建议您查看旧 package.json 和新 package.json 文件之间的区别,并让我们知道您观察到的情况,因为回馈总是好的。
推荐阅读
- .net-5 - Syncfusion - HTML 到 PDF - Html 转换失败 -.net5
- reactjs - 当我切换到另一个标签时,视频上传停止
- python - 使用 Google 距离矩阵 api 时的“departure_time”参数无效
- java - 我得到 java.lang.ClassCastException:com.sun.xml.ws.client.sei.SEIStub 无法转换为 org.apache.cxf.frontend.ClientProxy java 客户端
- flutter - 如何在 initState 中使用 materialApp 上下文
- excel - 在 excel 2019 中使用标准进行文本连接
- llvm - 如何重新洗牌llvm中的数组访问?
- android - custom_marker_icon >=0.2.0,版本解析失败
- android - 有没有办法知道哪个应用在 Android 上打开了移动数据?
- flutter - 如何扩展文本按钮?