1. karak

    Posted

    karak
Changes in title
+Lerna はまりポイント
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,28 @@
+最近、Node.js の複合パッケージ向けのコードベース管理ツールである、[lerna](https://lernajs.io/) を使っているので、その備忘録。
+随時更新。
+
+## npm install をしてはいけない。
+
+ついやりたくなるが、個別のパッケージディレクトリで引数なしの `npm install` をしてはいけない。かならず `lerna bootstrap` を使う。ちなみにこのコマンドはルートディレクトリでなくても実行できる。
+
+lerna は同じリポジトリ内のパッケージ参照に対してシンボリックリンクを利用して node_modules を形作るため、通常のコマンドを使うとそれが破壊されてしまう。
+
+## コマンドラインツールをルートにインストールしてはいけない
+
+lerna のよいところは共通の開発用のパッケージをルートディレクトリの node_modules にまとめてつっこめることだ(いうまでもないが `devDependencies` にかぎる)。
+
+しかし、コマンドラインツールに対してこれはできない。正確に言うと、npm scripts(prepublish や test)で呼び出したいものはできない。それらは require と異なり、上位のディレクトリの node_modules を参照しないためだ。
+
+よって、gulp などのタスクランナー、webpack などのモジュールバンドラー、babel や typescript などのトランスパイラをルートにインストールすると残念な結果を招く。
+
+`lerna add` で全部にインストールしよう。ちなみに対象のパッケージを限定したい場合は `--scope=<package-name>` オプションをつければいい。
+
+逆にいうと、prettier のように最上位のディレクトリでしか実行しないものや、gulp のプラグイン化されたものは問題なく使える。[^1]
+
+[^1]: むしろエディタ/IDE の機能によってはルートに入れないと動作しないかもしれない。
+
+## npm uninstall 相当がない
+
+そんなはずはないと思うのだが、`lerna add` はあるのに `lerna remove` がない。**だれか教えてほしい**
+
+いまは package.json から直接該当行を削除して、`lerna clean` を実行している。