バージョンと公開
LernaはパッケージのバージョンのインクリメントとNPMへのパッケージの公開を行うことができ、あらゆるワークフローに対応できる様々なオプションを提供します。
Lernaの動作方法を示すために、このリポジトリを見てみましょう。
実践を通して学習したい場合は、リポジトリをクローンして一緒に進めてください。
このリポジトリには3つのパッケージまたはプロジェクトが含まれています。
header
(Reactコンポーネントのライブラリ)footer
(Reactコンポーネントのライブラリ)remixapp
(header
とfooter
の両方に依存するRemixフレームワークを使用して記述されたアプリ)
header
とfooter
パッケージを公開します。
プロジェクトの一部のみを公開するのが一般的です。一部のプロジェクトはプライベートにできます(例:テストのみに使用)、一部はデモアプリにできます。このリポジトリでは、
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
)を追加し、コミットとタグをリモートリポジトリにプッシュします。
{
"name": "footer",
"version": "1.0.1",
"main": "dist/index.js",
...
}
上記の操作では、パッケージをNPMリポジトリにプッシュしません。Lernaに公開プロセスも処理させたい場合は、代わりにlerna publish
を使用できます。
Lernaは、lerna.json
のversion
プロパティを使用して、現在使用されているバージョンを決定します。
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.json
でnpmClient
がnpm
以外に設定されている場合でも、適切な公開設定を.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.json
のversion
キーをindependent
に設定します。