在 Yarn Workspace 的不同包中使用不同版本的依赖项
Posted
技术标签:
【中文标题】在 Yarn Workspace 的不同包中使用不同版本的依赖项【英文标题】:Using different versions of a dependency in different packages of a Yarn Workspace 【发布时间】:2019-11-18 12:29:19 【问题描述】:我对使用 Yarn Workspaces 和设置 Monorepo 比较陌生,所以如果这个问题得到了解答,请原谅我。对于使用 Yarn Workspaces 设置的 Monorepo 是否可行,我认为我没有找到明确的答案。
我想知道是否可以在不同的包中使用两个不同版本的依赖项(在我的情况下是 TypeScript)以及如何做到这一点。
我的目标是锁定包 A 中的 TypeScript (3.4.5) 版本,并将根 package.json
的 TypeScript 版本 (3.5.0) 用于此 monorepo 中的所有其他包。
这是文件夹结构。理想情况下,PackageA 将使用 3.4.5,而 PackageB/PackageC 将使用根 package.json
中定义的任何版本
|-- packages
|-- packageA
|-- packageB
|-- packageC
|-- package.json
这是我迄今为止尝试过的:
我尝试在 webpack 配置的工作区选项中添加 nohoist
,但我不相信包 A 使用的是 TypeScript 3.4.5,因为我没有得到预期的结果。当我将根 package.json
TypeScript 版本要求更改为 3.4.5 时,这就是我得到正确结果的时候,如果我可以继续对所有其他包使用最新的 TS 但为包保留较低版本,那将是最好的情况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 上存在的 Prop 值,而不是它的父级(即按钮上的 html 属性将显示为 prop)。这是该问题的link。
如果我的项目配置需要更多信息,请告诉我!感谢您的见解和建议:)
【问题讨论】:
Yarn installs the right version in the PackageA folder, but it doesn't seem to use it
- 所以,就纱线而言,它做了它被要求做的事情。现在的问题是“为什么它似乎不使用它”,也就是说,为什么 PackageA 不使用安装在自己本地 node_modules
中的 typescript,而是使用其他版本。这看起来更多是关于 PackageA 或在 PackageA 源上使用打字稿的任何工具的问题,而不是关于纱线工作区的问题。
@artem 感谢您的评论!你知道在根package.json
中定义的项目的根目录下运行脚本时是否有办法确认运行的是哪个版本的依赖项?
对于打字稿,使用-v
命令行选项将使其打印其版本,但除此之外它不会做任何其他事情。对于其他脚本 - 我不知道。一般来说,如果您在根目录中运行脚本,它应该只从根目录node_modules
中选择其依赖项。如果您需要在特定包(纱线术语中的“工作区”)的上下文中运行脚本,则可以使用 yarn workspace yarn 命令。
我喜欢那里的所有教程......只需使用纱线工作区!但是设置 monorepo 的全部意义在于您需要支持构建具有不同版本依赖项的不同子项目,但是这些教程都没有告诉您如何做到这一点!哈
@ShermanHui 你找到解决办法了吗?
【参考方案1】:
根据文档,您必须在包名称旁边添加**
以避免提升包。文档链接here.
为了避免提升打字稿:
"workspaces":
"packages": [
"packages/*"
],
"nohoist": [
"packageA/typescript/**"
]
为了避免提升 typescript 及其依赖项:
"workspaces":
"packages": [
"packages/*"
],
"nohoist": [
"packageA/typescript/**/**"
]
【讨论】:
以上是关于在 Yarn Workspace 的不同包中使用不同版本的依赖项的主要内容,如果未能解决你的问题,请参考以下文章
[Yarn] Use yarn up to Update Dependencies In A Yarn Workspace
在 Netlify Monorepo (Yarn Workspace/Lerna) 上使用 UI 库作为 Web 应用程序的依赖项
lerna+yarn workspace+monorepo项目的最佳实践
基于 Yarn WorkSpace + Lerna + OrangeCI 搭建 Typescript Monorepo 项目实践