パッケージマネージャーpnpmのバージョン12.pnpm pipelineも追加されている。
1回のインストールでJavaScript・Rust・Pythonの依存関係を取得
インストールにはpnpm installを使う。pnpmの公式Xアカウントでは、複数言語を使うリポジトリで、npmパッケージ、Rustのパッケージであるクレート、Pythonパッケージを並行してダウンロードできると紹介している。
experimental: pnpm v12.
— pnpm (@pnpmjs) September 11, 20264 can install Rust and Python dependencies too. So in a multi-language repository you get js packages, crates, and pypi packages downloaded concurrently.https:// t. co/ L3laZrA832
RustとPythonへの対応はデフォルトで無効になっており、利用する言語の設定をpnpm-workspace.で有効にする。両方を利用する場合の設定は次のとおり。
cargo:
enabled: true
python:
enabled: true
依存関係を追加する際は、クレート名にcrate:、Pythonパッケージ名にpypi:を付ける。たとえば、Rustのserdeはpnpm add crate:serde、Pythonのhttpxはpnpm add pypi:httpxで追加できる。
インストールをまとめても、依存関係の記録には各言語のファイルを使う。Rustの依存関係はCargo.とCargo.で管理し、pnpm-lock.とは分けて保持する。pnpmはソースを取得し、RustのビルドツールCargoから参照できるように.cargo/を設定する。その後のコンパイルはcargo buildで行う。
Pythonの依存関係については、pnpmがpyproject.を読み込み、解決した結果をpylock.に記録する。プロジェクトごとに仮想環境.venvを用意し、pnpm runやpnpm execからその環境のコマンドを呼び出せる。pnpm自身が作成したものではない既存の.venvは変更しない。
パッケージの保存には共通のストアを使い、一度取得したファイルを別のプロジェクトでも再利用する。RustとPythonでも、ロックファイルを変更せずにインストールする--frozen-lockfileや、ネットワークを使わない--offlineに対応する。
ビルドやテストをまとめて実行するpnpm pipeline
新しい実験的コマンドpnpm pipelineは、ロックファイルを変更せずに依存関係をインストールした後、ワークスペース内のタスクを実行する。対象は、Gitの基準リビジョンからの変更で影響を受けたプロジェクトと、それらに依存するプロジェクトとなる。
実行するタスクの組み合わせは、pnpm-workspace.のpipelinesに名前を付けて定義する。たとえばdefault: [build, test]と設定すると、pnpm pipelineでbuildとtestを実行できる。別の名前で定義した組み合わせは、pnpm pipeline <名前>で指定する。タスクの実行順序は、tasksのdependsOnで指定した依存関係で決まる。
各タスクに出力ファイルを示すoutputsを宣言すると、結果をキャッシュして再利用できる。ファイルを生成しないテストなども、outputs: []を指定すればキャッシュの対象になる。キャッシュが使える場合はタスクを再実行せず、出力ファイルを復元し、保存したログを再表示する。
また、タスクが失敗しても処理を続け、1回の実行で複数の失敗を報告する。pnpm pipeline --dry-runでは、インストールやタスク実行を行わずにタスク間の依存関係を確認できる。
対応プラットフォームを追加、更新時のキャッシュ処理も変更
pnpm 12.
レジストリから取得するパッケージのメタデータは、URLのパスやスキームが異なるレジストリごとに分けて保存するようになった。これにより、別のレジストリのバージョン情報やダウンロード先URLが誤って使われるのを防ぐ。更新後の初回インストールではメタデータを再取得するが、パッケージストアは維持される。
キャッシュ関連コマンドでは、pnpm cache viewがレジストリの完全なURLを表示するようになった。pnpm cache list-registriesやpnpm cache listの出力からディレクトリ名を解析するスクリプトは、変更に合わせた更新が必要になる。
後続の12.nodeLinker: hoistedを使う環境で、再インストール時に既存のパッケージを取り込み直す問題にも対処している。