我正在尝试与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)本地软件包,本地软件包必须具有匹配的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
时,*
将被符号链接(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
之外的其他软件包,它们还部署带有next
,canary
和unstable
标记的发行版。您未发布的软件包没有任何标签,因为它们已应用于发布,因此
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/