在纱线工作区的不同程序包中使用不同版本的依赖项

时间:2019-07-09 01:27:30

标签: typescript webpack-4 monorepo yarn-workspaces

我对使用Yarn Workspaces并设置Monorepo相对较新,所以请回答我。对于使用Yarn Workspaces设置的Monorepo,是否可以实现这一目标,我认为我没有找到明确的答案。

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

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

这是文件夹结构。理想情况下,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,但保留较低的版本,则将是最好的情况包A。

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

我也很确定,纱线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上存在的Prop值,而不是它的父级(即,按钮上的HTML属性将显示为prop)。这是该问题的link

请让我知道我的项目配置是否需要更多信息!欣赏见识和建议:)

1 个答案:

答案 0 :(得分:0)

根据文档,您必须在软件包名称旁边添加**,以避免吊起该软件包。文档链接here
为避免打字稿吊起:

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

}

为避免悬挂打字稿及其相关性,

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

}