Saltar al contenido principal
Version: 6.x

pnpm fetch

Descargar paquetes indicados en un lockfile a la tienda virtual, el manifiesto de paquetes es ignorado.

danger

Este es un comando experimental. Es posible que se introduzcan incompatibilidades en posteriores versiones no principales de la CLI.

Escenario de uso​

Este comando está específicamente diseñado para acelerar la construcción de una imagen docker.

Puedes haber leído la guía oficial para escribir un Dockerfile para una aplicación Node, si aún no la has leído, tal vez quieras leerla primero.

De esa guía, aprendemos a escribir un Dockerfile optimizado para proyectos usando pnpm, que se verá como

FROM node:14

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

# Archivos requeridos por pnpm install
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./

RUN pnpm install --frozen-lockfile --prod

# Empaqueta el código fuente de la app
COPY . .

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

Mientras no haya ningún cambio en .npmrc, package.json, pnpm-lock.yaml, .pnpmfile. js, la caché de construcción de docker sigue siendo válido hasta la capa de RUN pnpm install --frozen-lockfile --prod, la cual cuesta la mayor parte del tiempo de construcción de una imagen docker.

Sin embargo, las modificaciones al package.json ocurren con mayor frecuencia de lo que esperábamos, porque no solo contiene dependencias, sino que también puede contener el número de versión, scripts y configuración arbitraria para cualquier otra herramienta.

También es difícil mantener un Dockerfile que construye un proyecto monorepo, puede parecerse a algo tal que:

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" ]

Como puede ver, el archivo Dockerfile tiene que ser actualizado cuando agregue o elimine sub-paquetes.

pnpm fetch resolverá perfectamente el problema anterior proporcionando la habilidad de descargar el paquete al almacén virtual únicamente con la información de un lockfile.

FROM node:14

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

# pnpm fetch solo requiere un lockfile
COPY pnpm-lock.yaml ./

RUN pnpm fetch --prod


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


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

Funciona tanto para un proyecto simple como para un proyecto monorepo, --offline fuerza a pnpm a no comunicarse con el registro de paquetes ya que todos los paquetes necesarios deberían estar (descargados) en la tienda virtual.

Mientras el lockfile no se cambie, la caché de compilación es válida hasta la capa RUN pnpm install -r --offline --prod, lo cual te ahorrará mucho tiempo.

Options​

--dev​

Sólo se descargarán los paquetes de desarrollo

--prod​

Los paquetes de desarrollo no se descargarán