我正在尝试与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
?
答案 0 :(得分:7)
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
}
答案 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/dependency
为VERSION
,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
的软件包(单击版本),则可以看到除latest
之外的其他软件包,它们还部署了带有标签next
的发行版。 ,canary
和unstable
。
您的未发布包中没有 any 标记,因为它们已应用于发布,因此latest
将不匹配,这意味着lerna
将尝试远程解决它,失败404
。
这是bootstrap
命令文档的Notes中的陷阱之一。
- 如果仓库中的同名软件包不满足软件包中的依赖版本,则会像平常一样
npm install
编辑(或yarn
编辑)。- 距离标签(例如
latest
)不满足semver范围。- 循环依赖项会导致循环符号链接,可能会影响您的编辑器/ IDE。
如果要匹配可用的任何版本,建议的路径是将版本设置为"*"
。鉴于本地软件包具有指定的version
字段,它将与任何版本匹配,因此将始终使用本地版本。
{
"dependencies": {
"new-refactored-package" : "*"
}
}
alpha
,rc
或beta
即使
*
也不会匹配标记为预发行版本的版本,因此,如果为本地软件包提供0.0.1-alpha.0
或1.0.0-rc.3
之类的版本,也不会在本地进行符号链接
private: true
尽管它不会影响lerna bootstrap
,但值得一提的是,您不想发布的软件包应始终具有private: true;
。这样可以确保lerna publish
不发布它。
答案 2 :(得分:0)
lerna bootstrap
将检查您在package.json
或package-lock.json
中指定的软件包版本。
由于您尚未发布您的作品,因此我将尝试在--force-local
命令上使用bootstrap
。
lerna bootstrap --force-local
答案 3 :(得分:-2)
package.json中的软件包名称必须与/ packages文件夹中的文件夹名称匹配。
(基本上是@kp_ping所说的)