• 你所有的项目依赖将被安装在一起,这样可以让 Yarn 来更好地优化它们。

  • Yarn 将使用一个单一的 lock 文件,而不是每个项目多有一个,这意味着更少的冲突和更容易进行代码检查。

package.json 文件中添加以下内容,从现在开始,我们将此目录称为 “工作区根目录”:

package.json

请注意,private: true 是必需的!工作区本身不应当被发布出去,所以我们添加了这个安全措施以确保它不会被意外暴露。

workspace-a/package.json:

workspace-b/package.json:

最后,在某个地方运行 yarn install ,当然最好是在工作区根目录里面。如果一切正常,你现在应该有一个类似这样的文件层次结构:

就是这样 ! workspace-b <code>需要一个在</code> workspace-a <code>中的文件,现在将直接使用当前项目内部的文件,而不是直接去从 Github 上面取。 </code> cross-env 包已正确去重并放在项目的根目录下,让 workspace-a 和 可以一起使用这个包。

Yarn 的工作区是诸如 Lerna 这样的工具可以(并且)利用的底层机制。 它们将永远不会试图提供像 Lerna 那么高级的功能,但通过实现该解决方案的核心逻辑和 Yarn 内部的连接步骤,我们希望能够提供新的用法并提高性能。

  • workspaces 字段是一个数组,其中包含到每个工作区的路径。 如果用这种方式来跟踪每个工作区可能是比较乏味的,所以这个字段也接受了通配符模式! 例如,Babel 通过这个 packages/* 指令引用他们的所有包。

  • 在上面的示例中,如果 workspace-b 依赖于 workspace-a 的包,但是引用的是不同的版本,那么依赖包将从 Github 安装,而不是从本地文件系统链接。 这是因为一些软件包实际上需要使用以前的版本,以建立新的版本(Babel 是其中之一)。

  • 在工作区中发布包时要留心。 如果你正准备发布下一个版本,并且你决定引用一个新依赖但忘了在 中声明,你的测试仍可能在本地通过(如果其他包已经把那个引用下载到了项目根目录)。 然而其他从源中拉取包的用户就不行了,由于依赖列表现在是不完整的,他们没办法下载那个新依赖。 目前没有办法在这种情况下抛出警告。

  • 工作区必须是项目根目录的子目录。你不能也不应当引用位于项目目录之外的工作区。

  • 目前尚不支持嵌套工作区。