我正在尝试与Lerna建立我的monorepo。该计划是通过提取应该属于自己的程序包的代码块来重构现有项目。我已经运行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并将其符号链接(symbolic link)到prior-existing-project/node_modules/new-refactored-package/。从lerna's readme:



但是,当我运行它时,lerna尝试改为npm install new-refactored-package:



我误会了吗我首先必须将依赖包发布到npm吗?

最佳答案

要求

为了使lerna在运行 lerna bootstrap 时符号链接(symbolic link)本地软件包,本地软件包必须具有匹配的nameversion。每当lerna无法将依赖项与本地包匹配时,它将尝试从注册表中安装它。

因此,请确保依赖项包的版本可以与依赖项中的semver版本匹配。


{

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

@my-name/dependencyVERSION1.2.0^1.0.01.X.X时,*将被符号链接(symbolic link)。但是,当使用与本地软件包不匹配的范围(例如1.0.0^0.0.0)时,它将尝试在npm注册表中解决该问题,并显示如下错误404 Not Found - GET https://registry.npmjs.org/@my-name%2fdependency - Not found
latest
在问题中说明的实际情况中,实际问题是版本指定为latest,虽然很容易想到latest是可用的最新版本的通用术语,但实际上是 npm-dist-tag ,默认情况下应用于所有新版本。

如果查看 react (单击版本)之类的软件包,则可以看到除latest之外的其他软件包,它们还部署带有nextcanaryunstable标记的发行版。

您未发布的软件包没有任何标签,因为它们已应用于发布,因此latest将不匹配,这意味着lerna将尝试远程解决它,但404失败。

这是bootstrap命令的文档Notes中的陷阱之一。





如果要匹配可用的任何版本,建议的路径是将版本设置为"*"。如果本地软件包具有指定的version字段,则它将与任何版本匹配,因此将始终使用本地版本。
{
  "dependencies": {
    "new-refactored-package" : "*"
  }
}



private: true
尽管它不影响lerna bootstrap,但值得一提的是,您不想发布的软件包应始终具有private: true;。这将确保 lerna publish 不发布它。

关于lerna - 将Lerna与未发布的软件包一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44491525/

10-13 09:17