Angular:库升级到 Angular9,演示应用程序出现 ngcc 构建错误
Angular: library upgrate to Angular9 with ngcc build error for the demo-app
我正在维护一个 Angular 库,它由 Angular Cli 生成。在工作区内有一个库和一个演示应用程序,这是从 angular-cli 创建的所有 Angular 库的标准架构。
目前我正在将我的库升级到 Angular 9 的新版本。
我使用 ng update
的自动升级灵魂。解决一些迁移问题后(一些 API 已弃用)。可以成功构建库。
但是我被依赖库的演示应用程序的构建阻止了。我收到 ngcc
错误。经过网上的一些研究,我知道了背景:https://angular.io/guide/ivy#maintaining-library-compatibility;
尽管我了解什么是 ngcc
以及我们现在需要它的原因,但我仍然无法修复构建错误。
在我的库中,我也有如下模块:
// the first module
@NgModule({
...
})
export class FirstModule {
public static forRoot(
FirstConfig: Config
): ModuleWithProviders<FirstModule> {
return DIYModuleWithProviders(FirstModule, FirstConfig);
}
...
}
// the second module
@NgModule({
...
})
export class SecondModule {
public static forRoot(
SecondConfig: Config
): ModuleWithProviders<SecondModule> {
return DIYModuleWithProviders(SecondModule, SecondConfig);
}
...
}
这两个模块都在fotRoot
方法中调用了从其他模块导入的函数,如下所示:
export function DIYModuleWithProviders(
module: any,
config: Config
): ModuleWithProviders {
return {
ngModule: module,
providers: [
{
...
},
{
...
}
]
};
}
这个函数只是 return 一个 ModuleWithProviders
用于 forRoot
方法。我在这里抽象了功能,因为这两个模块在这部分的逻辑是一样的。
正如我提到的,库本身已成功构建(基于 google Angular 团队的文档,库仍在使用旧的 View Eigine 而不是 Ivy 编译器)。但是演示应用程序未能构建并出现以下错误:
Compiling my-library : module as esm5
Error: Error on worker #1: Error: No typings declaration can be found for the referenced NgModule class in function DIYModuleWithProviders(module, config) {
return {
ngModule: module,
providers: [
{
...
},
{
...
}
]
};
}.
基于 google Angular 团队的文档:演示应用程序使用 Ivy 编译器,这就是 ngcc
来到这里的原因。
我调整了DIYModuleWithProviders
的类型一段时间,但无法解决。
基于 link https://angular.io/guide/migration-module-with-providers,在 Angualr 9 中,ModuleWithProviders
必须具有泛型类型。于是改成ModuleWithProviders<any>
,还是不行。
https://github.com/500tech/angular-tree-component/issues/721。有什么想法吗?
你必须给你的 ModuleWithProviders
类型参考。
ModuleWithProviders<YourType>
看那里:https://angular.io/guide/migration-module-with-providers
编辑:更准确地说,您的 DIYModuleWithProviders 函数还必须 return 类型化模块。
编辑:像那样尝试:
export function DIYModuleWithProviders<T>(
module: T,
config: Config
): ModuleWithProviders<T> {
return {
ngModule: module,
providers: [
{
...
},
{
...
}
]
};
}
或者像这样删除函数并将其挂接到您的模块中:
export class YourModule {
public static withOptions(options: YourModuleOptions ): ModuleWithProviders<YourModule> {
return {
ngModule: YourModule ,
providers: [...]
}
}
我正在维护一个 Angular 库,它由 Angular Cli 生成。在工作区内有一个库和一个演示应用程序,这是从 angular-cli 创建的所有 Angular 库的标准架构。
目前我正在将我的库升级到 Angular 9 的新版本。
我使用 ng update
的自动升级灵魂。解决一些迁移问题后(一些 API 已弃用)。可以成功构建库。
但是我被依赖库的演示应用程序的构建阻止了。我收到 ngcc
错误。经过网上的一些研究,我知道了背景:https://angular.io/guide/ivy#maintaining-library-compatibility;
尽管我了解什么是 ngcc
以及我们现在需要它的原因,但我仍然无法修复构建错误。
在我的库中,我也有如下模块:
// the first module
@NgModule({
...
})
export class FirstModule {
public static forRoot(
FirstConfig: Config
): ModuleWithProviders<FirstModule> {
return DIYModuleWithProviders(FirstModule, FirstConfig);
}
...
}
// the second module
@NgModule({
...
})
export class SecondModule {
public static forRoot(
SecondConfig: Config
): ModuleWithProviders<SecondModule> {
return DIYModuleWithProviders(SecondModule, SecondConfig);
}
...
}
这两个模块都在fotRoot
方法中调用了从其他模块导入的函数,如下所示:
export function DIYModuleWithProviders(
module: any,
config: Config
): ModuleWithProviders {
return {
ngModule: module,
providers: [
{
...
},
{
...
}
]
};
}
这个函数只是 return 一个 ModuleWithProviders
用于 forRoot
方法。我在这里抽象了功能,因为这两个模块在这部分的逻辑是一样的。
正如我提到的,库本身已成功构建(基于 google Angular 团队的文档,库仍在使用旧的 View Eigine 而不是 Ivy 编译器)。但是演示应用程序未能构建并出现以下错误:
Compiling my-library : module as esm5
Error: Error on worker #1: Error: No typings declaration can be found for the referenced NgModule class in function DIYModuleWithProviders(module, config) {
return {
ngModule: module,
providers: [
{
...
},
{
...
}
]
};
}.
基于 google Angular 团队的文档:演示应用程序使用 Ivy 编译器,这就是 ngcc
来到这里的原因。
我调整了DIYModuleWithProviders
的类型一段时间,但无法解决。
基于 link https://angular.io/guide/migration-module-with-providers,在 Angualr 9 中,ModuleWithProviders
必须具有泛型类型。于是改成ModuleWithProviders<any>
,还是不行。
https://github.com/500tech/angular-tree-component/issues/721。有什么想法吗?
你必须给你的 ModuleWithProviders
类型参考。
ModuleWithProviders<YourType>
看那里:https://angular.io/guide/migration-module-with-providers
编辑:更准确地说,您的 DIYModuleWithProviders 函数还必须 return 类型化模块。
编辑:像那样尝试:
export function DIYModuleWithProviders<T>(
module: T,
config: Config
): ModuleWithProviders<T> {
return {
ngModule: module,
providers: [
{
...
},
{
...
}
]
};
}
或者像这样删除函数并将其挂接到您的模块中:
export class YourModule {
public static withOptions(options: YourModuleOptions ): ModuleWithProviders<YourModule> {
return {
ngModule: YourModule ,
providers: [...]
}
}