Настройка общего компонента
У меня есть общий угловой компонент, в качестве вторичной точки входа которого используется набор утилит транспортира, чтобы упростить тестирование из приложения-потребителя. Мы не делаем монорепозиторий, поэтому репозиторий посвящен только этому конкретному общему компоненту. Мы распространяем этот общий компонент через npm
, используя URL-адреса git. Вот примерно структура проекта:
-. (root folder)
|-.dist
| |- shared-component (distributables)
|
|-.projects
| |
| |-. shared-component (sources - library)
| | |
| | |-. e2e-utils
| | | |- public_api.ts
| | | |- package.json (2nd entry point)
| | | |- ... (sources)
| | |
| | |-. src
| | | |-. lib
| | | | |- ... (sources)
| | | |- public_api.ts
| | |
| | |- package.json (1st entry point)
| |
| |- test-harness (demo - application)
|
|- angular.json
|- package.json
|- tsconfig.json
in angular.json
:
shared-component
определяется какlibrary
test-harness
определяется какapplication
in package.json
:
"files": [ "dist/shared-component" ],
"main": "dist/shared-component/bundles/shared-component.umd.js",
"module": "dist/shared-component/fesm5/shared-component.js",
"es2015": "dist/shared-component/fesm2015/shared-component.js",
"esm5": "dist/shared-component/esm5/shared-component.js",
"esm2015": "dist/shared-component/esm2015/shared-component.js",
"fesm5": "dist/shared-component/fesm5/shared-component.js",
"fesm2015": "dist/shared-component/fesm2015/shared-component.js",
"typings": "dist/shared-component/shared-component.d.ts",
"metadata": "dist/shared-component/shared-component.metadata.json",
in tsconfig.json
:
"paths": {
"shared-component": [
"dist/shared-component"
],
"shared-component/*": [
"dist/shared-component/*"
]
}
Использование установки приложения
in package.json
:
"dependencies": {
...
"shared-component": "git+<git-url>#<version>"
...
}
in app.module.ts
:
import { SharedComponentModule } from 'shared-component';
in some.e2e.test.ts
:
import { E2EUtils } from 'shared-component/dist/shared-component/e2e-utils'
Вопрос
Как сократить приведенное выше до простого:
import { E2EUtils } from 'shared-component/e2e-utils'
Неверное решение
В приложениях-потребителях tsconfig.json
и foreach используются совместно используемые ресурсы:
"paths": {
...
"shared-component/*": [
"node_modules/shared-component/dist/shared-component/*"
],
...
},
Мне не нравится это решение, потому что оно вынуждает добавлять дополнительную запись на каждый потребляемый пакет, что является накладным. Я хотел бы верить, что есть лучшее решение (раньше я ошибался).
Литература
- библиотека angular-cli создает вторичную точку входа (похоже, но не то же самое, я думаю, разные настройки проекта)
- https://github.com/ng-packagr/ng-packagr/blob/master/docs/secondary-entrypoints.md
- https://github.com/ng-packagr/ng-packagr/issues/199 (не очень актуально, но может послужить источником вдохновения)