библиотека angular-cli создает вторичную точку входа - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь создать то, что, по моему мнению, называется вторичной точкой входа в мой угловой пакет npm.Я хочу следующие две точки входа

@scope/data-service
@scope/data-service/models

Использование Angular-Cli для генерации базового пакета создает следующую структуру

scope
└───data-service
    │   karma.conf.js
    │   ng-package.json
    │   ng-package.prod.json
    │   package.json
    │   tsconfig.lib.json
    │   tsconfig.spec.json
    │   tslint.json
    │
    └───src
        │   public_api.ts
        │   test.ts
        │
        └───lib
                data-service.component.spec.ts
                data-service.component.ts
                data-service.module.ts
                data-service.service.spec.ts
                data-service.service.ts

На основе документации ng-packagr вы бы добавили папку в data-service под названием models, затем добавили бы в нее package.json второй, но ng-packagr, похоже, использует немного другую структуру, чем angular-cli.В идеале я пытаюсь смоделировать структуру, подобную https://github.com/angular/angular/tree/master/packages/common, но пока публике выставляются @scope/data-service и @scope/data-service/models, я буду счастлив.

Когда я пытаюсь создать подобную структурук рекомендации ng-packager я получаю

error TS6059: File 'C:/projects/data-service-app/projects/scope/data-service/models/src/index.ts' is not under 'rootDir' 'C:\projects\data-service-app\projects\scope\data-service\src'. 'rootDir' is expected to contain all source files.

Когда я перемещаю каталог моделей в каталог data-service\src, мои точки входа

@scope/data-service
@scope/data-service/src/models

Как мне получитьизбавиться от src на моей вторичной точке входа?

Каков правильный подход к созданию библиотеки с вторичной точкой входа при использовании angular-cli?

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Спасибо за ответ.Вот решение, которое я выбрал, все вращалось вокруг правильной настройки файлов index.ts и public_api.ts

\---projects
    \---scope
        \---ngx-package
            |   karma.conf.js
            |   ng-package.json
            |   ng-package.prod.json
            |   package.json
            |   tsconfig.lib.json
            |   tsconfig.spec.json
            |   tslint.json
            |
            \---src
                |   public_api.ts
                |   test.ts
                |
                +---lib
                |       package-client-config.ts
                |       package-client.spec.ts
                |       package-client.ts
                |       package.module.ts
                |
                \---models
                    |   index.ts  (1)
                    |   package.json (2)
                    |   public_api.ts  (3)
                    |
                    \---src
                        |   public_api.ts  (4)
                        |
                        \---lib
                            |   model-a.ts
                            |   model-b.ts
                            |
                            \---hateoas
                                    hateoas.ts

Хорошо, так что в дереве выше отмечены паренсы с числами внутри, которые соответствуютфайлы ниже.

1) /projects/scope/ngx-package/src/models/index.ts

// export what ./public_api exports so we can reference models like
// import { modelA } from './models'
export * from './public_api';

2) / projects / scope / ngx-package / src / models/package.json

{
  "ngPackage": {}
}

3) /projects/scope/ngx-package/src/models/public_api.ts

export * from './src/public_api';

4) / projects / scope / ngx-package/src/models/src/public_api.ts

export * from './lib/model-a';
export * from './lib/model-b';
export * from './lib/hateoas/hateoas';

При этой настройке вам нужно только сохранить список экспорта в одном месте.Я перепробовал множество других вариантов, которые не сработали, и это, похоже, работало без проблем.

0 голосов
/ 19 августа 2019

Пример макета папки для вторичных точек входа

Все, что вам нужно сделать, это создать файл package.json и поместить его туда, где вы хотите создать вторичную точку входа.Один из способов сделать это - подражать структуре папок в следующем примере, в которой есть контрольная точка входа в дополнение к основной точке входа.

my_package
├── src
|   ├── public_api.ts
|   └── *.ts
├── ng-package.json
├── package.json
└── testing
    ├── src
    |   ├── public_api.ts
    |   └── *.ts
    └── package.json

Содержимое my_package/testing/package.json может быть таким простым, как::

{
  "ngPackage": {}
}

Нет, это не опечатка.Имя не требуется.Никакая версия не требуется.Это все обрабатывается для вас ng-packagr!После создания первичная точка входа импортируется с помощью import {..} from '@my/library', а вторичная точка входа с import {..} from '@my/library/testing'

Источник - https://github.com/ng-packagr/ng-packagr/blob/master/docs/secondary-entrypoints.md

0 голосов
/ 28 сентября 2018

Боюсь, что с ng-packagr это непростая задача.

Для каждого «проекта», который вы пытаетесь упаковать, ng-packagr автоматически обнаруживает все вторичные пакеты.

ng-packagr игнорирует tsconfig.lib.json файлы вторичных пакетов, он будет использовать файл tsconfig, предоставляемый с первичным пакетом.

Затем он загружает программу TS для основного и всех вторичных пакетов,перед компиляцией с помощью tsconfig первичного.

Это делается таким образом, чтобы упаковщик мог затем проанализировать код и создать дерево зависимостей, которое сообщит ему, какой пакет визуализировать первым, вторым и т. д.... ДА , это также означает, что ng-packagr НЕ предполагает, что вторичный пакет всегда зависит от первичного, это может быть другой путь и он действителен ...

Теперь до этого момента все должно быть в порядке, без ошибок и т. Д. Программа TS создается для всех пакетов, но ничего не выдается, поэтому все хорошо.

Ошибка, которую вы видите, появляется вфаза mpilation, где компилятор пытается испустить файлы и выкинуть их.Это когда ng-packagr регистрирует «Компиляция источников TypeScript через ngc»

На этом этапе машинопись не устраивает ссылку на файл вне корня, что имеет место.

Одним из решений является обновление свойства paths в tsconfig, чтобы оно указывало на выходной каталог для каждого пакета, который был собран.Поэтому, если пакет A был только что скомпилирован, мы изменяем / создаем paths запись, которая указывает на выходную библиотеку, которая не будет рассматриваться как источник TS ... таким образом, нет ошибки.

Это будет работать, у меня естьпротестировал его, но, к сожалению, он требует некоторой работы либо в ng-packagr исходном коде, либо, как я это сделал, с помощью пользовательского компоновщика угловых устройств devkit ...

С его помощью вы можете заменять paths сразу после каждогоКомпиляция завершена, поэтому следующая компиляция будет ссылаться на встроенный вывод, а не на исходный код.

Поскольку пакеты сборки ng-packagr основаны на графе зависимостей, можно с уверенностью предположить, что это будет работать.

...