typescript - Angular monorepo chyba TS6059: Súbor 'ng-youtube-api.service.ngtypecheck.ts' nie je pod 'rootDir'. Očakáva sa, že 'rootDir' bude obsahovať všetky zdrojové súbory
Vytvoril som 3 knižnice/balíky pre Angular:
@example/ng-youtube-playerobsahujúciYoutubePlayerComponentaYoutubeApiService@example/ng-dailymotion-playerobsahujúciDailymotionPlayerComponentaDailymotionApiService@example/ng-vimeo-playerobsahujúciVimeoPlayerComponentaVimeoApiService
Teraz som chcel vytvoriť knižnicu obsahujúcu VideoPlayerComponent, používajúc iba balíky poskytujúce YoutubeApiService, DailymotionApiService a VimeoApiService. Aby som nezahŕňal ostatné komponenty zbytočne, chcem rozdeliť tie 3 knižnice každú, aby som mohol nainštalovať len triedy Service.
Dalo by sa tvrdiť, že Angular používa tree-shaking, takže komponenty ani tak nebudú zabalené do aplikácie, ale aj tak by som radšej mal tieto závislosti oddelené pre stručnosť.
Skúsil som nastaviť monorepo obsahujúce 2 knižnice a testovaciu aplikáciu, ale od momentu, keď odkazujem na službu z inej knižnice, zostavovanie zlyhá. Vytvoril som veľmi jednoduché ukážkové pracovné prostredie, aby som problém reprodukoval:
git clone https://github.com/PieterjanDeClippel/angular-monorepo-test
cd angular-monorepo-test
npm install
ng build @mintplayer/ng-youtube-api
ng build @mintplayer/ng-youtube-player
ng build ng-youtube-player-demo
All projects compile successfully
Now go to the NgYoutubePlayerComponent and uncomment the injection parameter in the constructor (line 16)
ng build @mintplayer/ng-youtube-player
Kompilácia zlyháva s množstvom nasledujúcich chýb:
✖ Compiling with Angular sources in Ivy partial compilation mode.
projects/mintplayer/ng-youtube-api/src/lib/ng-youtube-api.service.ts:1:1 - error TS6059: File 'C:/Users/user/source/repos/Tmp/mintplayer-ng-youtube-player/projects/mintplayer/ng-youtube-api/src/lib/ng-youtube-api.service.ngtypecheck.ts' is not under 'rootDir' 'C:\Users\user\source\repos\Tmp\mintplayer-ng-youtube-player\projects\mintplayer\ng-youtube-player\src'. 'rootDir' is expected to contain all source files.
1 import { Injectable } from '@angular/core';
projects/mintplayer/ng-youtube-api/src/public-api.ts:1:1 - error TS6059: File 'C:/Users/user/source/repos/Tmp/mintplayer-ng-youtube-player/projects/mintplayer/ng-youtube-api/src/public-api.ngtypecheck.ts' is not under 'rootDir' 'C:\Users\user\source\repos\Tmp\mintplayer-ng-youtube-player\projects\mintplayer\ng-youtube-player\src'. 'rootDir' is expected to contain all source files.
Tu sú dva hlavné problémy:
- Musíte vybudovať každý projekt samostatne, v správnom poradí
- Nemôžete používať služby z knižníc v iných knižniciach
Už som si prečítal nasledujúcu podobnú otázku, ale nepomohla mi:
- Očakáva sa, že 'rootDir' bude obsahovať všetky zdrojové súbory
Kód
Môj testovací kód je umiestnený tu. Všetky pokyny na reprodukovanie problému sú uvedené v bloku kódu vyššie. Hlavné zmeny, ktoré som urobil, sú v koreňovom súbore tsconfig.json:
{
...
"compilerOptions": {
...,
"paths": {
"@mintplayer/ng-youtube-api": [
"projects/mintplayer/ng-youtube-api/src/public-api.ts"
],
"@mintplayer/ng-youtube-player": [
"projects/mintplayer/ng-youtube-player/src/public-api.ts"
]
}
}
}
Už som nastavil pracovný priestor obsahujúci knižnicu a aplikáciu, kde aplikácia bez problémov používa triedy z knižnice (pozri 3 repozitáre na vrchu otázky), ale od momentu, keď knižnica používa triedy z inej knižnice, je build poškodený.
Ako môžem toto opraviť a mať jedno pracovné prostredie s 2 knižnicami a testovacou aplikáciou?
Odpoveď č. 1
ak používate nx a máte chyby, o ktorých informoval pôvodný príspevok...
tiež som sa stretol s týmto problémom...
Zabíjalo ma to... nevedel som prísť na to, prečo nx nekompiloval správne... dávalo mi to množstvo chýb ohľadom jedného z mojich referencovaných projektov @scope1/lib2 a všetkých jeho .ts súborov, že sú mimo projektu, ktorý ich referencoval... tiež som si všimol, že dep-graph mal @scope1/lib2, ale nebola tam žiadna šípka závislosti z referencujúcej knižnice...
našiel som toto riešenie:
rm -rf node_modules/.cache
Tipujem, že nx mal v cache niečo nesprávne... po vymazaní sa dep-graph konečne správne zobrazil a build začal fungovať.
Odpoveď č. 2
Možno som tu trochu neskoro, ale zažíval som tento problém a používam len bežný Angular CLI na správu môjho pracovného priestoru... po veľkom hľadaní a prechádzaní dokumentácie TypeScriptu o riešení modulov, verím, že som pochopil, čo sa deje:
Mapovanie ciest je bežná vec pre Angular knižnice (najmä pri použití stratégie sekundárnych vstupných bodov), ale jeho správanie je trochu zložité. Veci sa ešte viac komplikujú, keď máme viacero knižníc v rovnakom pracovnom priestore: niekedy IDE začne ukazovať množstvo chýb; niekedy veci vyzerajú v poriadku, ale zlyhajú počas zostavovania; niekedy je všetko v poriadku počas zostavovania knižnice, ale všetko sa pokazí pri zostavovaní aplikácie/knižnice používateľa.
Problém je: spotrebitelia potrebujú zostavenú verziu knižníc, aby správne fungovali, takže by sa mali pozerať na priečinok dist. Riešenie, ktoré som našiel, bolo:
- Udržiavajte mapovania počas vývoja (resolving na projects/...) v koreňovom tsconfig.json
- Pridajte mapovania k vytvoreným artefaktom v tsconfig používanom na zostavenie knižnice spotrebiteľa (uvedenej v konfiguráciách angular.json)
IDE je šťastné, ng-packagr je šťastné hahahahh
Na zdravie!
