Pri aktualizácii Laravelu na hlavnú verziu to môže byť priamočiare, ale väčšinou to tak nie je. Osobne s tým vždy zápolím a zvyčajne strávim oveľa viac času, ako som čakal. To platí obzvlášť vo väčších projektoch, kde môže byť viacero závislostí, pretože každá z nich môže predĺžiť proces aktualizácie.

Chybová správa sa väčšinou scvrkne na niečo podobné tomuto úryvku:

Running composer update laravel/framework --with-all-dependencies
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires laravel/framework *, found laravel/framework[x.x.x] but these were not loaded, likely because it conflicts with another require.

Chyba nie je príliš podrobná a v Composeri pred verziou 2.0 bola pravdepodobne ešte menej výrečná.

Riešenie závislostí #

Vyššie uvedená chyba je zvyčajne dlhšia a obsahuje niekoľko náznakov o konfliktnom balíku, no väčšinou niekde hlbšie. Venujte pozornosť celému výstupu. S najväčšou pravdepodobnosťou je aktuálne uzamknutá verzia nejakého balíka nedostupná pre verziu Laravelu, ktorú sa snažíte nainštalovať.

Aby som zistil, aká verzia je skutočne nainštalovaná, zvyčajne robím:

composer show | grep <package>

Potom navštívim https://packagist.org/ a hľadám najnižšiu verziu konfliktného balíka, ktorá podporuje to, čo sa snažím nainštalovať. Ilustrujme to na príklade balíka laravel-fractal. Príklad pre aktuálne nainštalovanú verziu:

Verzia 5.8.1 balíka laravel-fractal podporuje nižšiu verziu illuminate

Nasledujúca hlavná verzia správne podporuje náš cieľ:

Verzia 6.0.0 balíka laravel-fractal podporuje vyššiu verziu illuminate

Prečo najnižšiu, pýtate sa? Pretože v väčších projektoch veci niekedy nie sú také na ostri noža, aké by mohli byť, a medzitým môže byť aj najnovšia vydaná verzia konfliktného balíka mimo rozsahu, ale z druhej strany spektra.

Poznámka: Skontrolujte tiež verziu php vyžadovanú balíkom, pretože to je tiež bežný zdroj konfliktov pri aktualizácii balíkov, ktoré hlási composer.

Žiadna verzia balíka nepodporuje môj cieľ? #

Čo ak žiadna verzia balíka zobrazená na packagist nemá obmedzenia, ktoré zodpovedajú mojim cieľovým požiadavkám? No, to sa tiež stáva. V takom prípade aktualizácia nie je taká priamočiara. Zvyčajne v tom prípade nahradím vzdialený balík lokálnym forkom, kde manuálne aktualizujem nič iné ako požiadavky v composer daného balíka.

Je to však väčšinou veľká bolesť a mimo rozsahu tohto článku, ale ak sa to urobí správne, posunie vás ďalej. Ďalšia užitočná vec, ktorú robím, je otvoriť Pull Request do pôvodného repozitára s jedinou zmenou v composer.json, ktorú som urobil. Majte na pamäti, že stojí za to zahrnúť do toho Pull Requestu aj aktualizácie README.md. Ak nie je potrebné nič iné meniť, maintainer môže žiadosť akceptovať tak skoro, že možno ani nebudete musieť nútiť composer prijať lokálny balík vôbec (záleží od toho, koľko času máte).

Ako upgradovať #

Keď viem cieľovú verziu, na ktorú chcem balík dostať, ďalší veľký problém je, že zvyčajne viacero balíkov treba upgradovať naraz. Jednoducho sa nechcú upgradovať jeden po druhom kvôli prísnym obmedzeniam, čiastočne ilustrovaným na vyššie uvedených screenshotoch.

Zvyčajne nastavím cieľové verzie do composeru pre každý jednotlivý balík najprv bez aktualizácie takto:

composer require --no-update spatie/laravel-fractal "^6"
composer require --no-update laravel/framework "^9"

Poznámka: dvojité úvodzovky okolo čísla verzie nie sú v bash ani potrebné, avšak v závislosti od konfigurácie shellu môžu byť nevyhnutné. Napríklad, zsh môže byť nakonfigurovaný cez setopt EXTENDED_GLOB, čo spôsobí, že znak ^ bude spracovaný inak.

Potom sa pokúsim aktualizovať celú vec:

composer update --with-all-dependencies spatie/laravel-fractal laravel/framework

Takýto príkaz môže prebehúť alebo môže vypísať konflikty, ale takto je ľahké iterovať v malých krokoch a metodicky upravovať závislosti, aby zodpovedali požadovanému výsledku.

Čo s dev závislosťami? #

Niekedy počas takejto väčšej aktualizácie potrebujem upraviť aj uzamknuté verzie dev závislostí. Dev závislosti sú umiestnené pod require-dev v composer.json. To môže byť trochu zradné. Napríklad:

phpunit/phpunit is currently present in the require-dev key and you ran the command without the --dev flag, which will move it to the require key.
Do you want to move this requirement? [no]? yes
./composer.json has been updated

Ako vidíte, napísal som yes do promptu na potvrdenie. Je jednoduchšie presunúť niektoré dev závislosti do normálnych závislostí kvôli aktualizácii. Teraz môže byť projekt upgradovaný takto:

composer update --with-all-dependencies spatie/laravel-fractal laravel/framework phpunit/phpunit

Po upgradovaní môžem všetky dev závislosti presunúť späť takto:

composer reqiure --dev phpunit/phpunit

Potvrďte opäť zadaním yes.

Poznámka: Manuálna úprava composer.json sa neodporúča.

Dôvod tohto presúvania balíkov tam a späť je, že Composer zdá sa buď aktualizuje závislosti, alebo dev závislosti, nie obe súčasne. Veľa šťastia!

Odkazy #