8

我对使用 Yarn Workspaces 和设置 Monorepo 比较陌生,所以如果这个问题得到了回答,请原谅我。对于使用 Yarn Workspaces 设置的 Monorepo 是否可行,我不相信我已经找到了明确的答案。

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

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

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

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

这是我迄今为止尝试过的:

我尝试nohoist在 webpack 配置中添加我的工作区选项,但我不相信包 A 使用的是 TypeScript 3.4.5,因为我没有得到预期的结果。当我将根package.jsonTypeScript 版本要求更改为 3.4.5 时,当我得到正确的结果时,如果我可以继续对所有其他包使用最新的 TS,但为包 A 保留较低版本,那将是最好的情况。

我还尝试package.json在 PackageA 文件夹中添加一个,它定义"typescript": "3.4.5"devDependency. Yarn 在 PackageA 文件夹中安装了正确的版本,但它似乎没有使用它。

我也很确定 Yarnresolutions不是适合这种情况的工具,因为我的包没有定义为我的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 上存在的 Prop 值,而不是它的父级(即按钮上的 HTML 属性将显示为 prop)。这是该问题的链接

如果我的项目配置需要更多信息,请告诉我!欣赏洞察力和建议:)

4

1 回答 1

3

根据文档,您必须**在包名称旁边添加以避免提升包。文档链接在这里
为了避免提升打字稿:

"workspaces": {
"packages": [
  "packages/*"
],
"nohoist": [
  "packageA/typescript/**"
]

}

为了避免提升打字稿及其依赖项:

"workspaces": {
"packages": [
  "packages/*"
],
"nohoist": [
  "packageA/typescript/**/**"
]

}

于 2020-08-04T12:25:05.127 回答