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

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

バージョン管理と公開

Lernaはパッケージのバージョン更新やNPMへの公開を可能にし、あらゆるワークフローに対応できるよう多様なオプションを提供します。

Lernaの動作を理解するために、このリポジトリを参照します。

実践しながら学ぶ方が効果的な場合は、リポジトリをクローンして手順を追ってください。

このリポジトリには3つのパッケージ(プロジェクト)が含まれています:

  • header(Reactコンポーネントライブラリ)

  • footer(Reactコンポーネントライブラリ)

  • remixapp(Remixフレームワークで開発されたアプリで、headerfooterに依存)

ここではheaderfooterパッケージを公開します。

プロジェクトの一部のみを公開するのは一般的です。テスト専用などのプライベートプロジェクトやデモアプリも存在します。このリポジトリでは、remixappはソース非公開という意味での「プライベート」ではなく、NPMに公開されないように"private": true設定を使用しているだけです。

バージョン管理

Lernaのversionコマンドを使用すると、パッケージのバージョン番号を更新し、変更をコミット・タグ付けできます。

lerna version --no-private

以下の出力が表示されます:

lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) (Use arrow keys)
❯ Patch (1.0.1)
Minor (1.1.0)
Major (2.0.0)
Prepatch (1.0.1-alpha.0)
Preminor (1.1.0-alpha.0)
Premajor (2.0.0-alpha.0)
Custom Prerelease
Custom Version
情報

--no-privateを指定すると、package.jsonprivateとマークされた全パッケージが除外されます。

Lernaは現在のパッケージを検出し、現行バージョンを識別後、次期バージョンの候補を提示します。lerna version 1.0.0のようにsemverバンプを直接指定することも可能です。詳細はバージョン管理ドキュメントをご覧ください。バージョン確定後、Lernaはpackage.jsonを更新し、変更をコミット、対応するバージョンタグ(例: v1.0.0)を追加し、コミットとタグをリモートリポジトリにプッシュします。

packages/footer/package.json
{
"name": "footer",
"version": "1.0.1",
"main": "dist/index.js",
...
}

上記操作ではNPMリポジトリへのパッケージ公開は行われません。公開プロセスもLernaに任せたい場合は、代わりにlerna publishを使用します。

情報

Lernaは現在のバージョン判定にlerna.jsonversionプロパティを使用します

NPMへの公開

以下のコマンドを実行すると:

lerna publish --no-private

Lernaはバージョン更新ワークフロー(lerna versionと同様)を実行後、追加でパッケージをNPMにプッシュします。以下の出力が表示されます:

Terminal Output
lerna notice cli v5.1.2
lerna info current version 1.0.0
lerna info Assuming all packages changed
? Select a new version (currently 1.0.0) Patch (1.0.1)

Changes:
- footer: 1.0.0 => 1.0.1
- header: 1.0.0 => 1.0.1

? Are you sure you want to publish these packages? Yes
lerna info execute Skipping releases
lerna info git Pushing tags...
lerna info publish Publishing packages to npm...
...
lerna success published header 1.0.1
...
lerna success published footer 1.0.1
...
Successfully published:
- footer@1.0.1
- header@1.0.1
lerna success published 2 packages

from-package

Lernaが公開対象パッケージを判定する別の方法がfrom-packageです。リポジトリ内の全パッケージバージョンとnpmに公開済みのバージョンを比較し、公開済みバージョンより新しいパッケージをnpmに公開します。

このモードではlerna versionによるバージョン管理が必須ではないため、独自のバージョニングスクリプトを使用するワークスペースに最適です。

lerna publish from-package
情報

Lernaはパッケージ公開に_常に_npmを使用します。npm以外のパッケージマネージャーを使用する場合、lerna.jsonnpmClientnpm以外に設定していても、.npmrcに適切な公開設定を追加する必要があります。

バージョン管理戦略

LernaではFixed(固定)またはIndependent(独立)の2つのモードでプロジェクトを管理できます。

Fixed/Lockedモード(デフォルト)

固定モードのLernaプロジェクトは単一のバージョンラインで動作します。バージョンはプロジェクトルートのlerna.jsonファイル内のversionキーで管理されます。lerna publishを実行すると、前回のリリース以降に更新があったパッケージは、リリースする新しいバージョンに更新されます。これは、必要な場合のみパッケージの新しいバージョンを公開することを意味します。

注記: メジャーバージョンがゼロの場合、すべての更新は破壊的変更とみなされます。そのため、メジャーバージョンゼロの状態でlerna publishを実行し、プレリリース以外のバージョン番号を選択すると、前回のリリース以降に変更がなくてもすべてのパッケージの新しいバージョンが公開されます。

すべてのパッケージバージョンを自動的に連動させたい場合にこのモードを使用します。このアプローチの問題点は、いずれかのパッケージでメジャー変更が発生すると、すべてのパッケージのメジャーバージョンが上がってしまうことです。

バージョンの同期

Lernaは前回リリース以降に変更があったパッケージのみをバージョニングして公開するため、時間の経過とともにパッケージバージョンがずれる可能性があります。これを防ぐには、lerna version--force-publishオプションを使用します。これにより、前回リリースからの変更の有無にかかわらず、Lernaは常にすべてのパッケージをバージョニングします。その後lerna publish from-gitですべてのパッケージがレジストリに公開され、すべてのパッケージバージョンがlerna.jsonのバージョンと同期された状態を維持できます。

独立モード

npx lerna init --independent

独立モードのLernaプロジェクトでは、メンテナーが各パッケージのバージョンを相互に独立して更新できます。公開のたびに、変更のあった各パッケージについて、パッチ/マイナー/メジャー/カスタム変更のいずれかを指定するプロンプトが表示されます。

独立モードでは各パッケージのバージョン更新をより細かく制御でき、コンポーネント群の管理に適しています。semantic-releaseのようなツールと組み合わせることで、このモードの運用負荷を軽減できます(atlassian/lerna-semantic-releaseで既に取り組みが進んでいます)。

独立モードで動作させるには、lerna.jsonversionキーにindependentを設定します。