1

本节我们来讲 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 命令即可。

注意如果是下面几种情况,会出现警告:

  • 定义了无效的版本解析规则,例如错写了无效的包名。
  • 定义的版本解析的版本号、版本范围无效。
  • 定义的版本解析规则的版本号、版本范围与原始版本范围不兼容。

知否
221 声望177 粉丝

Skrike while the iron is hot.


下一篇 »
Yarn工作区