pnpm fetch
将 lockfile 中列出包下载到虚拟存储中,包清单被忽略。
警告
这是一个实验性的命令。 可能会在 CLI 的非主要版本中引入重大更改。
使用场景
此命令专门用于加速构建 docker 映像。 您可能已经阅读了 官方指南 为 Node.js 应用程序编写 Dockerfile,如果您还没有阅读它,您可能想先阅读它。 从该指南中,我们可以学会如何为使用 pnpm 的项目编写优化的 Dockerfile ,这将类似于
1. FROM node:14
2. 3. RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
4. 5. # Files required by pnpm install
6. COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./
7. 8. RUN pnpm install --frozen-lockfile --prod
9. 10. # Bundle app source
11. COPY . .
12. 13. EXPOSE 8080
14. CMD [ "node", "server.js" ]
只要不更改 .npmrc, package.json, pnpm-lock.yaml, .pnpmfile.cjs, Docker 构建缓存仍然有效至 RUN pnpm install --frozen-lockfile --prod,这在构建 Docker 映像时花费了大部分时间 。
但是,对 package.json 的修改可能比我们预期的 频繁得多,因为它不仅包含依赖关系,而且还可能 包含版本号,脚本和其他工具的任意配置。
维护一个构建 monorepo 项目的 Dockerfile 也很困难,它可能看起来像
1. FROM node:14
2. 3. RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
4. 5. # Files required by pnpm install
6. COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./
7. 8. # for each sub-package, we have to add one extra step to copy its manifest
9. # to the right place, as docker have no way to filter out only package.json with
10. # single instruction
11. COPY packages/foo/package.json packages/foo/
12. COPY packages/bar/package.json packages/bar/
13. 14. RUN pnpm install --frozen-lockfile --prod
15. 16. # Bundle app source
17. COPY . .
18. 19. EXPOSE 8080
20. CMD [ "node", "server.js" ]
如您所见,当您添加或删除子包时,必须更新 Dockerfile。
pnpm fetch 将通过提供仅从 lockfile 中下载包至虚拟存储中来完美地解决上述问题。
1. FROM node:14
2. 3. RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
4. 5. # pnpm fetch does require only lockfile
6. COPY pnpm-lock.yaml ./
7. 8. RUN pnpm fetch --prod
9. 10. 11. ADD . ./
12. RUN pnpm install -r --offline --prod
13. 14. 15. EXPOSE 8080
16. CMD [ "node", "server.js" ]
它既适用于简单项目,也适用于 monorepo 项目, --offline 强制 pnpm 不与package registry通信,因为所有需要的包都应该已经存在于虚拟存储中。
只要 lockfile 没有改变,构建缓存一直有效到 RUN pnpm install -r --offline --prod 这个 layer,这将为您节省很多时间。
配置项
--dev
只会获取开发包
--prod
不会获取开发包
