Сборка приложения Angular CLI 9 (Ivy) с локальной библиотекой (монорепо) не работает

У меня есть приложение Angular 9, в котором я начинаю перемещать некоторые компоненты в специальный проект библиотеки, который использует вторичные точки входа (пытаясь имитировать подход Angular Material). Все работает нормально, если я создаю как библиотеку, так и приложение с помощью компилятора Ivy, но при создании обоих с флагом --prod (что приводит к созданию библиотеки без Ivy) сборка приложения завершается ошибкой со следующей ошибкой:

Compiling @fabric/components/breadcrumbs : es2015 as esm2015

ERROR in node_modules/@fabric/components/breadcrumbs/fab-breadcrumbs.module.d.ts:1:22 - error NG6002: Appears in the NgModule.imports of AppModule, but could not be resolved to an NgModule class.

This likely means that the library (@fabric/components/breadcrumbs) which declares FabBreadcrumbsModule has not been processed correctly by ngcc, or is not compatible with Angular Ivy. Check if a newer version of the library is available, and update if s
o. Also consider checking with the library's authors to see if the library is expected to be compatible with Ivy.

1 export declare class FabBreadcrumbsModule {
                       ~~~~~~~~~~~~~~~~~~~~

Я пробовал обновиться до последней версии (9.0.2 -> 9.1.0), но она по-прежнему делает то же самое. Я попытался воссоздать это с помощью нового супер простого проекта монорепо, но в этом простом случае он отлично работает. Я сравнил файлы конфигурации tsconfig и angular.json между моим приложением и простым рабочим приложением, но они довольно идентичны. Так что я застрял. Я не уверен, что могло бы вызвать это, будь то на стороне ng-packagr, неправильная сборка библиотеки, или если это на angular-build на стороне приложения, которая испортилась. Любой совет будет очень признателен!


person mfaith    schedule 01.04.2020    source источник
comment
Извините, не знаю, но любопытно: почему Ivy отключен в сборке prod?   -  person Qortex    schedule 01.04.2020
comment
@Mic он отключен для сборок prod-библиотек, поскольку ожидается, что вы в конечном итоге опубликуете его в npm, и текущая рекомендация Angular - публиковать библиотеки, которые были скомпилированы с помощью старого механизма просмотра, чтобы они имели более широкую совместимость.   -  person mfaith    schedule 02.04.2020


Ответы (1)


После устранения неполадок и получения дополнительной информации от Пита из команды Angular я наконец смог выяснить основную причину этого. Хотел обновить здесь, на случай, если кто-то еще столкнется с таким же. Основная проблема заключалась в том, что мой tsconfig.app.json, который компилятор ng использует во время выполнения сборки ng, был вложен на один уровень ниже в папку src, а не в корне моего проекта. Это означало, что у него не было доступа к папке ./dist, в которой создавалась моя библиотека. Таким образом, несмотря на то, что в моем основном tsconfig были правильно определены пути, указывающие на папку ./dist lib, сборка приложения не могла до нее добраться. К сожалению, сообщения об ошибках не были хорошими, поэтому потребовалось довольно много времени, чтобы разобраться.

Полусвязанная проблема возникает после обновления до Angular 10, которое изменило организацию tsconfig в проекте на Макет стиля решения, переименовав основной проект tsconfig.json в tsconfig.base.json. Это сбивает компилятор ngcc, который предполагает, что базовый tsconfig - это просто tsconfig.json. Поэтому, если у вас есть настройка ngcc в качестве шага после установки, это не сработает, если у вас есть пути, определенные в tsconfig.base. Решение для этого - добавить флаг --tsconfig к вызову ngcc postinstall, указав его на ваш tsconfig.base.json.

person mfaith    schedule 22.07.2020