Как иметь абсолютные пути импорта в проекте библиотеки? - PullRequest
1 голос
/ 09 июля 2019

У меня есть библиотека с рабочим пространством, содержащим два проекта, один для самой библиотеки и один для тестового приложения.

├── projects
    ├── midi-app
    └── midi-lib

В рабочей области tsconfig.json файла я настроил несколько путей @app и @lib:

"paths": {
  "@app/*": ["projects/midi-app/src/app/*"],
  "@lib/*": ["projects/midi-lib/src/lib/*"],
  "midi-lib": [
    "dist/midi-lib"
  ],
  "midi-lib/*": [
    "dist/midi-lib/*"
  ]
}

Существует файл projects/midi-lib/tsconfig.lib.json, который распространяется на указанный выше файл tsconfig.json:

"extends": "../../tsconfig.json",

Файл public-api.ts содержит:

export * from './lib/midi-lib.module';

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

Но когда я пытаюсь использовать его в другом клиентском приложении, в другом рабочем пространстве, импортированном как модуль узла, я получаю много ошибок по неизвестным путям Can't resolve '@lib/...'

Как выразить пути к библиотекам, чтобы они отображались в клиентском приложении? Или как перевести пути к библиотекам при упаковке библиотеки?

В качестве побочного вопроса, мне интересно, почему удлинения не выполняются наоборот. Почему это не файл tsconfig.json, который распространяется на файл projects/midi-lib/tsconfig.lib.json?

Вот как я упаковываю и затем использую библиотеку:

Чтобы упаковать библиотеку, добавьте следующие скрипты в массив скриптов родительского package.json файла

"copy-license": "cp ./LICENSE.md ./dist/midi-lib",
"copy-readme": "cp ./README.md ./dist/midi-lib",
"copy-files": "npm run copy-license && npm run copy-readme",
"build-lib": "ng build midi-lib",
"npm-pack": "cd dist/midi-lib && npm pack",
"package": "npm run build-lib && npm run copy-files && npm run npm-pack",

и выполните команду: npm run package

затем установите зависимость

npm install ../midi-lib/dist/midi-lib/midi-lib-0.0.1.tgz

и импортировать модуль в модуль приложения В файле app.module.ts есть:

import { MidiLibModule } from 'midi-lib';
@NgModule({
  imports: [
    MidiLibModule

наконец-то вставьте компонент в шаблон

<midi-midi-lib></midi-midi-lib>

Когда библиотека установлена ​​в клиентском приложении, она имеет много файлов .d.ts в каталогах node_modules/midi-lib:

├── bundles
├── esm2015
│   └── lib
│       ├── device
│       ├── keyboard
│       ├── model
│       │   ├── measure
│       │   └── note
│       │       ├── duration
│       │       └── pitch
│       ├── service
│       ├── sheet
│       ├── soundtrack
│       ├── store
│       ├── synth
│       └── upload
├── esm5
│   └── lib
│       ├── device
│       ├── keyboard
│       ├── model
│       │   ├── measure
│       │   └── note
│       │       ├── duration
│       │       └── pitch
│       ├── service
│       ├── sheet
│       ├── soundtrack
│       ├── store
│       ├── synth
│       └── upload
├── fesm2015
├── fesm5
└── lib
    ├── device
    ├── keyboard
    ├── model
    │   ├── measure
    │   └── note
    │       ├── duration
    │       └── pitch
    ├── service
    ├── sheet
    ├── soundtrack
    ├── store
    ├── synth
    └── upload

Как этот lib/service/melody.service.d.ts файл

import { SoundtrackStore } from '@lib/store/soundtrack-store';
import { ParseService } from '@lib/service/parse.service';
import { CommonService } from './common.service';
export declare class MelodyService {
    private soundtrackStore;
    private parseService;
    private commonService;
    constructor(soundtrackStore: SoundtrackStore, parseService: ParseService, commonService: CommonService);
    addSomeMelodies(): void;
    private addSoundtrack;
    private generateNotes;
}

Как видно, он содержит ссылки на @lib отображение пути, которое неизвестно в клиентском приложении.

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

...