メインコンテンツへスキップ
非公式ベータ版翻訳

このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →

レガシーパッケージ管理

注記

2025年9月にリリースされたLerna v9では、2年以上非推奨となっていた lerna bootstraplerna addlerna link コマンドが完全に削除されました。 これらのコマンドをまだ使用している場合は、パッケージマネージャーが長年サポートしている workspaces 機能への移行をお願いします。

以下のガイドでは背景を説明し、移行の必要性と方法を理解するのに役立ちます。

2023年6月のLerna v7.0.0で、デフォルト設定から lerna bootstraplerna addlerna link コマンドを削除しました。その後2年以上を経て、Lerna v9.0.0でこれらのコマンドは完全に削除されました。

このセクションでは、これらを使用しないように移行し、パッケージマネージャーの workspaces を活用して環境を最新化する最適な方法を説明します。この変更の背景となる「なぜ」の完全な文脈については、下記の背景を参照してください。

重要な考え方の転換は、依存関係のインストールやリンクがLernaの責務ではなく、パッケージマネージャーの方がそのタスクに適していると認識することです。

これを実現する方法は、パッケージマネージャーの workspaces 機能を使用することです。各マネージャーのドキュメントはこちらを参照してください:

workspaces を使用すると、パッケージマネージャーは lerna bootstraplerna link が以前行っていたのと全く同じリンク処理を実行しますが、これは install コマンドに組み込まれています。インストール後に追加のコマンドを実行する必要はありません(上記のパッケージマネージャードキュメントに従って workspaces を設定している場合)。

lerna add の置き換えについても同様です。依存関係の追加や削除はパッケージマネージャーが既に行える機能であり、workspaces がファーストクラスユースケースであるため、適切な install コマンドを実行して特定のパッケージ/ワークスペースに依存関係を追加すれば、関連するローカルリンクは自動的に行われます。

より具体的な比較や移行前後の使用例については以下を参照してください。

機能の概要

lerna bootstrapnpm install(または yarn/pnpm)の代わりに使用され、外部パッケージのインストールとワークスペース内の内部パッケージのリンクを行いました。lerna link はこの操作の内部リンクステップのみを実行します。

このコマンドはどこで使われていましたか?

ワークスペースのルートにある package.json の "scripts" プロパティ内にある可能性が高いです。CIパイプラインも確認してください。npm install(または yarn/pnpm)の代わりに lerna bootstrap を呼び出している可能性があります。

どのように置き換えればよいですか?

lerna bootstrapnpm install(または yarn/pnpm)に置き換えてください。ワークフロー内で既にパッケージマネージャーのインストールコマンドを実行している場合、以前 lerna bootstrap を呼び出していた箇所は削除できます。lerna link は単純に削除可能です。リンク処理は npm install 中にパッケージマネージャーが処理するようになったためです。

情報

yarn を使用していてバイナリリンクに依存している場合、ワークスペースに切り替えた後に一度 node_modules フォルダを削除する必要があるかもしれません。詳細はこのyarnのIssueを参照してください。

lerna add の使用を置き換える

機能の概要

lerna add はワークスペース内のパッケージに依存関係を追加するために使用されていました。このコマンドは各パッケージのpackage.jsonファイルを更新して依存関係を追加します。

このコマンドはどこで使われていましたか?

通常は手動で実行されますが、ワークスペースのルートにあるpackage.jsonのスクリプト内でlerna addが使われている可能性があります。

どのように置き換えればよいですか?

lerna add は基本的にnpm install(またはyarn/pnpm)のバリエーションで置き換えられます。lerna add の最も一般的な使用例は、ワークスペース内の単一パッケージに依存関係を追加する場合です。次のようなコマンド:

lerna add <dependency> --scope <package>

は直接次のように置き換えられます:

npm install <dependency> -w <package>

-wフラグはnpmに、Lernaの--scopeオプションと同様に、<package>で指定されたワークスペースパッケージのみに依存関係をインストールするよう指示します。

