Стабилност на пакетите в Composer

Един от доста често срещаните проблеми, които може да срещнете при работа с Composer, е объркване с определянето на нивото на стабилност на зависимостите от стабилността.

Типична ситуация, при която приложението зависи от пакет A: dev-master, което от своя страна зависи от пакет B: dev-master, кара Composer да се закълне, че не може да намери подходяща версия на пакет B .

Нека се опитаме да разберем защо това се случва и как да го поправим.

Root пакет

Във файла composer.json има такова нещо като параметри само за root. Това са опции, които се броят само за основния пакет. Вашите зависимости composer.json файлове игнорират тези опции.

Основният пакет е директорията, в която се намира файлът composer.json и където стартирате инсталацията на composer. Най-често това е основната директория на вашето приложение.

Но основният пакет също е контекст. Например имате пакет A, посочен във вашите зависимости. Докато сте в основната директория на вашето приложение, вашият пакет също е root. Но когато cd към директорията на пакет A, тогава в този контекст пакет A ще стане коренът .

И така, нивото на стабилност се задава от основния пакет и само от него.

минимална стабилност

Параметърът за минимална стабилност се използва за задаване на желаното ниво на стабилност за всички ограничения. Това е параметър само за корен и работи като долен разделител.

зависимостта

Определяне на нивото на стабилност

Да се ​​върнем към ситуацията, описана в началото на статията: приложението зависи от пакета A: dev-master, което зависи от пакета B: dev-master .

нивото

Коренът composer.json изглежда така:

Когато изпълнява инсталирането на композитор, Composer ще изпълни следните стъпки:

Определя минималната стабилност. Тъй като параметърът не е изрично зададен, стойността по подразбиране ще бъде заменена - стабилна .

Зависимост A се изисква във версията на dev-master. Благодарение на префикса dev, Composer разбира, че нивото на стабилност на този пакет е dev. Тъй като зависимостта е описана в основния пакет, пакет A имплицитно получава флага @dev .

Сега, когато пакет A има версия dev-master @ dev, композиторът започва да го инсталира. Но пакет A зависи от пакет B, който също има необходимата версия dev-master. Но тъй като зависимостта не е описана в основния пакет, пакет B не получава флага @dev. Вместо това B наследява стойността на минималната стабилност, която в нашия случай е стабилна. .

Така че пакет B се изисква в dev-master @ stable .

Тук всичко се разваля, тъй като версията dev-master @ stable по принцип не може да съществува. Ето защо Composer казва, че не може да намери пакет B с необходимото ниво на стабилност.

Знамена за стабилност

За да коригирате това състояние на нещата, можете да използвате същите флагове за стабилност, само да ги посочите изрично.

Флагът е част от версията и се брои само за основния пакет. Флаговете, дефинирани в зависими пакети, се игнорират и се заменят със стойността на минималната стабилност .

За да зададете желания флаг във версията на зависимостите от втори ред, можете просто да добавите тези зависимости към root composer.json с флага, но без да посочвате версията.

В нашия случай, за да пропуснете разработената версия на пакет Б, добавете съответния флаг:

В този случай ние делегираме определянето на версията на пакет B на пакет A, който директно зависи от B .

предпочитам-стабилен

Използването на флагове, разбира се, дава повече контрол над конкретните версии на използваните пакети, но в същото време този подход е малко излишен.

Много по-лесно е да зададете минимална стабилност като dev и не страда, но тук има подводни камъни. Пакетите, които се предлагат в няколко версии (стабилни, бета, разработчици) ще бъдат инсталирани във версията за разработчици и те не винаги могат да работят надеждно.

Това е мястото, където предпочитаният стабилен параметър е полезен. Ако посочите предпочитан-стабилен като true, тогава Composer ще инсталира най-стабилната версия на пакета и ще намали допустимото ниво на стабилност по-долу, ако не съществува.

Надявам се, че сега имате по-добро разбиране за това как композиторът определя нивата на стабилност и как да получите желания резултат от него.

Въпреки че всъщност основната причина, поради която се случват ситуации, в които трябва да се занимавате с нивата на стабилност, е, че разработчиците на пакети не маркират своите версии с правилните тагове. Сега, ако започнем сами да спазваме тези правила и изискваме същото от други разработчици, тогава няма да са необходими знамена:).