Passa al contenuto principale
Version: 6.x

pnpm fetch

Recupera i pacchetti da un file lock nell'archivio virtuale, il manifesto del pacchetto viene ignorato.

warning

Questo è un comando sperimentale. Modifiche sostanziali possono essere introdotte nelle versioni non principali della CLI.

Scenario di utilizzo

Questo comando è progettato specificamente per velocizzare la creazione di un'immagine docker.

Potresti aver letto la guida ufficiale per scrivere un Dockerfile per un'app Node.js, se non l'hai ancora letto, potresti volerlo leggere prima.

Da quella guida, impariamo a scrivere un Dockerfile ottimizzato per i progetti che utilizzano pnpm, che sarà simile a

FROM node:14

RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm

# File richiesti da pnpm install
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./

RUN pnpm install --frozen-lockfile --prod

# Unisci sorgenti app (bundle)
COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]

Fino a quando non ci saranno modifiche a .npmrc, package.json, pnpm-lock.yaml, .pnpmfile.cjs, la cache build di docker è ancora valida fino allo strato di RUN pnpm install -- frozen-lockfile -- prod, che costava la maggior parte del tempo quando si costruisce un'immagine docker.

Tuttavia, modifiche a package.json possono accadere molto più frequentemente del previsto, in quanto non contiene soltanto le dipendenze, ma può anche contenere il numero di versione, script e configurazione arbitraria per qualsiasi altro strumento.

È anche difficile mantenere un Dockerfile che costruisca un progetto monorepo, potrebbe sembrare

FROM node:14

RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm

# File richiesti da pnpm install
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./

# per ogni sottopacchetto, dobbiamo aggiungere un passo in più per copiare il suo manifesto
# nel posto giusto, poiché docker non ha modo di filtrare solo il package.json con
# una singola istruzione
COPY packages/foo/backage.json packages/foo/
COPY packages/bar/backage.json packages/bar/

RUN pnpm install --frozen-lockfile --prod

# Unisci sorgenti app (bundle)
COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]

Come puoi vedere, il Dockerfile deve essere aggiornato quando aggiungi o rimuovi sottopacchetti.

pnpm fetch risolverà perfettamente il problema di cui sopra fornendo la possibilità di recuperare il pacchetto dall'archivio virtuale con informazioni solo da un file di blocco.

FROM node:14

RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm

# pnpm fetch richiede solo il file lock
COPY pnpm-lock.yaml ./

RUN pnpm fetch --prod


ADD . ./
RUN pnpm install -r --offline --prod


EXPOSE 8080
CMD [ "node", "server.js" ]

Funziona sia per progetti semplici che per progetti monorepo, --offline impone a pnpm di non comunicare con il registro dei pacchetti poiché tutti i pacchetti necessari devono essere già presentati nell'archivio virtuale.

Finché il file di blocco non viene modificato, la cache di build è valida fino al layer RUN pnpm install -r --offline --prod, che ti farà risparmiare molto tempo.

Opzioni

--dev

Verranno recuperati solo i pacchetti di sviluppo

--prod

I pacchetti di sviluppo non verranno recuperati