複数のパッケージに依存関係を追加する必要がある場合は、-wオプションを複数回使用できます:

npm install <dependency> -w <package1> -w <package2>

カスタムホイスティング

Lernaのレガシーなbootstrapコマンドの利点の1つは、依存関係をリポジトリのルートにホイスティングするかどうか、あるいはネストされた場所に残すかについて制御できる点でした。

そのため、パッケージのホイスティングに関してカスタム設定を行っている場合、lerna bootstrapからの移行に懸念があるかもしれません。

各種パッケージマネージャーをテストした経験から、最新のyarn(v3以降)がホイスティング制御に関して最も柔軟性を提供することがわかっています:

https://yarnpkg.com/configuration/yarnrc/#nmHoistingLimits

これまでに、ホイスティングの複雑さに関わらず、最新のyarnに変換できないlerna bootstrapを使用したリポジトリは見つかっていません。該当する場合はぜひお試しください。

高度なホイスティングに関する懸念がなくlerna bootstrapを使用していた場合は、どのパッケージマネージャーでも問題ありません。すべて堅牢なworkspaces実装を提供しています。

レガシーパッケージ管理コマンドの一時的なポリフィル

v7やv8でレガシーパッケージ管理コマンド(lerna bootstraplerna addlerna link)が必要な場合、lernaパッケージと同じバージョンの@lerna/legacy-package-managementパッケージをインストールすることで、これらのコマンドを従来の実装でポリフィルできました。

これはあくまで一時的な措置であり、このパッケージは導入直後からメンテナンスモードのみであったことに注意してください(lerna bootstraplerna addlerna linkに関する新機能は考慮されませんでした)が、重大な修正やセキュリティ更新はマージされました。

@lerna/legacy-package-managementのすべてのサポートはv9で削除されました。これは一時的なポリフィルとして導入されてから2年以上経過しており、移行のための十分な時間が与えられていました。

背景

LernaはJavaScriptエコシステムにおける最初のモノレポ/ワークスペースツールです。2015年/2016年に作成された当時、エコシステムはまったく異なる様相を呈しており、単一リポジトリ内で複数のパッケージを扱う(「ワークスペース」)組み込み機能は存在しませんでした。lerna bootstraplerna addlerna linkといったコマンドはすべて、他に選択肢がなかったためLernaプロジェクトの重要な部分でした。

しかし、何年も前から、私たちがよく知るパッケージマネージャー(npmyarnpnpm)はすべてワークスペースの概念をファーストクラスユースケースとして完全にサポートしています。

これらはローカルパッケージの追加、削除、リンクをカバーする実戦でテストされた実装を備えており、サードパーティの依存関係と自然な方法で組み合わせることができます。

このような背景から、Lernaのリードメンテナーとして在任した最後の数年間、Danielはユーザーに対し、Lernaのレガシーパッケージ管理コマンドの使用を強く見直し、代わりに選択したパッケージマネージャーを活用して、その得意分野を最大限に活かすよう促してきました。

私たちはこの状況を以前から認識していましたが、2022年にプロジェクトの新たな管理者として、現状を深く理解せずにいきなり機能削除に踏み切ることは避けたいと考えていました。積極的なメンテナンスを続けてきた現在、Lernaのレガシーパッケージ管理コマンドは廃止すべきというDanielらとの見解に完全に同意しています。

パッケージマネージャーにネイティブで優れた代替手段が存在するこれらのレガシー機能を削除したことで、私たちとLernaコミュニティは、バージョニングやパブリッシングなどLernaの真価を発揮する領域(これらに限定されません)にリソースを集中させ、これらを可能な限り最高の状態に磨き上げることに専念できるようになりました!

情報

この背景についてはLerna v7 ディスカッションでも説明されています。具体的な懸念がある場合はぜひ参加し、可能な限り詳細な情報を提供してください!