在Yarn Workspace中的不同包中使用不同版本的依赖项

17

我对使用Yarn Workspaces和设置单体库相对较新,所以如果这个问题已经有答案,请原谅我。 我不认为我找到了一个清晰的答案,关于是否可以在使用Yarn Workspaces设置的Monorepo中实现这一点。

我想知道是否可能在不同的包中使用两个不同版本的依赖项(在我的情况下是TypeScript),以及如何做到这一点。

我的目标是锁定TypeScript的一个版本(3.4.5)在Package A中,并在此monorepo中的所有其他Packages中使用根package.json的版本(3.5.0)的TypeScript。

这是文件夹结构。 理想情况下,PackageA将使用3.4.5,PackageB / PackageC将使用在根package.json中定义的任何版本。

|-- packages
    |-- packageA
    |-- packageB 
    |-- packageC
|-- package.json

这是我迄今为止尝试的方法:
我尝试在webpack配置中的工作区选项中添加nohoist,但我认为Package A没有使用TypeScript 3.4.5,因为我没有得到预期的结果。当我将根package.json TypeScript版本要求更改为3.4.5时,我才获得正确的结果。如果我可以保持所有其他软件包的最新TS版本,但保留Package A的较低版本,那将是最好的情况。
我还尝试在PackageA文件夹中添加一个package.json,其中定义了"typescript": "3.4.5"作为devDependency。 Yarn会在PackageA文件夹中安装正确的版本,但似乎没有使用它。
我也很确定Yarn resolutions不是这种情况的正确工具,因为我的软件包没有在package.json中定义为依赖项。
snippet of package.json
  "devDependenices: {
    ...,
    "webpack": "^4.34.0",
    "typescript": "3.5.0-rc",
    "yarn": "^1.15.2"
  },
  "workspaces": {
    "packages": [
      "packages/*"
    ],
    "nohoist": [
      "packageA/typescript"
    ]
  }

如果有人好奇,PackageA需要使用TypeScript 3.4.5,因为我需要使用react-docgen-typescript来解析存在于Prop上而不是其父级(例如按钮上的HTML属性将显示为prop)的Prop值。这里是链接到该问题的链接。
请让我知道是否需要更多关于我的项目配置的信息!感谢您的见解和建议 :)

2
Yarn会在PackageA文件夹中安装正确的版本,但似乎没有使用它-就Yarn而言,它已经完成了被要求做的事情。现在的问题是“为什么似乎没有使用它”,也就是说,为什么PackageA没有使用其自己本地node_modules中安装的typescript,而是使用了其他版本。这似乎更多是关于PackageA或任何在PackageA源代码上使用typescript的工具的问题,而不是关于yarn工作区的问题。 - artem
@artem,感谢您的评论!您知道在运行根目录下定义的项目的脚本时,是否有一种方法可以确认运行哪个依赖项的版本?该依赖项在根目录下的package.json中定义。 - Sherman Hui
对于 TypeScript,使用 -v 命令行选项将使其打印版本,但除此之外它不会执行任何其他操作。至于其他脚本 - 我不知道。通常情况下,如果在根目录中运行脚本,则应仅从根 node_modules 中选择其依赖项。如果您需要在特定软件包(yarn 术语中的“工作区”)的上下文中运行脚本,则可以使用 yarn workspace yarn 命令来实现。 - artem
3
我喜欢现在所有的教程都会说…使用yarn工作区!但是设置单一代码库的整个目的就是要支持不同子项目使用不同版本的依赖进行构建,但这些教程却没有告诉你如何做到这一点! - Otto
@ShermanHui,你解决了这个问题吗? - Praveen Alluri
1个回答

10
根据文档,您需要在包名称旁边添加**以避免提升该包。文档链接此处
仅针对TypeScript避免提升:
"workspaces": {
  "packages": [
    "packages/*"
  ],
  "nohoist": [
    "packageA/typescript/**"
  ]
}

为避免 TypeScript 及其依赖项的提升问题,请按如下方式操作:
"workspaces": {
  "packages": [
    "packages/*"
  ],
  "nohoist": [
    "packageA/typescript/**/**"
  ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接