Проект Angular с внешней библиотекой не компилируется в режиме AOT с использованием angular-cli

Я начал новый новый проект, созданный с помощью angular-cli 8.1.2. Я хочу иметь общую библиотеку для нескольких микросервисов (приложений). Эту библиотеку НЕЛЬЗЯ включать в папку с приложениями, это другой проект, у него свой git. Если я попробую это, приложение не скомпилируется в режиме aot/production, а будет работать в режиме jit.

Я хочу 2 проекта в 2 каталогах для приложения:

/test-lib
/test-app

Поэтому я сначала генерирую библиотеку с помощью angular-cli:

ng new test-lib --create-application=false
(using defaults)
cd test-lib/
ng generate library test-lib --prefix=test
ng build test-lib

Это создает папку библиотеки и проект внутри /test-lib/projects/test-lib.

Теперь я создаю (первое) приложение:

cd ..
ng new test-app
(using defaults)

Теперь я подключаю библиотеку к этому приложению:

Добавление «путей» в tsconfig.json:

"paths": {
  "test-lib": [
    "../test-lib/dist/test-lib"
  ],
  "test-lib/*": [
    "../test-lib/dist/test-lib/*"
  ]
}

Добавляем импорт в app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { TestLibModule } from 'test-lib';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    TestLibModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

И добавил этот тег в app.component.html:

<test-test-lib></test-test-lib>

Запуск «ng serve» теперь работает без проблем.

Запуск «ng build» в папке test-app завершается с ошибкой:

ERROR in : Unexpected value 'TestLibModule in C:/Users/.../test-lib/dist/test-lib/test-lib.d.ts' imported by the module 'AppModule in C:/Users/.../test-app/src/app/app.module.ts'. Please add a @NgModule annotation.
enter code here

Дополнительно сообщает:

: 'test-test-lib' is not a known element:
1. If 'test-test-lib' is an Angular component, then verify that it is part of this module.
2. If 'test-test-lib' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to 
the '@NgModule.schemas' of this component to suppress this message. ("
</ul>

[ERROR ->]<test-test-lib></test-test-lib>")

Мои попытки импортировать компонент в app.component.ts также не увенчались успехом (не найдено)

Разве нельзя простым способом создать библиотеку с angular-cli, которая находится во внешней папке?


person C. Gäking    schedule 22.07.2019    source источник


Ответы (1)


Вам нужно работать с бочкой public_api в вашей библиотеке, импортировать из нее модуль, затем компилировать

Также вы можете работать со ссылкой npm, чтобы иметь отдельные каталоги.

person Robert garcia    schedule 22.07.2019
comment
Я думал, что уже делаю это. Если я использую import { TestLibModule } из 'test-lib/public-api'; в моем app.module.ts у меня такой же результат. Я изменил export * на export { TestLibModule } from './lib/test-lib.module'; в public-api.ts, но и это не помогло. - person C. Gäking; 22.07.2019
comment
Опубликуйте свой модуль TestLib, пожалуйста - person Robert garcia; 22.07.2019
comment
Я думаю, у вас проблемы с путями tsconfig, так как они указывают на dist, попробуйте импортировать вашу библиотеку следующим образом: import {//your imports} from '../../projects/testLib/src/public_api' - person Robert garcia; 22.07.2019
comment
Хорошо, я также загрузил тестовое приложение: github.com/cgaeking/test-app Я попытался импортировать { TestLibModule } из '../../../test-lib/projects/test-lib/src/public-api'; но вылезла та же ошибка - person C. Gäking; 22.07.2019
comment
Ваш импорт неверен import { TestLibModule } from '../../projects/test-lib/src/public-api'. Каталог ваших проектов должен быть на том же уровне, что и каталог src - person Robert garcia; 22.07.2019
comment
Так что я не могу иметь их в отдельных каталогах? Это разочаровывает при попытке построить правильную архитектуру микросервисов. Иначе здание невозможно? Почему? Значит, единственный способ — опубликовать пакет npm и импортировать его? Это сделало бы разработку lib неудобной. - person C. Gäking; 22.07.2019
comment
Я не знаю, возможна ли сборка, но и ваша библиотека, и ваше приложение должны жить в одной рабочей области, как только вы ее выпустите, она будет жить в вашем каталоге node_modules. - person Robert garcia; 22.07.2019
comment
Спасибо за ответы и ваше время в любом случае. Затем я попытаюсь найти обходной путь с символическими ссылками или чем-то еще, чтобы иметь возможность иметь библиотеку в отдельном репозитории git. - person C. Gäking; 22.07.2019
comment
Хорошо, это придется сделать. Спасибо - person C. Gäking; 22.07.2019
comment
Я обновил свой ответ, если он помог вам, пожалуйста, примите его. - person Robert garcia; 22.07.2019
comment
У меня возникла эта проблема, и это единственное место, где я смог найти кого-то, кто испытывает ту же проблему. Я пробовал "@mylib/api": ["../../dist/@mylib/api"] и "@mylib/api": ["../mylib/src/public-api"], оба приводят к ошибке: ошибка компиляции Angular JIT: «@angular/compiler» не загружен! поэтому приведенное выше решение не работает для меня. - person Mark Clark; 14.01.2020