Как указывать версии для пакетов в composer.json

Вы наверняка видели всякие "^3.2", "~3.2" в файле composer.json. Давайте разберемся что значат эти знаки и поддержку каких версий пакетов они означают.

Начнем с общего примера, где показаны все возможные варианты. Пример файла composer.json:

{
  "require": {
	"author/package": ">=5.6",
	"author/package": "~2.0.14",
	"author/package": "~2.0.0",
	"author/package": "~2.0.0 || ~2.1.0",
	"author/package": "dev-master",
	"author/package": "*",
	"author/package": "2.4.1"
  },
  "require-dev": {
	"author/package": "~2.1.0",
	"author/package": "~2.1.0",
	"author/package": "~2.0.0",
	"author/package": "^4.0",
	"author/package": "^1.0",
	"author/package": "^1.0",
	"author/package": "^1.0",
	"author/package": "~0.5.0 || ~1.1.0",
	"author/package": ">=2.7 <=4.2.4"
  }
}

Точная версия

Разрешает только указанную версию пакета. Указывается явно без всяких знаков:

"erusev/parsedown": "1.7"

Диапазоны версий

Разрешает обновлять пакет в версиях указанного диапазона.

> например ">1.7"
Разрешено все что больше указанной версии.
>= например ">=1.7"
Разрешено все что больше или равно указанной версии.
< например "<1.7"
Разрешено все что меньше указанной версии.
<= например "<=1.7"
Разрешено все что меньше или равно указанной версии.
!= например "!=1.7"
Разрешено все кроме указанной версии.
* например "1.1.*"

Подстановочный знак. Означает любое число. С помощью него указывается шаблон версии.

  • 1.0.* включает в себя все версии 1.0 1.0.1 1.0.2 1.0.3 и т.д.
~ например "~1.2.3"

Оператор тильда. Позволяет повышаться последней указанной цифре.

Обычно используется для обозначения минимальной минорной версии, от которой зависит код.

  • ~1.2 тоже что >=1.2 <2.0.0 (допускает все до 2.0, но не включая 2.0).

  • ~1.2.3 тоже что >=1.2.3 <1.3.0 (допускает все до 1.3, но не включая 1.3).

Пример:

// Версия пакета больше или равна 2.0.14 но меньше 2.1
"erusev/parsedown": "~2.0.14"
^ например "^1.2.3"

Оператор каретка. Похож на тильду, только позволяет повышаться всем числам кроме первой (мажорной версии).

Обычно используется для обозначения минимальной мажорной версии. Т.е. указывает основную допустимую версию, и разрешает все вложенные (минорные) версии.

  • ^1.2.3 тоже что >=1.2.3 <2.0.0 (допускает все до 2.0, но не включая 2.0).

  • Если мажорная версия начинается с 0, то разрешает все обновления до второго числа. Т.е. для версий до 1.0 он также учитывает безопасность обновлений и рассматривает ^0.3 как >=0.3.0 <0.4.0.

Это рекомендованный оператор для максимальной совместимости при написании кода библиотеки.

Пример:

"erusev/parsedown": "^4.0"

Объединение диапазонов

Можно указать одновременно несколько диапазонов:

  , например ">2.7 <4.2.4"
Пробел или запятая между версиями означает AND.
|| например "2.0.0 || 2.1.0"
Двойная вертикальная черта означает OR.

AND приоритетнее чем OR.

Примеры:

// Больше или равно версии 2.6
"erusev/parsedown": ">=2.6"

// Больше версии 2.7  И  меньше версии 4.2.4
"erusev/parsedown": ">2.7 <4.2.4"

// Версия 2.0.0   ИЛИ   версия 2.1.0
"erusev/parsedown": "2.0.0 || 2.1.0"

Диапазон версий через дефис -

Дефис -, указывает какой набор версий подходит: от версии - до версии. Самое правое неуказанное число в версии дополняется знаком *.

Например, 1.0 - 2.0 тоже что >=1.0.0 <2.1, так как 2.0 превращается в 2.0.*.

Однако, если указать третье (последнее) число версии, то * ставить уже некуда и правая версия считается последней допустимой: 1.0.0 - 2.1.0 тоже что >=1.0.0 <=2.1.0.

Пример:

// больше или равно 2.0 но меньше 3.1
"erusev/parsedown": "2.0 - 3.0"

Ограничения стабильности

Добавьте суффикс -stable, если нужно загружать только стабильные версии.

Если никакой суффикс не указан, то Composer под капотом будет использовать -dev или -stable, в зависимости от указанного оператора:

Указанная версия Как её понимает composer
1.2.3 =1.2.3.0-stable
>1.2 >1.2.0.0-stable
>=1.2 >=1.2.0.0-dev
>=1.2-stable >=1.2.0.0-stable
<1.3 <1.3.0.0-dev
<=1.3 <=1.3.0.0-stable
1 - 2 >=1.0.0.0-dev <3.0.0.0-dev
~1.3 >=1.3.0.0-dev <2.0.0.0-dev
1.4.* >=1.4.0.0-dev <1.5.0.0-dev

Итого

"require": {
  // только верся 1.3.2
  "author/package": "1.3.2",

  // >, <, >=, <= | укажите верхние / нижние границы
  "author/package": ">=1.3.2", // все, что выше или равно 1.3.2
  "author/package": "<1.3.2",  // ниже 1.3.2

  // * | подстановочный знак
  "author/package": "1.3.*", // >=1.3.0 <1.4.0

  // ~ | позволяет быть выше последней указанной цифре
  "author/package": "~1.3.2", // >=1.3.2 <1.4.0
  "author/package": "~1.3", // >=1.3.0 <2.0.0

  // ^ | не допускает критических изменений
  "author/package": "^1.3.2", // >=1.3.2 <2.0.0
  "author/package": "^0.3.2", // >=0.3.2 <0.4.0
}

--

Офф. дока: https://getcomposer.org/doc/articles/versions.md