Yarn 工作区:nohoist 排除

gin*_*nna 1 npm lerna yarnpkg yarn-workspaces

在我的 package.json 中,我目前有

"workspaces": {
  "nohoist": **
}
Run Code Online (Sandbox Code Playgroud)

我想指定仅两个要提升的包,并且不提升其他所有内容。有没有一种简单的方法可以做到这一点,而无需将除这​​两个包之外的所有包粘贴到 中nohoist

loo*_*oop 5

经过几天的挖掘,我最终得到了以下配置。

Yarn 似乎使用某种Bash glob 模式匹配(有关教程,请参阅这篇Linux 期刊文章)。在此配置中,"nohoist"规则禁用虚拟路径以列表中的字符串之一结尾的每个模块的提升。遗憾的是,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"
  }
}
Run Code Online (Sandbox Code Playgroud)

我在此示例中还包含了一个安装后脚本,该脚本超出了主题,但显示了如何在安装依赖项后建立到同级包的符号链接。安装后,Yarn Workspaces 会创建指向工作区 root 中每个包的符号链接/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
Run Code Online (Sandbox Code Playgroud)

因为@someone/someones-components配置为在我们的工作区根目录中进行提升package.json,所以 Yarn 可以自行决定将其安装在/node_modules工作区根目录中,而不是在包 private 下node_modules。另外,如果@someone/someones-components已下载到,它会与我们的指令/packages/@someone/someones-components匹配,并且不会下载到任何一个,而是像这样进行符号链接:packages"packages/**/*"/node_modules

/node_modules/@someone/someones-components -> ../../packages/@someone/someones-components
Run Code Online (Sandbox Code Playgroud)

这是完美的。我们唯一需要做的就是使安装后脚本保持最新,以便在依赖包中提供所需的符号链接。我认为我们还可以自动查找脚本中的依赖关系并建立链接。

搜索关键词:monorepo lerna(不需要)