本文へ移動

バージョンと公開

LernaはパッケージのバージョンのインクリメントとNPMへのパッケージの公開を行うことができ、あらゆるワークフローに対応できる様々なオプションを提供します。

Lernaの動作方法を示すために、このリポジトリを見てみましょう。

実践を通して学習したい場合は、リポジトリをクローンして一緒に進めてください。

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

  • header(Reactコンポーネントのライブラリ)
  • footer(Reactコンポーネントのライブラリ)
  • remixappheaderfooterの両方に依存するRemixフレームワークを使用して記述されたアプリ)

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.jsonファイルでprivateとマークされているすべてのパッケージを除外することに注意してください。

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にプッシュします。次の出力が表示されるはずです。

ターミナル出力
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が公開するパッケージを決定するもう1つの方法は、from-packageを使用することです。Lernaは、リポジトリ内の各パッケージのバージョンと、npmに公開されているそのパッケージのバージョンを比較します。公開バージョンよりも大きいバージョンを持つ各パッケージについて、Lernaはそのパッケージをnpmに公開します。

このモードでは、パッケージがlerna versionでバージョン管理されていることを明示的に要求する必要がないため、独自のバージョン管理スクリプトを持つワークスペースに最適です。

lerna publish from-package
情報

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

バージョン管理戦略

Lernaを使用すると、固定モードまたは独立モードのいずれかのモードを使用してプロジェクトを管理できます。

固定/ロックモード(デフォルト)

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

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

すべてのパッケージのバージョンを自動的に連携させたい場合に使用します。このアプローチの問題の1つは、いずれかのパッケージに大きな変更を加えると、すべてのパッケージのメジャーバージョンが変更されることです。

同期されたバージョン

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に設定します。