toFrankie / blog

种一棵树,最好的时间是十年前。其次,是现在。
20 stars 1 forks source link

初试 Yarn Workspaces #282

Open toFrankie opened 1 year ago

toFrankie commented 1 year ago

配图源自 Freepik

示例 👉 toFrankie/yarn-workspaces-demo

Usage

查看 workspaces

# 查看 Workspace 信息
$ yarn workspaces info

执行脚本命令

# 在某个 workspace 中执行脚本命令
$ yarn workspace <workspace-name> <command>

# 在所有 workspace 中执行脚本命令
$ yarn workspaces run <command>

添加依赖

# 在某个 workspace 中添加依赖
$ yarn workspace <workspace-name> add <package>

*以上为 Yarn 1.x 命令,而 2.x 部分有调整,详看这里

软链接查找

假设我们项目的 Workspaces 如下,

{
  "@workspace/project-1": {
    "location": "packages/project-1",
    "workspaceDependencies": ["@workspace/common"],
    "mismatchedWorkspaceDependencies": []
  },
  "@workspace/project-2": {
    "location": "packages/project-2",
    "workspaceDependencies": [],
    "mismatchedWorkspaceDependencies": []
  },
  "@workspace/common": {
    "location": "packages/common",
    "workspaceDependencies": [],
    "mismatchedWorkspaceDependencies": []
  }
}

可以看到,其中 @workspace/project-1 依赖了 @workspace/common,所以 workspaceDependencies 不为空。反之,没有引用的话就为空数组。

假设,我们在 project-1 中引用了 common 中的导出模块,如下:

// packages/common/index.js
export const config = { name: 'Frankie', age: 20 }
// packages/project-1/index.js
import { config } from '@workspace/common'
console.log(config)

project-1 中查找 @workspace/common 时:

  1. 先查找 project-1 是否存在对应版本的 @workspace/common,若找不到继续往下;
  2. 查找 workspace-root 是否存在对应版本的 @workspace/common,若找不到继续往下;
  3. 查找 NPM 平台是否存在对应版本的 @workspace/common,若找到会拉取下来,若找不到继续往下;
  4. 抛出错误 Not Found。

References