Краткое описание версионности пакетов Composer (зависимостей проекта).

Зависимости проекта указываются в файле composer.json. Пример файла:

"require": {
  "php": ">=8.2.0",
  "yiisoft/yii2": "~2.0.45",
  "yiisoft/yii2-bootstrap5": "~2.0.2",
  "yiisoft/yii2-symfonymailer": "~2.0.3",
  "la-haute-societe/yii2-save-relations-behavior": "*",
  "paulzi/yii2-nested-sets": "^1.1"
},
"require-dev": {
  "yiisoft/yii2-debug": "~2.1.0",
  "yiisoft/yii2-gii": "~2.2.0",
  "yiisoft/yii2-faker": "~2.0.0",
  "phpunit/phpunit": "~9.5.0",
  "codeception/codeception": "^5.0.0 || ^4.0",
  "codeception/lib-innerbrowser": "^4.0 || ^3.0 || ^1.1",
  "codeception/module-asserts": "^3.0 || ^1.1",
  "codeception/module-yii2": "^1.1",
  "codeception/module-filesystem": "^3.0 || ^2.0 || ^1.1",
  "codeception/verify": "^3.0 || ^2.2",
  "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4"
}

В секцию require ставятся пакеты, которые в работе приложения играют ключевую роль. От них зависит весь остальной код приложения.

В секцию require-dev устанавливаются пакеты, которые требуются при разработке приложения. Например, пакет codeception/codeception необходим только при разработке приложения для его тестирования. На боевом сервере нет необходимости "подтягивать" пакеты dev окружения. Поэтому и команда для композера в "проде" будет с указанием флага --no-dev:

composer install --no-dev

Шпаргалка по командам Composer здесь.

Вы можете указать точную версию пакета. Composer установит эту версию и только её:

"twig/twig": "2.4.1"

Используя операторы сравнения, вы можете указать диапазоны допустимых версий. Допустимые операторы: >, >=, <, <=, !=.

Вы можете определить несколько диапазонов. Диапазоны, разделенные пробелом ( ) или запятой (,) будут рассматриваться как логическое И (AND). Двойная вертикальная черта (||) будет обрабатываться как логическое ИЛИ (OR). И (AND) имеет более высокий приоритет, чем ИЛИ (OR).

Примечание!

Будьте осторожны при использовании неограниченных диапазонов, так как вы можете неожиданно установить версии, которые нарушают обратную совместимость. Вместо этого рассмотрите возможность использования оператора каретки в целях безопасности.

Примеры:

// Больше либо равно версии 5.6
"php": ">=5.6"
// Больше либо равно версии 2.7 И меньше либо равно версии 4.2.4
"symfony/browser-kit": ">=2.7 <=4.2.4"
// Версия 2.0.0 ИЛИ версия 2.1.0
"package-name": "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
"package-name": "2.0 - 3.0"

Вы можете указать шаблон с подстановочным знаком *. 1.0.* эквивалентно >=1.0 <1.1.

Пример:

// Версия пакета больше либо равна 1.0 И меньше 1.1
"package-name": "1.0.*"
// Любая версия этого пакета
"fishvision/yii2-migrate": "*"

Оператор ~ лучше всего поясняется на примере: ~1.2 эквивалентен >=1.2 <2.0.0, а ~1.2.3 эквивалентен >=1.2.3 <1.3.0. Как видите, это в основном полезно для проектов, поддерживающих семантическое управление версиями. Обычно используется для обозначения минимальной дополнительной версии, от которой вы зависите, например, ~1.2 (которая допускает все до, но не включая 2.0). Поскольку теоретически не должно быть разрывов обратной совместимости до версии 2.0, это хорошо работает. С другой стороны, использование ~ указывает минимальную версию, но позволяет последней указанной цифре повышаться.

Пример:

// Версия пакета больше либо равна 2.0.14 И меньше 2.1
"yiisoft/yii2": "~2.0.14"

Оператор ^ ведет себя очень похоже с оператором тильда, но он ближе к семантическому управлению версиями и всегда разрешает неразрывные обновления. Например, ^1.2.3 эквивалентен >=1.2.3 <2.0.0, поскольку ни один из выпусков до 2.0 не должен нарушать обратную совместимость. Для версий до 1.0 он также действует с учетом требований безопасности и рассматривает ^0.3 как >=0.3.0 <0.4.0.

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

Пример:

"codeception/codeception": "^4.0"

Если вы используете ограничение, которое явно не определяет стабильность, Composer внутренне по умолчанию будет использовать -dev или -stable, в зависимости от используемых операторов. Это происходит прозрачно.

Если вы хотите явно рассматривать только стабильную версию в сравнении, добавьте суффикс -stable.

Примеры:

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": {
  "vendor/package": "1.3.2", // exactly 1.3.2

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

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

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

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

Официальная документация здесь .