Migrace: jedna chyba, tři různé hlášky

Před pár týdny jsem konečně přesunul ondrejsramek.cz z Grav 1.x na Grav 2.0. Na papíře nic dramatického — oficiální grav-plugin-migrate má za úkol přesně tohle: projet instalaci, upgradnout jádro a přepsat konfigurace do nového formátu. Realita byla samozřejmě o něco zajímavější, a tenhle post je hlavně o tom, jak jedna neúplná instalace pluginu dokázala vygenerovat tři na první pohled nesouvisející chyby.

Co migrace udělala a co ne

grav-plugin-migrate funguje dobře v tom, na co je určený — jádro Gravu a kompatibilita YAML konfigurací proběhly bez problémů. Co ale nástroj neřeší, jsou composer závislosti jednotlivých pluginů. Pokud měl plugin v Grav 1.x vlastní vendor/ adresář, migrace ho nijak neaktualizuje ani nekontroluje, jestli je pro Grav 2.0 kompatibilní.

migrate-grav.webp

U mě na tom ztroskotal plugin login.

Tři chyby, jeden viník

Po migraci se v logu objevily postupně tyhle hlášky:

  1. Twig rendering failure kvůli chybějícímu templates/ adresáři u loginu
  2. Missing vendor/autoload.php — tedy chybějící composer závislosti
  3. ShortcodeCore warning: Directory not found => .../login/classes/shortcodes

První dva instinktivně dávaly smysl jako související problém. Ten třetí vypadal jako samostatná záhada — ShortcodeCore přece kontroluje shortcody, co s tím má společného přihlašovací plugin?

Odpověď: nic specifického. ShortcodeCore při startu prochází všechny nainstalované pluginy a hledá u nich classes/shortcodes složku. Pokud plugin žádné shortcody nemá, dostanete tenhle warning běžně a nic to neznamená. V mém případě to ale byl jen další symptom stejné příčiny — neúplné instalace pluginu jako celku, ne jen chybějících vendor dependencies.

Proč se to vůbec stalo

Nejpravděpodobnější vysvětlení: vendor/ adresáře bývají u řady deploy/backup nástrojů automaticky ignorované — buď proto, že se řídí .gitignore pravidly, nebo protože je backup skript rovnou považuje za "cache" a přeskočí je. GPM přitom o instalaci nic netuší — plugin má svůj blueprints.yaml, je zaregistrovaný v GPM databázi, takže se navenek tváří jako v pořádku. Realita na disku je ale jiná.

Řešení

Nakonec šlo o jednoduchý force reinstall:

cd user/plugins
rm -rf login
bin/gpm install login -f

Případně, pokud composer na serveru běžně používám, šlo by to i přes:

cd user/plugins/login
composer install --no-dev

Po reinstalaci zmizely všechny tři chyby najednou — což jen potvrdilo, že šlo o jeden problém se třemi projevy, ne tři samostatné bugy.

Ponaučení pro příště

Pokud nasazuju přes git/rsync na produkci, stojí za zvážení, jestli composer závislosti pluginů (případně i Gravu samotného) opravdu patří do .gitignore. Buď je potřeba do deploy procesu přidat krok, který po checkoutu projede pluginy a spustí composer install, nebo je pro menší weby jednodušší rovnou vendor/ commitovat do repa a mít jistotu, že tam je vždy to, co má být.

Velmi pravděpodobně za tím stojí kombinace migrace hostingu (změnila se struktura uživatelského adresáře) a zároveň prvotní instalace Grav velmi dávno. Všechno to po sobě něco zanechalo a pak se to všechno sečetlo. Čistá instalace by byla jiná písnička.