Yarn 工作区
工作区是设置你的软件包体系结构的一种新方式,认情况下从 Yarn 1.0 开始使用。它允许你可以使用这种方式安装多个软件包, 就是只需要运行一次 `yarn install ` 便可将所有依赖包全部安装。
你的依赖包可以在一起,这意味着你的工作区可以相互依赖,同时始终使用最新的可用。 这也是比 ` yarn link ` 更好的机制,因为它只影响你工作区的依赖树,而不会影响整个系统。
你所有的项目依赖将被安装在一起,这样可以让 Yarn 来更好地优化它们。
Yarn 将使用单一的 lock ,而不是每个项目多有,这意味着更少的冲突和更容易进行检查。
在 package.json 中以下,从现在开始,我们将此目录称为 “工作区根目录”:
package.json
{ "private": true, "workspaces": ["workspace-a", "workspace-b"] }
请注意,private: true 是必需的!工作区本身不应当被发布出去,所以我们了这个安全措施以确保它不会被意外暴露。
创建这个后,再创建两个名为 ` workspace-a ` 和 ` workspace-b ` 的子夹。 在每个夹里面,创建具有以下的 ` package. json ` :
workspace-a/package.json:
{ "name": "workspace-a", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5" } }
workspace-b/package.json:
{ "name": "workspace-b", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5", "workspace-a": "1.0.0" } }
最后,在某个地方运行 ` yarn install ` ,当然最好是在工作区根目录里面。如果一切正常,你现在应该有类似这样的层次结构:
/package.json /yarn.lock /node_modules /node_modules/cross-env /node_modules/workspace-a -> /workspace-a /workspace-a/package.json /workspace-b/package.json
就是这样 ! ` workspace-b 需要在 workspace-a 中的,现在将直接使用当前项目内部的,而不是直接去从 Github 上面取。 cross-env ` 包已正确去重并放在项目的根目录下,让 ` workspace-a ` 和 ` workspace-b `可以一起使用这个包。
Yarn 的工作区是诸如 Lerna 这样的工具可以(并且)利用的底层机制。 它们将永远不会试图提供像 Lerna 那么高级的,但通过实现该案的核心逻辑和 Yarn 内部的连接步骤,我们希望能够提供新的并提高。
workspaces 字段是数组,其中包含到每个工作区的路径。 如果用这种方式来跟踪每个工作区可能是比较乏味的,所以这个字段也接受了符模式! 例如,Babel 通过这个 ` packages/* ` 指令引用他们的所有包。
工作区的稳定性足以在 large-scale 应用程序中使用,并且不应改变常规安装的运行方式,但如果你认为它们正在破坏某些东西,则可以通过将以下到你的 Yarnrc 中来禁用它们:
workspaces-experimental false
包层级在你的工作区和得到的之间将有所不同(工作区依赖将提升到系统层次结构中)。 对这个层级的假设已经是危险的,因为提升过程不是标准化的,所以理论上没有什么新东西。
在上面的示例中,如果 ` workspace-b ` 依赖于 ` workspace-a ` 的包,但是引用的是不同的版本,那么依赖包将从 Github 安装,而不是从本地系统。 这是因为一些软件包实际上需要使用以前的版本,以建立新的版本(Babel 是其中之一)。
在工作区中发布包时要留心。 如果你正准备发布下版本,并且你决定引用新依赖但忘了在 package.json 中声明,你的测试仍可能在本地通过(如果其他包已经把那个引用下载到了项目根目录)。 然而其他从源中拉取包的就不行了,由于依赖列表现在是不完整的,他们没办法下载那个新依赖。 目前没有办法种情况下抛出警告。
工作区必须是项目根目录的子目录。你不能也不应当引用位于项目目录之外的工作区。
目前尚嵌套工作区。