web-dev-qa-db-ja.com

未公開のパッケージでLernaを使用する

レルナと一緒にモノレポをセットアップしようとしています。計画は、独自のパッケージであるはずのコードのチャンクを引き出すことによって、既存のプロジェクトをリファクタリングすることです。 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に公開する必要がありますか?

14
NiloCK

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
}
7
kp_ping

要件

実行時にlernaがローカルパッケージをシンボリックリンクするには lerna bootstrap ローカルパッケージにはnameandversion一致します。 lernaが依存関係をローカルパッケージに一致させることができない場合は常に、レジストリからインストールしようとします。

したがって、依存関係パッケージに、依存関係の semver バージョンと一致するバージョンがあることを確認してください。

{

  name: "@my-name/dependency",
  version: "1.2.0"
}
{
  name: "@my-name/dependant",
  dependencies: {
    "@my-name/dependency": "<VERSION>"
  }
}

VERSION@my-name/dependency1.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として指定されていることであり、latesttheの総称であると考えるのは簡単です。利用可能な最新バージョン、実際には npm-dist-tag であり、すべての新しいリリースにデフォルトで適用されます。

react (click versions)のようなパッケージを見ると、latest以外に、次のようなリリースもデプロイされていることがわかります。タグnextcanary、およびunstable

未公開のパッケージには、公開時に適用されるanyタグがないため、latestは一致しません。つまり、lernaはリモートで解決しようとし、失敗します。 404で。

これは、bootstrapコマンドのドキュメントの Notesgotchasの1つとして示されています。

  • パッケージ内の依存関係バージョンがリポジトリ内の同じ名前のパッケージによって満たされない場合、通常のようにnpm installed(またはyarned)になります。
  • latestのような距離タグは、 semver の範囲を満たしていません。
  • 循環依存は循環シンボリックリンクをもたらし、それはmayエディタ/ IDEに影響を与えます。

解決

使用可能なバージョンと一致させる場合は、バージョンを"*"に設定することをお勧めします。これはどのバージョンとも一致するため、ローカルパッケージにversionフィールドが指定されている場合、常にローカルバージョンが使用されます。

{ 
  "dependencies": { 
    "new-refactored-package" : "*"
  }
}

alpharcまたはbeta

*でさえnotプレリリースとしてマークされたバージョンと一致するため、ローカルパッケージに0.0.1-alpha.01.0.0-rc.3のようなバージョンを与えると、また、ローカルにシンボリックリンクされていません

private: true

lerna bootstrapには影響しませんが、公開したくないパッケージには常にprivate: true;が必要であることに注意してください。これにより、 lerna publish が公開されないようになります。

6
oBusk

lerna bootstrapは、package.jsonまたはpackage-lock.jsonで指定したパッケージバージョンをチェックします。

作品を公開していないので、bootstrapコマンドで--force-localを使用してみます。

lerna bootstrap --force-local

0
kitimenpolku

Package.jsonのパッケージ名は、/ packagesフォルダーのフォルダー名と一致する必要があります。

(本質的に@kp_pingが言ったこと)

0
Jkarttunen