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 améliorer la construction d'une image Docker.
You may have read the official guide to writing a Dockerfile for a Node.js app, if you haven't read it yet, you may want to read it first.
À partir de ce guide, nous apprenons à écrire un Dockerfile optimisé pour les projets utilisant pnpm, qui ressemble à
FROM node:14
WORKDIR /chemin/vers/quelque part
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 ./
# Si vous avez corrigé un paquet, incluez également les correctifs avant l'installation
COPY patches patches
RUN pnpm install --frozen-lockfile --prod
# Bundle app source
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
WORKDIR /chemin/vers/quelque part
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 ./
# Si vous avez corrigé un paquet, incluez également les correctifs avant l'installation
COPY patches patches
# pour chaque sous-paquet, nous devons ajouter une étape supplémentaire pour copier
# son manifeste au bon endroit, car docker n'a aucun moyen de filtrer uniquement
# le package.json avec une seule instruction
COPY packages/foo/backage.json packages/foo/
COPY packages/bar/backage.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ésout parfaitement le problème en offrant la possibilité de récupérer des modules dans le stockage virtuel en utilisant uniquement les informations d'un fichier verrouillé.
FROM node:14
WORKDIR /chemin/vers/quelque part
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# pnpm fetch n'a besoin que du lockfile
COPY pnpm-lock.yaml ./
# Si vous avez apporté des correctifs à un paquet, incluez les correctifs avant de lancer pnpm fetch
COPY patches patches
RUN pnpm fetch --prod
ADD . ./
RUN pnpm install -r --offline --prod
EXPOSE 8080
CMD [ "node", "server.js" ]
Cela fonctionne pour les projets simples, ainsi que les monorepo, --offline
force pnpm à ne pas communiquer avec le registre de module car tous les modules nécessaires sont déjà présents dans le stockage virtuel.
Tant que le fichier verrouillé n'est pas changé, le cache de compilation est valide, donc RUN pnpm install -r --offline --prod
, va vous faire gagnez énormément de temps.
Options
--dev, -D
Seuls les paquets de développement seront récupérés
--prod, -P
Les paquets de développement ne seront pas récupérés