Angular: обновление библиотеки до Angular9 с ng cc ошибка сборки для демо-приложения - PullRequest
0 голосов
/ 30 марта 2020

Я поддерживаю библиотеку Angular, которая генерируется Angular Cli. Внутри рабочей области есть библиотека и демонстрационное приложение, которое является стандартной архитектурой для всего Angular libray, созданного из angular -cli.

В настоящее время я обновляю свою библиотеку до нового выпуска Angular 9.

Я использую автоматическое c обновление соула с ng update. После исправления некоторых проблем с миграцией (некоторые API устарели). Библиотека может быть успешно построена.

Но я заблокирован сборкой демо-приложения с библиотекой зависимостей. Я получил ngcc ошибку. После некоторых онлайн-исследований я знаю фон: https://angular.io/guide/ivy#maintaining -library-compatibility ; Сборка библиотеки завершается неудачно с Angular 9

Несмотря на то, что я понимаю, что такое 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: [
      {
        ...
      },
      {
        ...
      }
    ]
  };
}

Эта функция просто возвращает ModuleWithProviders для метода forRoot. Здесь я абстрагирую функцию, потому что эти два модуля имеют одинаковые логики c для этой части

Как я уже говорил, библиотека сама собирается успешно (на основе документов команды 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, но не могу разобраться. На основании ссылки https://angular.io/guide/migration-module-with-providers в Angualr 9 ModuleWithProviders должен иметь тип generi c. Поэтому измените его на ModuleWithProviders<any>, но оно не работает.

https://github.com/500tech/angular-tree-component/issues/721. Есть какие-нибудь идеи?

1 Ответ

1 голос
/ 30 марта 2020

Вы должны дать вашему ModuleWithProviders ссылку на тип.

ModuleWithProviders<YourType>

См. Здесь: https://angular.io/guide/migration-module-with-providers

Редактировать: Чтобы быть более точным, ваша функция DIYModuleWithProviders также должна возвращать типизированный модуль.

Редактировать: Попробуйте это так:

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: [...]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...