与npm的关系

yarn工作流与npm类似 都是使用package.json文件,yarn会重组node_modules文件,且不会与npm冲突,并会自动生成yarn.lock文件,保证团队依赖版本一致性,但如果之前使用了package-lock.json时,那么锁定的版本可能依然存在冲突的可能,这时需要团队之间同时切换到 Yarn。

与npm的命令对比

npm yarn
npm install yarn install
(N/A) yarn install —flat
(N/A) yarn install —har
(N/A) yarn install —no-lockfile
(N/A) yarn install —pure-lockfile
npm install [package] (N/A)
npm install —save [package] yarn add [package]
npm install —save-dev [package] yarn add [package] [—dev/-D]
(N/A) yarn add [package] [—peer/-P]
npm install —save-optional [package] yarn add [package] [—optional/-O]
npm install —save-exact [package] yarn add [package] [—exact/-E]
(N/A) yarn add [package] [—tilde/-T]
npm install —global [package] yarn global add [package]
npm rebuild yarn install —force
npm uninstall [package] (N/A)
npm uninstall —save [package] yarn remove [package]
npm uninstall —save-dev [package] yarn remove [package]
npm uninstall —save-optional [package] yarn remove [package]
npm cache clean yarn cache clean
rm -rf node_modules && npm install yarn upgrade

yarn install —production[=true|false]

如果 NODE_ENV 环境变量设为 production,Yarn 将不安装任何列于 devDependencies 的包。 使用此标志指示 Yarn 忽略 NODE_ENV 并用它取代“生产”与否的状态。

注意:—production 等同 —production=true。—prod 是 —production 的别名。

workspace

workspace是除缓存外yarn区别于npm最大的优势

作用

  1. 能帮助你更好地管理多个子project的repo,这样你可以在每个子project里使用独立的package.json管理你的依赖,又不用分别进到每一个子project里去yarn install/upfrade安装/升级依赖,而是使用一条yarn命令去处理所有依赖就像只有一个package.json一样
  2. yarn会根据就依赖关系帮助你分析所有子project的共用依赖,保证所有的project公用的依赖只会被下载和安装一次。

案例

yarn workspace并不需要安装什么其他的包,只需要简单的更改package.json便可以工作。 首先我们需要确定workspace root,一般来说workspace root都会是repo的根目录。

假设yarn workspace目录结构树如下:
image.png

根目录的package.json:

  1. {
  2. //当private为true时workspace才会被启用
  3. "private": true
  4. "workspace": ["workspace-a","workspace-b"]
  5. }

ps:workspaces属性的值为一个字符串数组,每一项指代一个workspace路径,支持全局匹配,这里的路径指的是相对于package.json的文件夹。

workspace-a子project的package.json:

  1. {
  2. "name": "workspace-a",
  3. "version": "1.0.0",
  4. "dependencies": {
  5. "cross-env": 5.0.5
  6. }
  7. }

workspace-b子project的package.json:

  1. {
  2. "name": "workspace-b",
  3. "version": "1.0.0",
  4. "dependencies": {
  5. "cross-env": "5.0.5",
  6. "workspace-a": "1.0.5"
  7. }
  8. }

在根目录执行yarn insatll
image.png
你会发现整个repo只生成了一份yarn.lock,绝大多数的依赖包都被提升到了根目录下的node_modules之内。各个子project的node_modules里面不会重复存在依赖,只会有针对根目录下cross-env的引用。不仅如此,你会发现,对于repo内部的依赖关系(比如workspace-b依赖于workspace-a),yarn也能很好的进行管理。

命令

  1. 执行单个workspace的脚本

    • 格式是:yarn workspace <workspace_name> <command>
    • 如:
      1. $ yarn workspace project1 add vue --dev project1 添加 vue 开发依赖
      2. $ yarn workspace project1 remove vue project1 移除 vue 依赖
  2. 同时执行多个workspace的脚本

    • 比如在workspace root下执行yarn workspaces run build,则会触发它下面所有workspace的build脚本。

参考资料