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í.

U mě na tom ztroskotal plugin login.
Tři chyby, jeden viník
Po migraci se v logu objevily postupně tyhle hlášky:
- Twig rendering failure kvůli chybějícímu
templates/adresáři u loginu - Missing
vendor/autoload.php— tedy chybějící composer závislosti - 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.