在 Angular 项目中使用自定义第 3 方组件时出现静态分析错误

Static analysis error when using custom 3rd party component in Angular project

我有一个 Angular (2+) 日期选择器组件 (link to Github),我目前正在两个 Angular 项目中使用

  1. Angular CLI v1.0.0-beta.30,Angular v2.3
  2. Angular CLI v1.0.0,Angular v4.0

App 1 在使用 ng serve 开发期间和使用 ng build -prod --aot 构建时均运行良好。但是,App 2 在尝试提供服务和构建时都会抛出以下错误;

ERROR in Error encountered resolving symbol values statically. Calling function 'makeDecorator', function calls are not supported. Consider replacing the function or lambda with a reference to an exported function, resolving symbol NgModule in /path/to/angular4-app/node_modules/ic-datepicker/node_modules/@angular/core/src/metadata/ng_module.d.ts, resolving symbol NgModule in /path/to/angular4-app/node_modules/ic-datepicker/node_modules/@angular/core/src/metadata.d.ts, resolving symbol NgModule in /path/to/angular4-app/node_modules/ic-datepicker/node_modules/@angular/core/src/core.d.ts, resolving symbol NgModule in /path/to/angular4-app/node_modules/ic-datepicker/node_modules/@angular/core/index.d.ts, resolving symbol IcDatepickerModule in /path/to/angular4-app/node_modules/ic-datepicker/dist/src/ic-datepicker.module.d.ts, resolving symbol IcDatepickerModule in /path/to/angular4-app/node_modules/ic-datepicker/dist/src/ic-datepicker.module.d.ts

ERROR in ./src/main.ts
Module not found: Error: Can't resolve './$$_gendir/app/app.module.ngfactory' in '/path/to/angular4-app/src'
 @ ./src/main.ts 4:0-74
 @ multi ./src/main.ts

我基于 this Github issue comment 的假设是上面的应用程序 1 中使用的版本没有执行触发此错误所需的静态分析。

什么会导致出现此错误?

编辑

所以我刚刚尝试复制库,将其直接剥离回一个模块和一个组件,除了输出一个 <h1/> 元素什么都不做,然后尝试并发生完全相同的错误(link to the stripped back version).

我遇到了 this page 并查看了那里的点,即第 8 点。我将 Angular 依赖项移动为 peerDependencies(您可以在上面的第二个 repo 中看到)但这并没有修复错误。

经过数小时的挖掘和反复试验,我找到了答案。在我的问题编辑中,我提到了 this page 并声称将 Angular 依赖项移动到 package.json 中的 peerDependencies 并不能解决问题。然而,这不是真的,因为我使用 npm link 在新的 Angular 项目中测试库。

我认为 Angular 的依赖项应该是 peerDependencies 而不是 dependencies 的原因是当 node_modules/ic-datepicker/node_modules 包含 @angular/* 依赖项时会发生错误。将 Angular 移动到 peer 将改为使用应用程序级 @angular deps 来防止此错误。

作为可能正在测试其本地版本库的任何人的旁注,如果您将 @angular 依赖项添加到 devDependencies 以便在开发期间使用,运行 npm link -production 而不是 npm link 以防止安装开发部门。