node.js - Hvorfor markerer PNPM pakken min med "version: link:" etter kommandoen "pnpm install ..."?
Jeg har en pakke som er publisert på NPM. I denne pakken brukte jeg den samme pakken som en av dens avhengigheter, https://github.com/tal-rofe/cz-vinyl
Så som du kan se, er pakkenavnet cz-vinyl, med siste versjon 2.5.0. Viktigst, min package.json-fil inkluderer: "cz-vinyl": "2.5.0", så jeg bruker pakken som en avhengighet.
I pakken eksporterer jeg noen TypeScript-typer i dens package.json-fil:
"exports": {
".": {
"types": "./dist/config.d.ts",
"require": "./dist/index.cjs"
}
},
Men når jeg har en TypeScript-fil, https://github.com/tal-rofe/cz-vinyl/blob/main/czvinyl.config.ts, hvor jeg gjør:
import type { CzVinylConfig } from 'cz-vinyl';
Jeg får en feil: Cannot find module 'cz-vinyl' or its corresponding type declarations.ts(2307). Jeg forsto ikke hvorfor det var slik, fordi jeg eksporterte mine TypeScript-typer i pakken. Så fant jeg ut at PNPM bruker denne egenpakken som en lenke til kildekoden.
Fra pnpm-lock.yaml-filen:
cz-vinyl:
specifier: 2.5.0
version: 'link:'
Og når jeg ser på ./node_modules/cz-vinyl Ser jeg faktisk bare min egen kildekode, i stedet for de distribuerte filene fra NPM. Jeg testet det i et helt annet repository: Jeg installerte cz-vinyl i et annet prosjekt, ved å bruke PNPM, og jeg så min distribuerte NPM-kode. Og det er derfor jeg får feilen jeg limte inn her.
Så, hvorfor skjer det egentlig? Og hvordan kan jeg få PNPM til å bruke NPM-distribuert kode i stedet for å lenke direkte til kildekoden?
Etter mer undersøkelse fant jeg ut at problemet oppstår etter at Renovate lager en pull-forespørsel på koden min for å oppdatere noen av avhengighetenes versjoner.
Etter en ny undersøkelse sporet jeg Renovate-loggene og fant ut hva prosessen er:
Renovate endrer min
package.json-fil med denne endringen:Renovate kjører:
pnpm install --recursive --lockfile-only --ignore-scripts --ignore-pnpmfileRenovate oppdaterer min
pnpm-lock.yamlmed de nye endringene i henhold til trinn 2.
Jeg kunne reprodusere dette problemet lokalt:

