为什么在将依赖项添加到根工作区package.json时yarn会发出警告

dag*_*da1 7 javascript yarnpkg yarn-workspaces

每当我向工作区项目的根目录添加依赖项时:

例如

yarn add assets-webpack-plugin -D

我收到以下错误:

运行此命令会将依赖关系添加到工作空间的根目录,而不是工作空间本身,这可能不是您想要的-如果您确实想要,请通过再次使用-W标志(或--ignore-工作区根检查)。

替代方法是将其添加到需要它的每个项目中,然后您将遇到每个项目具有不同的依赖项和锁定文件的问题。

Abd*_*lah 6

由于使用的是Yarn工作区,并且它管理所有项目(工作区)的依赖关系,因此应将每个项目的依赖关系添加到其自己的package.json(而不是工作区根目录)中。Yarn仅使用放置在工作区根目录中的一个 yarn.lock文件。另外,它尝试将所有项目的依赖项移至node_modules工作区根目录,以尽可能避免重复。尽管需要将一些依赖项放在node_modules自己的项目中;例如,当工作空间根目录具有devDependencyto,awesome-package@2.1.1而项目依赖于另一个版本的同一程序包时,则说1.2.5它们不兼容。假设工作空间的目录结构如下所示:

??? workspace-root
|   ??? package.json
|   ??? workspace-a
|   |   ??? package.json
|   ??? workspace-b
|   |   ??? package.json
Run Code Online (Sandbox Code Playgroud)

yarn工作空间根目录或任何工作空间目录中运行之后,您将具有以下目录结构:

??? workspace-root
|   ??? node_modules
|   ??? package.json
|   ??? yarn.lock
|   ??? workspace-a
|   |   ??? package.json
|   |   ??? node_modules
|   ??? workspace-b
|   |   ??? package.json
|   |   ??? node_modules
Run Code Online (Sandbox Code Playgroud)

仅当要从工作空间根目录运行脚本并且需要依赖关系时,才将依赖关系添加到工作空间根目录。在这种情况下,项目独立于该依赖关系,因此您可以忽略该警告。

为什么纱线会发出警告?

如果将项目的公共依赖项添加到工作区根目录,则不会出现在package.json项目中。因此,如果您分离一个项目,则它本身不会具有所有依赖关系,package.json因此yarn install为分离的项目运行会导致其自身没有所有依赖关系node_modules。显然,分离的项目无法正常工作,您需要修复缺少的依存关系问题才能解决该问题。

有关纱线工作区的更多信息

纱线工作区是一项功能,目的是为了更轻松地管理彼此相关的项目的依存关系。例如,当您的项目具有类似的依赖性时,可以将每个项目声明为一个工作区。它可以防止很多重复。另一个重要的用例是monorepos

那些试图将项目分成多个包的人知道一次在多个包之间进行更改有多么困难。为了简化过程,一些大型项目采用了monorepo方法或多包存储库,从而减轻了跨包编写代码的负担。

JavaScript开发人员每天都会使用几个项目作为monorepos进行管理:Babel,React,Jest,Vue,Angular。

使用纱线工作区带来以下好处:

  • 它允许您以以下方式设置多个程序包:只需要运行一次yarn install即可一次安装所有程序包。
  • 您的依赖关系可以链接在一起,这意味着您的工作空间可以相互依赖,同时始终使用最新的可用代码。

  • yarn link与之相比,这是一种更好的机制,因为它只会影响您的工作区树,而不是整个系统。

  • 您所有的项目依赖项将一起安装,从而为Yarn提供了更大的自由度来更好地对其进行优化。

  • Yarn将为每个项目使用一个锁文件,而不是不同的锁文件,这意味着更少的冲突和更容易的查看。

  • 您的答案涉及工作区的预期用途,但不是错误原因的实际解释。我也有同样的问题,而且我从未在这个项目(或我能想到的其他地方)中对纱线工作区做过任何事情。要在没有此消息的情况下使用 Yarn,我现在必须采用工作区吗?我必须在 package.json 中添加/更改某些内容吗? (2认同)
  • 我确信在这方面做出了假设,但我认为我缺乏发现它们的知识。我会开始我自己的问题,但我希望它会被标记为与这个问题重复,因为它是完全相同的问题。但一个重要的事实是,我不使用工作区(无论如何我都知道),也没有构建“monorepos”。因此,我什至不确定“根工作区 package.json”到底是什么。我知道我的项目 package.json 是什么(就像我曾经使用过的其他项目一样),但突然,yarn 给了我这个警告,并让我使用 -W。问题是,“为什么”? (2认同)

rai*_*bba 5

如果您在 package.json 中声明了“工作区”;您已选择加入工作区,并且设置必须正确。这似乎只有在您使用单一回购时才有意义。与此相关,mono-repo 是一个带有“root” package.json 的大型存储库,其中声明了工作区以及开发依赖项。里面将是其他“包”(具有自己的 package.json 的项目,但不是他们自己的 repo)。

当您想将包添加到那些“工作区”(请参阅https://yarnpkg.com/lang/en/docs/workspaces/)或“包”并且您正在从根文件夹工作时,您必须指定您的工作区' 的目标是 Yarn 动作。

如果它是根的开发依赖项,则这不是问题。由于假设您的“根”项目没有自己的“生产”依赖项,因此它们应该只在工作区中。如果它不是开发依赖项并且您没有指定工作区 ( https://yarnpkg.com/en/docs/cli/workspace ),那么您将看到警告以及如何覆盖。

  • 我真的迷路了。如何为您的工作区之一安装依赖项?进入我的工作区并运行“yarn add somepackage”创建一个新的锁定文件。运行“yarn工作区workspace-package-name add somepackage”还会在该工作区中创建一个新的锁定文件。 (2认同)