У меня есть библиотека с рабочим пространством, содержащим два проекта, один для самой библиотеки и один для тестового приложения.
├── 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
не было указано.