--- id: docs_dependency_versions guide: docs_dependencies description: docs_dependency_versions_description layout: guide --- ## Semantic Versioning Packages in Yarn follow [Semantic Versioning](http://semver.org/), also known as "semver". When you install a new package from the registry it will be added to your `package.json` with a semver version range. These versions are broken down into `major.minor.patch` and looks like one of these: `3.14.1`, `0.42.0`, `2.7.18`. Each part of the version gets incremented at various times: - Increment `major` when you make a **breaking** or **incompatible** change to the API of a package. - Increment `minor` when you add **new functionality** while staying **backwards-compatible** - Increment `patch` when you make **bug fixes** while staying **backwards-compatible** > **Note:** There are also sometimes "labels" or "extensions" to the semver > format that mark things like pre-releases or betas (e.g. `2.0.0-beta.3`) When developers talk about two semver versions being "compatible" with one another they are referring to the **backwards-compatible** changes (`minor` and `patch`). ## Version ranges When you want to specify a dependency you specify its name and a **version range** in your `package.json` like one of these: ```json { "dependencies": { "package-1": ">=2.0.0 <3.1.4", "package-2": "^0.4.2", "package-3": "~2.7.1" } } ``` You'll notice that we have a bunch of characters separate from the version. These characters, `>=`, `<`, `^`, and `~`, are **operators** and they are used to specify **version ranges**. The purpose of a version range is to specify which versions of a dependency will work for your code. #### Comparators Each version range is made up of **comparators**. These comparators are simply an _operator_ followed by a _version_. Here are some of the basic operators: | Comparator | Description | | ---------- | ---------------------------------------------------------- | | `<2.0.0` | Any version that is **_less than_** `2.0.0` | | `<=3.1.4` | Any version that is **_less than or equal to_** `3.1.4` | | `>0.4.2` | Any version that is **_greater than_** `0.4.2` | | `>=2.7.1` | Any version that is **_greater than or equal to_** `2.7.1` | | `=4.6.6` | Any version that is **_equal to_** `4.6.6` | > **Note**: If no operator is specified, then `=` is assumed in the version > range. So the `=` operator is effectively optional. #### Intersections Comparators can be joined by whitespace to create a **comparator set**. This creates an **intersection** of the comparators it includes. For example, the comparator set `>=2.0.0 <3.1.4` means _"Greater than or equal to `2.0.0` **and** less than `3.1.4`"_. #### Unions A full version range can include a **union** of multiple comparator sets joined together by `||`. If either side of the union is satisfied, then the whole version range is satisfied. For example, the version range `<2.0.0 || >3.1.4` means _"Less than `2.0.0` **or** greater than `3.1.4`"_. #### Pre-release tags Versions can also have **pre-release tags** (e.g. `3.1.4-beta.2`). If a comparator includes a version with a pre-release tag it will only match against versions that have the same `major.minor.patch` version. For example, the range `>=3.1.4-beta.2` would match `3.1.4-beta.2` or `3.1.4-beta.12`, but would _not_ match `3.1.5-beta.1` even though it is _technically_ "greater than or equal to" (`>=`) the `3.1.4-beta.2` version. Pre-releases tend to contain accidental breaking changes and usually you do not want to match pre-releases outside of the version you have specified so this behavior is useful. #### Advanced version ranges ##### Hyphen Ranges Hyphen ranges (e.g. `2.0.0 - 3.1.4`) specify an _inclusive_ set. If part of the version is left out (e.g. `0.4` or `2`) then they are filled in with zeroes. | Version range | Expanded version range | | --------------- | ---------------------- | | `2.0.0 - 3.1.4` | `>=2.0.0 <=3.1.4` | | `0.4 - 2` | `>=0.4.0 <=2.0.0` | ##### X-Ranges Any of `X`, `x`, or `*` can be used to leave part or all of a version unspecified. | Version range | Expanded version range | | ------------- | ------------------------------------------------ | | `*` | `>=0.0.0` (any version) | | `2.x` | `>=2.0.0 <3.0.0` (match major version) | | `3.1.x` | `>=3.1.0 <3.2.0` (match major and minor version) | If part of a version is left out, it is assumed to be an x-range. | Version range | Expanded version range | | ------------------------------------ | --------------------------- | | `` (empty string) | `*` or `>=0.0.0` | | `2` | `2.x.x` or `>=2.0.0 <3.0.0` | | `3.1` | `3.1.x` or `>=3.1.0 <3.2.0` | ##### Tilde Ranges Using `~` with a minor version specified allows `patch` changes. Using `~` with only major version specified will allow `minor` changes. | Version range | Expanded version range | | ------------- | --------------------------- | | `~3.1.4` | `>=3.1.4 <3.2.0` | | `~3.1` | `3.1.x` or `>=3.1.0 <3.2.0` | | `~3` | `3.x` or `>=3.0.0 <4.0.0` | > **Note:** Specifying pre-releases in tilde ranges will only match > pre-releases in that same full version. For example, the version range > `~3.1.4-beta.2` would match against `3.1.4-beta.4` but not `3.1.5-beta.2` > because the `major.minor.patch` version is different. ##### Caret Ranges Allow changes that do not modify the first non-zero digit in the version, either the `3` in `3.1.4` or the `4` in `0.4.2`. | Version range | Expanded version range | | ------------- | ---------------------- | | `^3.1.4` | `>=3.1.4 <4.0.0` | | `^0.4.2` | `>=0.4.2 <0.5.0` | | `^0.0.2` | `>=0.0.2 <0.0.3` | > **Note:** By default when you run `yarn add [package-name]` it will use a > caret range. If part of the version is left out, the missing parts are filled in with zeroes. However, they will still allow for that value to be changed. | Version range | Expanded version range | | ------------- | ---------------------- | | `^0.0.x` | `>=0.0.0 <0.1.0` | | `^0.0` | `>=0.0.0 <0.1.0` | | `^0.x` | `>=0.0.0 <1.0.0` | | `^0` | `>=0.0.0 <1.0.0` | ### More resources - For a full specification of how this versioning system works see the [`node-semver` README](https://github.com/npm/node-semver). - Test out this versioning system on actual packages using the [npm semver calculator](https://semver.npmjs.com/).