メインコンテンツまでスキップ
Version: 6.x

pnpm fetch

パッケージマニフェストを無視して、ロックファイルから取得したパッケージを仮想ストアに記録します。

danger

これは実験的なコマンドです。 メジャーバージョン未満のCLIのバージョンアップで破壊的な変更が導入される可能性があります。

使用シナリオ

このコマンドは、特に docker イメージのビルドを効率化するために設計されました。

Node.jsアプリケーションのDockerfileの書き方に関する公式ガイドを読んだことがなければ、先に読んでおいたほうがいいでしょう。

私たちが公式ガイドを参考にして学んだ、pnpmを使用するプロジェクトに最適化したDockerfileは次のとおりです。

FROM node:14

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 ./

RUN pnpm install --frozen-lockfile --prod

# Bundle app source
COPY . .

EXPOSE 8080
CMD [ "node", "server.js" ]

.npmrcpackage.jsonpnpm-lock.yaml.pnpmfile.cjsのいずれかを変更しない限り、RUN pnpm install --frozen-lock-file --prodのレイヤーに関するビルドキャッシュは常に有効です。これは、dockerイメージをビルドするとき、最も時間のかかるレイヤーです。

しかし、package.jsonには依存関係以外にバージョン番号やスクリプト、さまざまなツールの設定情報などが含まれるので、私たちが意図したよりずっと頻繁に変更されるかもしれません。

また、モノリポのプロジェクトをビルドするDockerfileを保守するのは大変です。例えば次のようになっているでしょう。

FROM node:14

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 ./

# 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

RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm

# pnpm fetch does require only lockfile
COPY pnpm-lock.yaml ./

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のレイヤーに関するビルドキャッシュは常に有効です。大幅に時間を節約できるでしょう。

Options

--dev

開発パッケージだけを取得します。

--prod

開発パッケージを取得しません。