我正在尝试用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"
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,lerna bootstrap
在这一点上应该定位package1
在项目并将其符号链接到prior-existing-project
的/node_modules/new-refactored-package/
.来自lerna的自述文件:
在当前的Lerna仓库中引导包.安装所有依赖项并链接任何交叉依赖项.
运行时,此命令将:
- npm安装每个包的所有外部依赖项.
- 将所有相互依赖的Lerna软件包汇集在一起.
- npm预先发布所有自举包.
但是,当我运行它时,lerna会尝试npm install new-refactored-package
:
错误的ERR!404注册表在https://registry.npmjs.org/new-refactored-package上为GET返回404
我误会了吗?我首先必须发布依赖的包npm
吗?
oBu*_*usk 17
为了lerna
在运行本地包时符号链接本地包,lerna bootstrap
必须有一个name
和 version
匹配。每当lerna
无法将依赖项与本地包匹配时,它就会尝试从注册表安装它。
所以要保证依赖包有一个版本,可以与依赖中的semver版本匹配。
{
name: "@my-name/dependency",
version: "1.2.0"
}
Run Code Online (Sandbox Code Playgroud)
{
name: "@my-name/dependant",
dependencies: {
"@my-name/dependency": "<VERSION>"
}
}
Run Code Online (Sandbox Code Playgroud)
@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
是可用最新版本的通用术语,但它实际上npm-dist-tag
是默认情况下应用于所有新版本.
如果您查看诸如react
(单击版本)之类的包,您会发现除了 之外latest
,它们还部署带有标记的版本next
,canary
以及unstable
。
您未发布的包没有任何标签,因为它们已应用于发布,因此latest
不会匹配,这意味着lerna
将尝试远程解决它,失败并返回404
.
这在命令文档的注释中被指出为陷阱之一。bootstrap
- 当 repo 中的同名包不满足包中的依赖项版本时,它将像正常一样被
npm install
ed(或yarn
ed)。- Dist 标签,如
latest
,不满足semver范围。- 循环依赖会导致循环符号链接,这可能会影响您的编辑器/IDE。
如果你想匹配任何可用的版本,推荐的路径是将版本设置为"*"
. 这将匹配任何版本,因此将始终使用本地版本,因为本地包具有指定的version
字段。
{
"dependencies": {
"new-refactored-package" : "*"
}
}
Run Code Online (Sandbox Code Playgroud)
alpha
,rc
或beta
即使
*
将不符合被标记为预发布版本,因此,如果你给你的本地包像一个版本0.0.1-alpha.0
,或者1.0.0-rc.3
,它也不会在本地符号链接
private: true
虽然它不会影响lerna bootstrap
,但值得一提的是,您不想发布的包应该始终具有private: true;
. 这将确保lerna publish
不发布它。
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
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3759 次 |
最近记录: |