node.js - Hvordan kan jeg få alle pakkene i en monorepo til å dele samme versjon av en avhengighet?
Jeg bruker nx for å administrere et monorepo som inkluderer 100 Node.js-prosjekter. All kildekode er i typescript. Hvert prosjekt har sin egen package.json-fil som har typescript som sin dev-avhengighet. Mitt spørsmål er hvordan jeg kan tvinge alle package.json-filene til å bruke samme typescript-versjon? Når jeg vil oppgradere TypeScript-versjonen, vil jeg oppdatere ett sted som gjelder for alle pakker.
Svar #1
Å la alle prosjektene i et monorepo dele den samme versjonen av en (dev)avhengighet er faktisk en av bruksområdene for monorepo.
Og den enkle måten å implementere det på er å spesifisere den avhengigheten i roten av monorepoet, i en «shared» package.json-fil, i stedet for i hver enkelt prosjekts egen package.json:
Nx > Konsepter > Avhengighetsstyring > Enkel versjonspolicy
Med denne strategien definerer utviklere alle avhengigheter i rot-
package.json-filen. Dette håndhever en enkelt versjon for alle avhengigheter på tvers av kodebasen.
Merk at dette ikke er spesifikt for Nx, mange andre monorepo-administratorer anbefaler dette, da det rett og slett baserer seg på Nodes innebygde moduloppløsningsstrategi:
Node.js starter i katalogen til den gjeldende modulen, og legger til
/node_modules, og forsøker å laste modulen fra den plasseringen. [...]Hvis det ikke finnes der, går det deretter til overordnet katalog, og så videre, helt til rotmappen i filsystemet er nådd.
Selv om det betyr å gå utenfor en prosjektrotmappe.
Du vanligvis skyver denne strategien videre ved å spesifisere alle avhengigheter utelukkende i rot-package.json, selv om noen av disse avhengighetene bare brukes av noen få prosjekter i monorepoet. Hvis noen av dem krever bundling av sine avhengigheter, hjelper verktøyet for monorepo-administrasjon vanligvis med å kuratere listen:
pluginene Nx tilbyr kommer med executor-er som bruker Nxs avhengighetsgraf for automatisk å fylle ut
dependencies-seksjonen i de enkeltepackage.json-filene i byggeutgangen
Svar #2
Hvis du bruker arbeidsområdekonsepter, ta pnpm som et eksempel, kan du bruke Catalog Protocol for å håndheve en konsekvent versjon
https://pnpm.io/catalogs
For eksempel, innenfor pnpm-workspace.yaml, kan en spesifikk versjon for hele prosjektet defineres
Within pnpm-workspace.yaml
packages:
- packages/*
Define a catalog of version ranges.
catalog:
react: ^18.3.1
redux: ^5.0.1
Da kan "catalog:" brukes i stedet for spesifikk versjon i den spesifikke package.json-filen
{
"name": "@example/app",
"dependencies": {
"react": "catalog:",
"redux": "catalog:"
}
}
