angular - Hvordan tvinge npm til å flate ut avhengigheter?
Jeg har et prosjekt der flere frontend deler et felles bibliotek.
Modulavhengighetene til disse prosjektene blir administrert av npm.
Så, i package.json for hvert av disse prosjektene har jeg :
"dependencies": {
"mylib": "file:../<...path...>/mylib",
...other deps...
},
Jeg bruker «mylib» til to formål:
- del noen timer ;
- dele vanlige avhengigheter (for det meste, angular)
Inntil nå brukte jeg npm 3.3.12, og etter å ha kjørt npm install, var Angular-avhengighetene til mylib rett under node_modules-katalogen til mine øverste prosjekter.
Så jeg hadde for eksempel
node_modules
@angular
core
common
....
mylib
Nå, med npm 5.4.2, har jeg :
node_modules
mylib
node_modules
@angular
core
common
Dette forårsaker mange problemer i byggeprosessen min. Det krever ekstra konfigurasjon av TypeScript, ved å legge til direktiver som:
"baseUrl": "",
"paths": {
"@angular/common": ["node_modules/mylib/node_modules/@angular/common/"],
"@angular/core": ["node_modules/mylib/node_modules/@angular/core/"],
"@angular/compiler": ["node_modules/mylib/node_modules/@angular/compiler/"],
"@angular/compiler-cli": ["node_modules/mylib/node_modules/@angular/compiler-cli/"],
"@angular/forms": ["node_modules/mylib/node_modules/@angular/forms/"],
"@angular/http": ["node_modules/mylib/node_modules/@angular/http/"],
"@angular/platform-browser": ["node_modules/mylib/node_modules/@angular/platform-browser/"],
"@angular/platform-browser/animations": ["node_modules/mylib/node_modules/@angular/platform-browser/animations/"],
"@angular/platform-browser-dynamic": ["node_modules/mylib/node_modules/@angular/platform-browser-dynamic/"],
"@angular/router": ["node_modules/mylib/node_modules/@angular/router/"],
"primeng/primeng": ["node_modules/mylib/node_modules/primeng/primeng"],
"rxjs/Rx": ["node_modules/mylib/node_modules/rxjs/Rx"]
}
i tsconfig.json
Det blir virkelig irriterende når du må gjøre lignende konfigurasjoner for AOT, rollup osv...
Jeg prøvde å bruke npm dedupe for å forenkle dette. Siden prosjektene har mange avhengigheter, tar det over 10 minutter for bare én av dem :
npm dedupe
...
...
removed 824 packages and moved 1020 packages in 623.196s
Finnes det en standard, effektiv måte å ha samme type avhengighetsflating som før? npm dedupe gjør jobben, men tar så mye tid at det ikke er et akseptabelt alternativ.
Svar #1
Som et alternativ til npm kan du vurdere å bytte til å bruke yarn. Det bør rydde opp i moduler som standard. Start med å fjerne din eksisterende node_modules-mappe, og gjør deretter bare yarn install.
Du kan også tvinge yarn til å gjøre en flat installasjon (yarn install --flat), men i dette tilfellet kan det være tilstrekkelig bare å gjøre den vanlige installasjonen.
Legg til yarn.lock-filen i versjonskontrollen, og enhver annen utsjekking vil da være låst til de samme modulversjonene (med mindre de gjør yarn upgrade).