【发布时间】:2020-09-30 06:37:15
【问题描述】:
在我的 package.json 中,我目前有
"workspaces": {
"nohoist": **
}
我想只指定两个要吊装的包裹,其他所有东西都不要吊装。有没有一种简单的方法可以做到这一点,而无需将除这两个之外的所有包粘贴到nohoist 中吗?
【问题讨论】:
标签: npm yarnpkg lerna yarn-workspaces
在我的 package.json 中,我目前有
"workspaces": {
"nohoist": **
}
我想只指定两个要吊装的包裹,其他所有东西都不要吊装。有没有一种简单的方法可以做到这一点,而无需将除这两个之外的所有包粘贴到nohoist 中吗?
【问题讨论】:
标签: npm yarnpkg lerna yarn-workspaces
经过几天的挖掘,我最终得到了以下配置。
Yarn 似乎使用了某种Bash glob pattern matching(有关教程,请参阅此Linux journal article)。在此配置中,"nohoist" 规则禁用其virtual path 以列表中的一个字符串结尾的每个模块的提升。遗憾的是,Yarn 将字符串解释为前缀,因此“my-site-whatever”和“someones-components-whatever”等模块也匹配,但这可以处理。
{
"private": true,
"version": "independent",
"workspaces": {
"packages": [ "packages/**/*" ],
"nohoist": [
"**/!(my-site|my-cms|someones-components)"
]
},
"scripts": {
"postinstall": "yarn workspace @myscope/my-site link --link-folder $PWD/node_modules @someone/someones-components"
}
}
我在这个示例中还包含了一个安装后脚本,它超出了主题,但显示了我们如何在安装依赖项后建立到同级包的符号链接。安装后,Yarn Workspaces 会为工作空间根 /node_modules 中的每个包创建一个符号链接。我们可以利用这一点,通过将yarn link 的--link-folder 参数指向工作区根目录下的/node_modules,使用其中一个链接轻松地在包中创建所需的符号链接。
这假定@myscope/my-site/package.json 已声明对@someone/someones-components 的依赖。可以使用命令添加该依赖项
yarn workspace @myscope/my-site add @someone/someones-components
因为@someone/someones-components 配置为在我们的工作空间根package.json 中提升,Yarn 可以自行决定将其安装在工作空间根的/node_modules 中,而不是在私有包node_modules 下。此外,如果@someone/someones-components 已下载到/packages/@someone/someones-components,它与我们的packages 指令"packages/**/*" 匹配,也没有下载到/node_modules,而是像这样符号链接:
/node_modules/@someone/someones-components -> ../../packages/@someone/someones-components
这是完美的。我们唯一需要做的就是使安装后脚本保持最新,以便在依赖包中提供所需的符号链接。我想我们也可以自动查找脚本中的依赖关系并建立链接。
搜索关键字:monorepo lerna(不需要)
【讨论】: