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
開発パッケージは取得されません