纱线工作区:nohoist排除

时间:2020-06-10 18:21:43

标签: npm yarnpkg lerna yarn-workspaces

我的package.json中当前有

"workspaces": {
  "nohoist": **
}

我想指定两个包装来提升,而在其他所有东西上都没有包装。是否有一种简单的方法可以将我的所有软件包(除了这两个软件包之外)都粘贴到nohoist中?

2 个答案:

答案 0 :(得分:2)

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

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"
  }
}

我在这个例子中还包含了一个 postinstall 脚本,它不在主题中,但展示了我们如何在安装依赖项后建立指向同级包的符号链接。安装时,Yarn Workspaces 会在工作区根目录 /node_modules 中创建指向每个包的符号链接。我们可以利用这一点,通过将 yarn link--link-folder 参数指向工作区根处的 /node_modules,使用其中一个链接轻松地在包中创建所需的符号链接。< /p>

这假设 @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 中,而不是安装在包私有 {{1} 下}}。此外,如果 node_modules 已被下载到 @someone/someones-components,它与我们的 /packages/@someone/someones-components 指令 packages 匹配并且也不会下载到 "packages/**/*",而是像这样符号链接:

/node_modules

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

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

答案 1 :(得分:0)

您可以输入包含要提升的包装的阵列。然后,根据package.json在项目文件夹中的位置,您可以

  1. 从根级别选择

"nohoist": ["**/npm-package", "**/npm-package/**"]

  1. 在子级以及所有后代

"nohoist": ["npm-package", "npm-package/**"]