pnpm fetch
从锁定文件将包提取到虚拟存储中,忽略包清单。
使用场景
此命令专门设计用于改进构建 Docker 镜像。
您可能已经阅读了官方指南,了解如何为 Node.js 应用程序编写 Dockerfile,如果您还没有阅读,您可能需要先阅读它。
从该指南中,我们了解到如何为使用 pnpm 的项目编写优化的 Dockerfile,它看起来像
FROM node:14
WORKDIR /path/to/somewhere
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 ./
# If you patched any package, include patches before install too
COPY patches patches
RUN pnpm install --frozen-lockfile --prod
# Bundle app source
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
只要 .npmrc
、package.json
、pnpm-lock.yaml
、.pnpmfile.cjs
没有更改,Docker 构建缓存仍然有效,直到 RUN pnpm install --frozen-lockfile --prod
层,这在构建 Docker 镜像时花费了大部分时间。
但是,package.json
的修改可能比我们预期的要频繁得多,因为它不仅包含依赖项,还可能包含版本号、脚本以及任何其他工具的任意配置。
维护构建单仓库项目的 Dockerfile 也很难,它可能看起来像
FROM node:14
WORKDIR /path/to/somewhere
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 ./
# If you patched any package, include patches before install too
COPY patches patches
# 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" ]
如您所见,当您添加或删除子包时,必须更新 Dockerfile。
pnpm fetch
通过提供使用锁定文件中的信息将包加载到虚拟存储中的功能,完美地解决了上述问题。
FROM node:14
WORKDIR /path/to/somewhere
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# pnpm fetch does require only lockfile
COPY pnpm-lock.yaml ./
# If you patched any package, include patches before running pnpm fetch
COPY patches patches
RUN pnpm fetch --prod
ADD . ./
RUN pnpm install -r --offline --prod
EXPOSE 8080
CMD [ "node", "server.js" ]
它适用于简单项目和单仓库项目,--offline
强制 pnpm 不与包注册表通信,因为所有需要的包都已存在于虚拟存储中。
只要锁定文件没有更改,构建缓存就有效,直到该层,因此 RUN pnpm install -r --offline --prod
将为您节省大量时间。
选项
--dev, -D
仅提取开发包
--prod, -P
不会提取开发包