レルナと一緒にモノレポをセットアップしようとしています。計画は、独自のパッケージであるはずのコードのチャンクを引き出すことによって、既存のプロジェクトをリファクタリングすることです。 lerna init
を実行しましたが、現在の設定は次のようになります。
project/
packages/
new-refactored-package/
package.json
prior-existing-project/
package.json
{ "dependencies" : { "new-refactored-package" : "latest" } }
package.json
{
"devDependencies": {
"lerna": "^2.0.0-rc.5"
}
}
lerna.json
{
"lerna": "2.0.0-rc.5",
"packages": [
"packages/*"
],
"version": "0.0.0"
}
私の理解では、この時点でlerna bootstrap
はプロジェクト内のpackage1
を見つけ、それをprior-existing-project
の/node_modules/new-refactored-package/
にシンボリックリンクすることになっています。から lernaのreadme :
現在のLernaリポジトリでパッケージをブートストラップします。すべての依存関係をインストールし、相互依存関係をリンクします。
実行すると、このコマンドは次のようになります。
- npmは、各パッケージのすべての外部依存関係をインストールします。
- 相互に依存しているすべてのLernaパッケージをシンボリックリンクします。
- npmは、すべてのブートストラップされたパッケージを事前公開します。
ただし、実行すると、lernaは代わりにnpm install new-refactored-package
を試みます。
npm ERR! 404レジストリがGETに対して404を返しました https://registry.npmjs.org/new-refactored-package
私は誤解していますか?最初に依存パッケージをnpm
に公開する必要がありますか?
lerna bootstrap
パッケージが利用可能の場合、インストールではなくシンボリックリンクします。
あなたの場合、lernaはパッケージの正しいversion
またはname
を見つけることができないと思います。
これが私のプロジェクトでしたことです...
project
- packages/
- a_pkg
- package.json {
"name": "@scope/a_pkg",
"version": "0.0.1",
"private": true
/// opt out
}
- b_pkg
- package.json {
"name": "@scope/b_pkg",
"version": "0.0.1",
"private": true,
"dependencies": {
"@scope/a_pkg": "^0"
},
/// opt out
}
- package.json
- lerna.json {
"packages": [
"packages/*"
],
/// opt out
}
実行時にlerna
がローカルパッケージをシンボリックリンクするには lerna bootstrap
ローカルパッケージにはname
andversion
一致します。 lerna
が依存関係をローカルパッケージに一致させることができない場合は常に、レジストリからインストールしようとします。
したがって、依存関係パッケージに、依存関係の semver バージョンと一致するバージョンがあることを確認してください。
{
name: "@my-name/dependency",
version: "1.2.0"
}
{
name: "@my-name/dependant",
dependencies: {
"@my-name/dependency": "<VERSION>"
}
}
VERSION
が@my-name/dependency
、1.2.0
、^1.0.0
、または1.X.X
の場合、*
はシンボリックリンクされます。ただし、1.0.0
や^0.0.0
など、ローカルパッケージと一致しない範囲を使用すると、npmレジストリでそれを解決しようとし、404 Not Found - GET https://registry.npmjs.org/@my-name%2fdependency - Not found
のようなエラーが表示されます。
latest
質問で説明されている実際のシナリオでは、実際の問題はバージョンがlatest
として指定されていることであり、latest
はtheの総称であると考えるのは簡単です。利用可能な最新バージョン、実際には npm-dist-tag
であり、すべての新しいリリースにデフォルトで適用されます。
react
(click versions)のようなパッケージを見ると、latest
以外に、次のようなリリースもデプロイされていることがわかります。タグnext
、canary
、およびunstable
。
未公開のパッケージには、公開時に適用されるanyタグがないため、latest
は一致しません。つまり、lerna
はリモートで解決しようとし、失敗します。 404
で。
これは、bootstrap
コマンドのドキュメントの Notes のgotchasの1つとして示されています。
- パッケージ内の依存関係バージョンがリポジトリ内の同じ名前のパッケージによって満たされない場合、通常のように
npm install
ed(またはyarn
ed)になります。latest
のような距離タグは、 semver の範囲を満たしていません。- 循環依存は循環シンボリックリンクをもたらし、それはmayエディタ/ IDEに影響を与えます。
使用可能なバージョンと一致させる場合は、バージョンを"*"
に設定することをお勧めします。これはどのバージョンとも一致するため、ローカルパッケージにversion
フィールドが指定されている場合、常にローカルバージョンが使用されます。
{
"dependencies": {
"new-refactored-package" : "*"
}
}
alpha
、rc
またはbeta
*
でさえnotプレリリースとしてマークされたバージョンと一致するため、ローカルパッケージに0.0.1-alpha.0
や1.0.0-rc.3
のようなバージョンを与えると、また、ローカルにシンボリックリンクされていません
private: true
lerna bootstrap
には影響しませんが、公開したくないパッケージには常にprivate: true;
が必要であることに注意してください。これにより、 lerna publish
が公開されないようになります。
lerna bootstrap
は、package.json
またはpackage-lock.json
で指定したパッケージバージョンをチェックします。
作品を公開していないので、bootstrap
コマンドで--force-local
を使用してみます。
lerna bootstrap --force-local
Package.jsonのパッケージ名は、/ packagesフォルダーのフォルダー名と一致する必要があります。
(本質的に@kp_pingが言ったこと)