Passer au contenu principal
Version : Suivant

pnpm fetch

Récupère les paquets d'un fichier de verrouillage dans le magasin virtuel, le manifeste des paquets est ignoré.

Scénario d'utilisation

Cette commande est spécifiquement conçue pour booster la construction d'une image docker.

Vous avez peut-être lu le guide officiel pour écrire un Dockerfile pour une application Node.js, si vous ne l'avez pas encore lu, vous pouvez le lire en premier.

À partir de ce guide, nous apprenons à écrire un Dockerfile optimisé pour les projets utilisant pnpm, qui ressemblera à

FROM node:14

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

# Fichiers requis par pnpm install
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./

RUN pnpm install --frozen-lockfile --prod

# Source de l'application groupée
COPY . .

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

Tant qu'il n'y a pas de changement à .npmrc, paquet. son, pnpm-lock.yaml, .pnpmfile. js, le cache de construction de docker est toujours valide jusqu'à la couche de RUN pnpm install --frozen-lockfile --prod, qui coûtent la plupart du temps lors de la construction d'une image de docker.

Cependant, la modification du package.json peut se produire beaucoup plus fréquemment que nous nous attendions, car il ne contient pas seulement des dépendances, mais peut également contenir le numéro de version, des scripts et une configuration arbitraire pour tout autre outil.

Il est également difficile de maintenir un Dockerfile qui construit un projet monorepo, il peut ressembler

FROM node:14

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

# Files required by pnpm install
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./

# for each sub-package, we have to add one extra step to copy its manifest
# to the right place, as docker have no way to filter out only package.json with
# single instruction
COPY packages/foo/package.json packages/foo/
COPY packages/bar/package.json packages/bar/

RUN pnpm install --frozen-lockfile --prod

# Bundle app source
COPY . .

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

Comme vous pouvez le constater, le Dockerfile doit être mis à jour lorsque vous ajoutez ou supprimez des sous-paquets.

pnpm fetch résoudra parfaitement le problème ci-dessus en fournissant la possibilité de récupérer un paquet dans un magasin virtuel avec des informations provenant uniquement d'un fichier de verrouillage.

FROM node:14

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

# pnpm fetch ne nécessite que lockfile
COPY pnpm-lock.yaml ./

RUN pnpm fetch --prod


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


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

Cela fonctionne aussi bien pour un projet simple que pour un projet monorepo, --offline impose à pnpm à ne pas communiquer avec le registre des paquets car tous les paquets nécessaires seront déjà présentés dans le magasin virtuel.

Tant que le fichier de verrouillage n'est pas modifié, le cache de construction est valide jusqu'à la couche RUN pnpm install -r --offline --prod, qui vous fera gagner beaucoup de temps.

Options

--dev

Seuls les paquets de développement seront récupérés

--prod

Les paquets de développement ne seront pas récupérés