メインコンテンツへスキップ

レガシーパッケージ管理

lerna v7.0.0では、デフォルトでlernaのlerna bootstraplerna add、およびlerna linkコマンドを削除しました。

このセクションでは、これらのコマンドの使用から移行し、パッケージマネージャーのworkspacesを使用してセットアップを最新化するための最適な方法について説明します。なぜこれが必要なのかについての完全なコンテキストについては、下記の背景を参照してください。

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

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

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

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

より具体的な比較と、前後の使用法については、下記を参照してください。

何をするのですか?

lerna bootstrapは、npm 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の課題を参照してください。

lerna addの使用法の置き換え

何をするのですか?

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

どこにありますか?

通常は手動で呼び出されますが、lerna addは、ワークスペースのルートにあるpackage.jsonのいくつかのスクリプトにある可能性があります。

何で置き換えますか?

lerna addは、ほとんどの場合、npm install(またはyarn/pnpm)のバリエーションで置き換えることができます。lerna addの最も一般的なユースケースは、ワークスペース内の単一のパッケージに単一の依存関係を追加することでした。このコマンドは次のようになります。

lerna add <dependency> --scope <package>

そして、直接次のように置き換えることができます。

npm install <dependency> -w <package>

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

複数のパッケージに依存関係を追加する必要がある場合は、-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でlerna bootstraplerna add、およびlerna linkのレガシーパッケージ管理コマンドが必要な場合は、lernaパッケージと同じバージョンの@lerna/legacy-package-managementパッケージをインストールできます。これにより、コマンドが古い実装でポリフィルされます。

これは単なる応急処置であり、この新しいパッケージはメンテナンスモードのみと見なすことができることに注意することが重要です。レガシーパッケージ管理の問題(lerna bootstraplerna add、およびlerna linkなど)については、新しい機能は検討されず、重要なパッチとセキュリティアップデートの統合のみが検討されます。

このような状況に陥った場合は、lernaリポジトリで課題を開いて、直面している困難について詳しく学び、前進する方法を見つけるお手伝いをさせてください。

https://github.com/lerna/lerna/issues/new/choose

背景

Lernaは、JavaScriptエコシステムにおけるオリジナルのモノレポ/ワークスペースツールです。2015/2016年に作成されたとき、エコシステムはまったく異なって見え、単一のリポジトリ(「ワークスペース」)で複数のパッケージを扱うための組み込み機能はありませんでした。lerna bootstraplerna add、およびlerna linkなどのコマンドは、他のオプションがなかったため、lernaプロジェクトの重要な部分でした。

ただし、事実として、長年にわたり、私たちが知っていて愛するパッケージマネージャー(npmyarn、およびpnpm)はすべて、ワークスペースの概念を最優先のユースケースとして完全にサポートしています。

ローカルパッケージの追加、削除、リンク、およびそれらをサードパーティの依存関係と自然に組み合わせるための、実戦でテスト済みの実装があります。

これが、lernaのリードメンテナーとしての最後の数年間、Danielがlernaのレガシーなパッケージ管理コマンドの使用を強く再考し、代わりに選択したパッケージマネージャーを活用して最適な処理を行うよう促していた理由です。

私たちは遠くからこの背景を知っていましたが、2022年にプロジェクトの新しい管理者として、まず現実を間近で把握する時間を取らずに、すぐに機能の削除を始めることは望みませんでした。しばらく積極的にメンテナンスを続けてきた今、Danielや他の人々と完全に同意し、lernaのレガシーなパッケージ管理コマンドは廃止する必要があると考えています。

パッケージマネージャーにネイティブでより良い代替手段があるこれらのレガシーな部分を削除することで、私たちとlernaコミュニティの残りのメンバーは、lernaに固有の価値のあるもの(バージョン管理や公開など、これらに限定されない)に注力し、それらを可能な限り最高の状態にすることに集中できるようになります!

情報

この同じ背景は、Lerna v7ディスカッションで説明されています。特定の懸念がある場合は、そちらに参加してできるだけ多くの情報を提供してください!