# 深入浅出 Yarn 包管理工具

# workspace

  • 开发多个互相依赖的package时,workspace会自动对package的引用设置软链接(symlink),比yarn link更加方便,且链接仅局限在当前workspace中,不会对整个系统造成影响
  • 所有package的依赖会安装在最根目录的node_modules下,节省磁盘空间,且给了yarn更大的依赖优化空间
  • 所有package使用同一个yarn.lock,更少造成冲突且易于审查

# 如何使用workspace

根目录的package.json设置:

{
  "name": "yarn-workspace-demo",
  "version": "1.0.0",
  "private": true,
  "workspaces": [
    "packages/*"
  ],
}
1
2
3
4
5
6
7
8

TIP

  • private:根目录一般是项目的脚手架,无需发布,"private": true会确保根目录不被发布出去。
  • workspace:声明workspacepackage的路径。值是一个字符串数组,支持Glob通配符。其中"packages/*"是常见写法,也可以枚举所有package"workspaces": ["package-a", "package-b"]
  • yarn workspace <package_name> <command>:在指定的package中运行指定的命令
  • yarn workspaces run <command>:在所有package中运行指定的命令,若某个package中没有对应的命令则会报错
  • yarn workspaces info [--json]:查看项目中的workspace依赖树
  • yarn <add|remove> <package> -W-W: --ignore-workspace-root-check ,允许依赖被安装在workspace的根目录

TIP

Yarn workspace只会在根目录安装一个node_modules,这有利于提升依赖的安装效率和不同package间的版本复用。而Lerna默认会进到每一个package中运行yarn/npm install,并在每个package中创建一个node_modules。 目前社区中最主流的方案,也是yarn官方推荐的方案,是集成yarn workspacelerna。使用yarn workspace来管理依赖,使用lerna来管理npm包的版本发布。