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
不會擷取開發套件