pnpm、npm レジストリサーバー pnpr

482文字
2分
編集

pnpm は npm レジストリプロトコル互換のサーバー pnpr を pnpm モノレポ内で実験公開した。Rust 製で、pnpm・npm・yarn など npm 互換クライアントから利用できる。上流レジストリ(既定は registry.npmjs.org)をプロキシし、認証とアクセス制御を自前で持つ構成で、JavaScript エコシステムの Verdaccio に近い位置づけである。pnpr は pnpm CLI とは別製品で、CLI 単体でも pnpr 単体でも使えるが、pnpm は依存解決を pnpr にオフロードして install を速くできる。

現時点では実験段階で、挙動・設定・API はリリース間で変わる可能性がある。

用途は次のとおり。

  • プライベートレジストリ: 組織の非公開パッケージをホストし、パッケージごとにアクセスと publish ルールを設定する
  • キャッシュプロキシ: 上流レジストリをミラーし、install を高速化し上流障害時の耐性を高める
  • install 高速化: サーバー側で依存グラフを解決し、pnpm に完成した lockfile を渡す

install 高速化では、lockfile がない、または依存が増えた cold install 時に効く。クライアント側の逐次 packument 取得(グラフの深さ × レジストリ往復)を、pnpr 近傍の低レイテンシ解決と共有キャッシュで 1 往復の lockfile 応答に置き換える。tarball は従来どおりクライアントがレジストリから並列取得する。

有効化は pnpm-workspace.yaml に pnpr サーバーの URL を書く。

yaml
pnprServer: http://127.0.0.1:7677

pnpm は pnpm install 中に GET /-/pnpr でプロトコル互換を確認し、POST /-/pnpr/v0/resolve で依存・レジストリ設定・上流認証・ポリシー・既存 lockfile を送って解決する。resolver の POST には pnpr の Authorization ヘッダーが必要で、同一 pnpr がレジストリ兼用なら pnpm login --registry <url> で書き込まれたトークンを resolver リクエストにも使う。

ライセンスは PolyForm Shield License 1.0.0 で、ソース利用可能だが OSS ではない。pnpr と競合する製品の提供を除き、実行・改変・セルフホストは可能。pnpm モノレポで MIT 以外となる唯一の部分である。

#参考文献