dag*_*da1 7 javascript yarnpkg yarn-workspaces
每当我向工作区项目的根目录添加依赖项时:
例如
yarn add assets-webpack-plugin -D
我收到以下错误:
运行此命令会将依赖关系添加到工作空间的根目录,而不是工作空间本身,这可能不是您想要的-如果您确实想要,请通过再次使用-W标志(或--ignore-工作区根检查)。
替代方法是将其添加到需要它的每个项目中,然后您将遇到每个项目具有不同的依赖项和锁定文件的问题。
由于使用的是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将为每个项目使用一个锁文件,而不是不同的锁文件,这意味着更少的冲突和更容易的查看。
如果您在 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 ),那么您将看到警告以及如何覆盖。