lernaの概要を理解する

以下のlernaの公式ページを読んでいこうと思います。

lerna.js.org

lernaとは

  • 複数パッケージで構成されるJavaScriptプロジェクトを管理するためのツール
  • gitとnpmを使用したマルチパッケージリポジトリの管理に関するワークフローを最適化するツール

背景

問題認識

  • 大規模なコードベースの場合個別にバージョン管理されたパッケージに分割するのが、コード共有に役立つ
  • 多くのリポジトリ間で変更を加えるのは面倒で追跡が難しい
  • リポジトリ間のテストは複雑になる

解決策

  • コードベースをマルチパッケージリポジトリに編成する
  • Babel, React, Angular, Ember, Meteor, Jestが、全てのパッケージを単一のリポジトリ内で開発する

Vuetifyもlerna使ってるよね。Vueは使ってなさそう。この領域のデファクトなのかな。

具体例を確認するには、JestとVuetifyのリポジトリを参考にしてみようかな。

jest jestもfacebookのプロダクトだったのか。 github.com

vuetify github.com

Monorepo(モノレポ)

公式ページには特に記載なかったが、一つのリポジトリで複数パッケージを管理することをモノレポと呼ぶらしい。

qiita.com

Getting Started

# 私の環境ではsudoつけないとエラーになった
$ sudo npm install -g lerna 

$ git init lerna-repo && cd lerna-repo
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint: 
hint:   git config --global init.defaultBranch <name>
hint: 
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint: 
hint:   git branch -m <name>
Initialized empty Git repository in /home/xxxx/git/lerna-repo/.git/

$ lerna init
lerna notice cli v4.0.0
lerna info Creating package.json
lerna info Creating lerna.json
lerna info Creating packages directory
lerna success Initialized Lerna files

$ tree .
.
├── lerna.json
├── package.json
└── packages  // ここに、複数のパッケージが配置されるのかな

1 directory, 2 files

vuetify/packages at master · vuetifyjs/vuetify · GitHub

Vuetifyだとpackage以下に以下3つのディレクトリがあるので、この3つが個別のパッケージということか。

  • api-generator
  • docs
  • vuetify

確かに、上記ディレクトリそれぞれにpackage.jsonが存在するみたいだ。

コマンド

簡単なコマンド紹介。詳細は以下のREADME参照

github.com

ここに列挙されているのが、よく使われるコマンドってことかな。

lerna init

新しいlernaのレポジトリの作成。既存レポジトリを現在バージョンのlernaへアップグレード

lerna bootstrap

現在のLernaリポジトリでパッケージをブートストラップします。すべての依存関係をインストールし、相互依存関係をリンクします。

これ、複数あるパッケージ間の相互依存関係の話かな。あとで実験してみよう。

lerna import

ローカルパスのパッケージを/packages/<directory-name>にコミット履歴と一緒にインポートする。

これは、既存パッケージからlerna構成に移行するときに使うもんぽいな。

lerna publish

パッケージの新しいリリースを作成する。

npmにもpublishがある。lernaは複数のパッケージをまとめて管理なので、まとめてpublishすることができる、ということだろう。

qiita.com 自分でも簡単なライブラリをpublishしてみたいな。

lerna changed

最新のリリースからどのパッケージが変更されているかチェックする

lerna diff [package?]

最新のリリースからのdiff。全てのパッケージ or 一つのパッケージ

lerna run [script]

引数のscriptが含まれるそれぞれのpackageのnpm scriptの実行。

これ、例えば、それぞれのパッケージでbuildというscriptを提供してたら、lerna run build でそれぞれのパッケージのbuildを実行してくれるってことかな。

lerna ls

カレントlernaレポの全てのpublicパッケージのリストを表示

終わりに

lernaでできることがなんとなく理解できたな。とくにどんなコマンドがあるのかをさらっと理解するだけでも、何してくれるツールなのか理解が深まったと感じた。

vuetifyのソースを見るとlernaがあって、なんだこれと思って軽くみてみたけど、そもそもnpmを理解した方がよいと思ったので、次はnpmで自作ライブラリをpublishすることを試してみたい。

備忘

  • そもそもpackage.jsonやnpmのパッケージの作り方を学んだ方が良いきがした。
    • lernaはそれの発展系というか複数一括にできるようにするよ、というツールだから
  • lerna bootstrapがどう動くかは後で実験したい。