我正在尝试用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 installed(或yarned)。- 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 次 |
| 最近记录: |