本节我们来讲 Yarn 中的依赖与版本。软件包依赖关系对于包的成功是至关重要的,当开发软件包时,我们可能会用到其他包里的现有代码来开发自己的软件包功能,那么其他包就可以称为项目的依赖项。
所有的项目依赖都在 package.json 文件中声明,每个依赖项都需要指名依赖名称和最低版本信息。而 yarn.lock 文件里保存了每个依赖的安装版本,来确保软件包在所有安装过程中保持一致。
依赖的类型
不同的依赖有着不同的目的,在构建项目时需要一些依赖项,在运行程序时也需要一些依赖项,因为有不同的依赖类型。
关于 package.json 文件可以包含的一些依赖类型如下所示:
{
"name": "my_yarn",
"dependencies": {
"package-a": "^1.1.0"
},
"devDependencies": {
"package-b": "^1.2.1"
},
"peerDependencies": {
"package-c": "^2.5.4"
},
"optionalDependencies": {
"package-d": "^3.1.0"
}
}
- dependencies:常规依赖,也就是运行代码时所需的依赖项。
- devDependencies:开发依赖,在开发工作流中某些时候需要的依赖关系,而在运行代码时则不需要。
- peerDependencies:同伴依赖,一种特殊类型的依赖项,只有在发布自己的程序包时才会出现。
- optionalDependencies:可选依赖,这种依赖即便安装失败,Yarn 也会认为整个依赖安装过程是成功的。
- bundledDependencies:打包依赖,在发布包时,这个数组里的包都将会被打包(bundle)。
依赖的版本
Yarn 的软件包遵守语义版本控制,也叫作 “semver",也就是说当我们从资源库安装一个新包,它会和语义版本范围一起被添加到我们的 package.json 文件中。
版本号可以划分为 主版本号.次版本号.修订号,类似于 1.0.0、1.1.2,不同的情况对应不同的版本号增长,如下所示:
- 主版本号:新的版本不兼容老版本的 API。
- 次版本号:新的版本新增了部分功能并向下兼容。
- 修订号:新的版本修复部分 bug 并向下兼容。
有些时候,除了版本号以后还会出现一些特殊字符,例如 >=,<,^ 和 ~ ,这些是运算符,可以用来指定版本范围。版本范围的用处是标明依赖的哪个版本会在代码中起作用。举个例子,像 >2.1.0 表示大于 2.1.0 版本、=4.3.1 表示等于 4.3.1 版本。如果不指定运算符,则表示等于某个版本。
选择性依赖项解决
Yarn 支持选择性版本解析,package.json 文件里的 resolutions 字段用于解析选择性版本,可以通过此功能自定义依赖版本。这通常需要在 yarn.lock 文件中进行手动编辑。
示例:
在 package.json 文件中添加一个 resolutions 字段用于覆盖版本定义:
{
"name": "project_name",
"version": "1.0.0",
"dependencies": {
"left-pad": "1.0.0",
"c": "file:../c-1",
"d2": "file:../d2-1"
},
"resolutions": {
"d2/left-pad": "1.1.1",
"c/**/left-pad": "1.1.2"
}
}
然后运行 yarn install 命令即可。
注意如果是下面几种情况,会出现警告:
- 定义了无效的版本解析规则,例如错写了无效的包名。
- 定义的版本解析的版本号、版本范围无效。
- 定义的版本解析规则的版本号、版本范围与原始版本范围不兼容。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。