跳至主要內容
版本:9.x

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

只要不變更 .npmrcpackage.jsonpnpm-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

不會擷取開發套件