レガシーパッケージ管理
lerna v7以降でのlerna bootstrap
、lerna add
、およびlerna link
からの移行
lerna v7.0.0では、デフォルトでlernaのlerna bootstrap
、lerna add
、およびlerna link
コマンドを削除しました。
このセクションでは、これらのコマンドの使用から移行し、パッケージマネージャーのworkspaces
を使用してセットアップを最新化するための最適な方法について説明します。なぜこれが必要なのかについての完全なコンテキストについては、下記の背景を参照してください。
重要な考え方の転換は、lernaがリポジトリ内の依存関係のインストールとリンクを担当するのではなく、パッケージマネージャーの方がそのタスクに適していることを認識することです。
これを実現する方法は、パッケージマネージャーのworkspaces
機能を使用することです。それぞれのドキュメントについては、こちらを参照してください。
npm
(https://docs.npmjs.com/cli/using-npm/workspaces)yarn
(https://yarnpkg.com/features/workspaces)pnpm
(https://pnpm.dokyumento.jp/workspaces)
workspaces
を使用すると、パッケージマネージャーは、lerna bootstrap
とlerna link
が以前行っていたものとまったく同じリンクを、install
コマンドに組み込まれた形で実行します。インストールを実行した後に追加のコマンドは必要ありません(上記のパッケージマネージャーのドキュメントに従ってworkspaces
が構成されている場合)。
lerna add
の置き換えについても同様です。依存関係の追加と削除は、パッケージマネージャーがすでに行っていることであり、workspaces
が最優先のユースケースであるため、適切なinstall
コマンドを実行して特定のパッケージ/ワークスペースに依存関係を追加できます。この場合も、関連するローカルリンクがすべて自動的に行われます。
より具体的な比較と、前後の使用法については、下記を参照してください。
lerna bootstrap
/lerna link
の使用法の置き換え
何をするのですか?
lerna bootstrap
は、npm install
(またはyarn
/pnpm
)の代わりに使用されていました。これは、すべての外部パッケージをインストールし、ワークスペース内のすべての内部パッケージをリンクしていました。lerna link
は、この操作の内部リンク手順のみを実行していました。
どこにありますか?
これは、ワークスペースのルートにあるpackage.json
の「scripts」プロパティにある可能性が最も高いです。CIパイプラインも確認してください。これらは、npm install
(またはyarn
/pnpm
)の代わりにlerna bootstrap
を呼び出している可能性があります。
何で置き換えますか?
lerna bootstrap
をnpm 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 bootstrap
、lerna add
、およびlerna link
のレガシーパッケージ管理コマンドが必要な場合は、lerna
パッケージと同じバージョンの@lerna/legacy-package-management
パッケージをインストールできます。これにより、コマンドが古い実装でポリフィルされます。
これは単なる応急処置であり、この新しいパッケージはメンテナンスモードのみと見なすことができることに注意することが重要です。レガシーパッケージ管理の問題(lerna bootstrap
、lerna add
、およびlerna link
など)については、新しい機能は検討されず、重要なパッチとセキュリティアップデートの統合のみが検討されます。
このような状況に陥った場合は、lernaリポジトリで課題を開いて、直面している困難について詳しく学び、前進する方法を見つけるお手伝いをさせてください。
https://github.com/lerna/lerna/issues/new/choose
背景
Lernaは、JavaScriptエコシステムにおけるオリジナルのモノレポ/ワークスペースツールです。2015/2016年に作成されたとき、エコシステムはまったく異なって見え、単一のリポジトリ(「ワークスペース」)で複数のパッケージを扱うための組み込み機能はありませんでした。lerna bootstrap
、lerna add
、およびlerna link
などのコマンドは、他のオプションがなかったため、lernaプロジェクトの重要な部分でした。
ただし、事実として、長年にわたり、私たちが知っていて愛するパッケージマネージャー(npm
、yarn
、およびpnpm
)はすべて、ワークスペースの概念を最優先のユースケースとして完全にサポートしています。
ローカルパッケージの追加、削除、リンク、およびそれらをサードパーティの依存関係と自然に組み合わせるための、実戦でテスト済みの実装があります。
これが、lernaのリードメンテナーとしての最後の数年間、Danielがlernaのレガシーなパッケージ管理コマンドの使用を強く再考し、代わりに選択したパッケージマネージャーを活用して最適な処理を行うよう促していた理由です。
私たちは遠くからこの背景を知っていましたが、2022年にプロジェクトの新しい管理者として、まず現実を間近で把握する時間を取らずに、すぐに機能の削除を始めることは望みませんでした。しばらく積極的にメンテナンスを続けてきた今、Danielや他の人々と完全に同意し、lernaのレガシーなパッケージ管理コマンドは廃止する必要があると考えています。
パッケージマネージャーにネイティブでより良い代替手段があるこれらのレガシーな部分を削除することで、私たちとlernaコミュニティの残りのメンバーは、lernaに固有の価値のあるもの(バージョン管理や公開など、これらに限定されない)に注力し、それらを可能な限り最高の状態にすることに集中できるようになります!
この同じ背景は、Lerna v7ディスカッションで説明されています。特定の懸念がある場合は、そちらに参加してできるだけ多くの情報を提供してください!