纱线工作区:nohoist exclude

Posted

技术标签:

【中文标题】纱线工作区:nohoist exclude【英文标题】:Yarn workspaces: nohoist exclude 【发布时间】:2020-09-30 06:37:15 【问题描述】:

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

"workspaces": 
  "nohoist": **

我想只指定两个要吊装的包裹,其他所有东西都不要吊装。有没有一种简单的方法可以做到这一点,而无需将除这​​两个之外的所有包粘贴到nohoist 中吗?

【问题讨论】:

【参考方案1】:

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

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(不需要)

【讨论】:

我仍然遇到了麻烦,因为该配置中的链接存在错误,并且 Yarn 没有将依赖项添加为开发依赖项,而是作为生产依赖项添加,然后抱怨它所犯的错误。我认为这可以通过直接编辑 package.json 中的依赖项来解决,但我放弃了。

以上是关于纱线工作区:nohoist exclude的主要内容,如果未能解决你的问题,请参考以下文章

工作空间仍在吊装的 nohoist

纱线工作区和纱线链接

带有 Nextjs 和 React-native 的 monorepo 中的 Nohoist:无法解决反应

纱线工作区隔离

纱线工作区——包别名

带有纱线工作区的 Oclif