#angular #typescript #angular-library #ng-packagr
#angular #typescript #angular-библиотека #ng-packagr
Вопрос:
Я пытаюсь создать библиотеку angular со вторичной точкой входа для каждого модуля.
У меня есть три модуля: A, B и C. A является автономным, но B зависит от C, что означает, что я должен import
войти C.module.ts
B.module.ts
.
Я следил за этой статьей, поэтому у меня есть package.json
, index.ts
и public_api.ts
файлы в каждом модуле.
Когда я пытаюсь создать библиотеку, я получаю следующую ошибку:
------------------------------------------------------------------------------
Building entry point '@org/library-name/src/lib/A'
------------------------------------------------------------------------------
Compiling TypeScript sources through ngc
Bundling to FESM2015
Bundling to UMD
Minifying UMD bundle
Writing package metadata
Built @org/library-name/src/lib/A
------------------------------------------------------------------------------
Building entry point '@org/library-name/src/lib/B'
------------------------------------------------------------------------------
Compiling TypeScript sources through ngc
ERROR: Unable to write a reference to CComponent in /.../projects/library-name/src/lib/C/C.component.ts from /.../projects/library-name/src/lib/C/C.module.ts
Есть идеи, как заставить это работать?
Заранее спасибо.
Комментарии:
1. Вы нашли какое-либо решение? У меня такая же проблема..
2. Можете ли вы предоставить репозиторий с базой кода для просмотра?
Ответ №1:
Я могу рассказать вам, как я решил эту проблему.
Проблема здесь в том, чтобы понять, как ng-packagr
строятся наши библиотеки в зависимости от точек входа / структуры папок.
В моей конкретной ситуации у меня была следующая структура:
На выходе получается 2 куска, верно? my-lib/common
и my-lib/common/big-chunk
Бывает, что вторичные точки входа создаются ПЕРЕД основной, поэтому, имея общую логику, мне нужно будет поместить ее (и экспортировать) во вторичную точку входа my-lib/common/big-chunk
и использовать ее на основной my-lib/common
.
Если вы столкнулись с необходимостью совместного использования логики, подумайте о создании точки shared
входа.
Я обнаружил, что очень сложно использовать и внедрять вторичные точки входа, и могут потребоваться некоторые рефакторинги, чтобы заставить их работать и извлечь всю пользу, которую они могут принести, но в целом я думаю, что это того стоит 🙂
Комментарии:
1. можете ли вы объяснить некоторые дополнительные детали с помощью примера, в случае, если компонент C является общим для всех, так как мы можем использовать с компонентом B и в то же время с компонентом.
2. @MiguelSsSRrR, в моем случае мне нужно использовать общий одноэлементный сервис для двух разных независимых точек входа (скажем, модуля A и B). Можете ли вы помочь мне понять, как вызвать общий одноэлементный сервис в двух независимых модулях.
3. @dhana @sarangan Я думаю, что у вас обоих одинаковый вариант использования, и это продолжение того, что я объяснил выше — вам нужно создать отдельную точку входа только для общей логики (не имеет значения, является ли это сервисом, компонентом или просто функцией) и импортировать ее напотребители. — Предположим, вы создаете точку
my-lib/common/shared
входа с логикой, которой хотите поделиться. — Для потребителя A или B вам нужно будетimport {FantasticLogic} from 'my-lib/common/shared'
4. @MiguelSsSRrR большое спасибо. Он работает так, как ожидалось