使用Lerna与未发布的包

时间:2017-06-12 04:40:38

标签: lerna

我正在尝试与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的{​​{1}}。来自lerna's readme

  

在当前的Lerna回购中引导包。安装所有依赖项并链接任何交叉依赖项。

     

运行时,此命令将:

     
      
  • npm安装每个包的所有外部依赖项。
  •   
  • 将所有彼此依赖的Lerna软件包合在一起。
  •   
  • npm预先发布所有引导程序包。
  •   

但是,当我运行它时,lerna会尝试改为/node_modules/new-refactored-package/

  

npm ERR! 404注册表在https://registry.npmjs.org/new-refactored-package

上返回404以获取GET

我误会了吗?我是否首先必须将依赖的软件包发布到npm install new-refactored-package

4 个答案:

答案 0 :(得分:7)

如果可用

lerna bootstrap会对包进行符号链接而不是安装。

在您的情况下,我认为lerna无法找到包的正确versionname

这是我在项目中所做的......

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
}

答案 1 :(得分:1)

要求

为了使lerna在运行lerna bootstrap时符号链接本地软件包,本地软件包必须具有匹配的name version。每当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时,

*将被符号链接。但是,当使用与本地软件包不匹配的范围时,例如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的软件包(单击版本),则可以看到除latest之外的其他软件包,它们还部署了带有标签next的发行版。 ,canaryunstable

您的未发布包中没有 any 标记,因为它们已应用于发布,因此latest将不匹配,这意味着lerna将尝试远程解决它,失败404

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

  
      
  • 如果仓库中的同名软件包不满足软件包中的依赖版本,则会像平常一样npm install编辑(或yarn编辑)。
  •   
  • 距离标签(例如latest)不满足semver范围。
  •   
  • 循环依赖项会导致循环符号链接,可能会影响您的编辑器/ IDE。
  •   

解决方案

如果要匹配可用的任何版本,建议的路径是将版本设置为"*"。鉴于本地软件包具有指定的version字段,它将与任何版本匹配,因此将始终使用本地版本。

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

  alpharcbeta      

即使*也不会匹配标记为预发行版本的版本,因此,如果为本地软件包提供0.0.1-alpha.01.0.0-rc.3之类的版本,也不会在本地进行符号链接

private: true

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

答案 2 :(得分:0)

lerna bootstrap将检查您在package.jsonpackage-lock.json中指定的软件包版本。

由于您尚未发布您的作品,因此我将尝试在--force-local命令上使用bootstrap

lerna bootstrap --force-local

答案 3 :(得分:-2)

package.json中的软件包名称必须与/ packages文件夹中的文件夹名称匹配。

(基本上是@kp_ping所说的)