yran简介及workspace的使用

1,004 阅读5分钟

Yarn是什么?

Yarn 对我们的代码来说是一个包管理器。它可以让我们使用并分享 全世界开发者的(例如 JavaScript)代码。 Yarn 能够快速、安全、 并可靠地完成这些工作,所以你不用有任何担心。

通过Yarn我们可以使用其他开发者针对不同问题的解决方案,使自己的开发过程更简单。 使用过程中遇到问题,我们可以将其上报或者贡献解决方案。一旦问题被修复, Yarn会更新保持同步。

代码通过 包(package)  (或者称为 模块(module) ) 的方式来共享。 一个包里包含所有需要共享的代码,以及描述包信息的文件,称为 package.json 。

“Yarn是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具 ,正如官方文档中写的,Yarn 是为了弥补 npm 的一些缺陷而出现的。”这句话让我想起了使用npm时的坑了:

  • npm install的时候巨慢。特别是新的项目拉下来要等半天,删除node_modules,重新install的时候依旧如此。
  • 同一个项目,安装的时候无法保持一致性。由于package.json文件中版本号的特点,下面三个版本号在安装的时候代表不同的含义。
"5.0.3",
"~5.0.3",
"^5.0.3"

“5.0.3”表示安装指定的5.0.3版本,“~5.0.3”表示安装5.0.X中最新的版本,“^5.0.3”表示安装5.X.X中最新的版本。这就麻烦了,常常会出现同一个项目,有的同事是OK的,有的同事会由于安装的版本不一致出现bug。

  • 安装的时候,包会在同一时间下载和安装,中途某个时候,一个包抛出了一个错误,但是npm会继续下载和安装包。因为npm会把所有的日志输出到终端,有关错误包的错误信息就会在一大堆npm打印的警告中丢失掉,并且你甚至永远不会注意到实际发生的错误

下载及安装

通过 Chocolatey 安装

Chocolatey 是一个 Windows 专用的软件包管理工具。 请按照此 说明 安装 Chocolatey 。

安装 Chocolatey 之后,你就可以在控制台执行如下命令安装 Yarn 了:

choco install yarn

这也会确保你安装了 Node.js 。

通过 Scoop 安装

Scoop 是一个用于 Windows 的基于命令行的安装工具。 请按照此 说明 安装 Scoop 。

Scoop 安装后,你就可以在控制台执行如下命令安装 Yarn 了:

scoop install yarn

如果 Node.js 未被安装,scoop 会提示你安装。 例如:

scoop install nodejs

注意

请将你的项目目录和 Yarn 的缓存目录 (%LocalAppData%\Yarn) 列入杀毒软件的白名单中,否则会因为每次向磁盘写入文件时而被扫描,导致安装软件包变得很慢。

通过如下命令测试 Yarn 是否安装成功:

yarn --version

使用方法

初始化一个新项目

yarn init

添加依赖包

yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]

将依赖项添加到不同依赖项类别中

分别添加到 devDependenciespeerDependencies 和 optionalDependencies 类别中:

yarn add [package] --dev
yarn add [package] --peer
yarn add [package] --optional

升级依赖包

yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]

移除依赖包

yarn remove [package]

安装项目的全部依赖

yarn

或者

yarn install
  1. yarn工作流
    yarn工作流与npm类似 都是使用package.json文件,yarn会重组node_modules文件,且不会与npm冲突,并会自动生成yarn.lock文件,保证团队依赖版本一致性,但如果之前使用了package-lock.json时,那么锁定的版本可能依然存在冲突的可能,这时需要团队之间同时切换到 Yarn;
  2. yarn-cli命令行工具常见命令
    对于经常用到的项目初始化,对包的安装、卸载、升级、发布等操作,Yarn 都提供了丰富而简洁的命令:

**

yarn add <package...> [option]:为当前正在开发的包新增一个依赖包,默认添加到 dependencies 中; yarn global <add/bin/list/remove/upgrade> [--prefix]:yarn global 注意,这两个词整体作为一个命令前缀; yarn init:交互式创建或更新 package.json 文件; yarn [install]:安装 package.json 文件里定义的所有依赖包; yarn publish:发布一个包到包管理器; yarn remove:从当前包里移除一个未使用的包

workspace的介绍和使用。

workspace的介绍和使用。
workspace是除缓存外yarn区别于npm最大的优势

  1. workspace的作用:
    (1). 能帮助你更好地管理多个子project的repo,这样你可以在每个子project里使用独立的package.json管理你的依赖,又不用分别进到每一个子project里去yarn install/upfrade安装/升级依赖,而是使用一条yarn命令去处理所有依赖就像只有一个package.json一样
    (2). yarn会根据就依赖关系帮助你分析所有子project的共用依赖,保证所有的project公用的依赖只会被下载和安装一次。
  2. workspace的使用
    yarn workspace并不需要安装什么其他的包,只需要简单的更改package.json便可以工作。 首先我们需要确定workspace root,一般来说workspace root都会是repo的根目录

yarn workspace目录结构树:

12564775-6eb7783e32e44b13.webp

  • package.json:

**

{
    //privatetrue时workspace才会被启用
    "private": true"workspace": ["workspace-a","workspace-b"]
}
workspaces属性的值为一个字符串数组,每一项指代一个workspace路径,支持全局匹配,这里的路径指向指的是package.json所在文件夹文件夹名。
  • workspace-a子project的package.json

**

{
    "name": "workspace-a",
    "version": "1.0.0",
    "dependencies": {
        "cross-env": 5.0.5
    }
}
  • workspace-b子project的package.json

**

{
    "name": "workspace-b",
    "version": "1.0.0",
    "dependencies": {
        "cross-env": "5.0.5",
        "workspace-a": "1.0.5"
    }
}
  • 在根目录执行yarn insatll

12564775-c5cc06a3c8c4a422.webp

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

    1. yarn workspace并没有像lerna那样封装大量的高层API,整个workspace整体上还是依赖于整个yarn命令体系。
    2. workspace不能嵌套(只能有一个根workspace)
    3. workspace采用的是向上遍历,所以workspace并不能识别根workspace之外的依赖。
      参考资料: yarn中文文档