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 enkelte package.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:"
  }
}

Relaterte artikler