Jeden řádek barvy
Čtenář změnil jednu barvu okraje v site.css, spustil nové sestavení a čekal, zatímco sestavení vytvořilo, bajt po bajtu, každou stránku, která už existovala. Zeptal se proč. Odpovědí bylo jedno slovo v jednom seznamu a 1.7 ho odstraňuje.
Co si sestavení zapisuje
Od 1.6 si sestavení vede záznam o tom, co vstoupilo do každé stránky, kterou zapsalo – příspěvek, příspěvky kolem něj, štítky, čísla, která stránka počítá. Při dalším sestavení se stránka, jejíž záznam se nezměnil, vůbec nevykresluje. Ne že by se vykreslila a pak shledala shodnou – nevykreslí se. Souhrn na konci říká, kolik stránek zůstalo netknutých; to je první číslo, na které se podívat, když je sestavení pomalé.
Záznam platí jen po dobu, kdy engine, který ho zapsal, je týž engine, a proto visí na otisku toho, z čeho se engine skládá – souborů v templates/, lib/, build/, locales/ a config/, hašovaných podle obsahu, ne podle času změny. Změň cokoli z toho a záznam se zahodí celý, protože cokoli z toho může změnit každou stránku.
Proč barva stála celý archiv
Do 1.7 byl na tom seznamu i adresář assets/, a v assets/ bydlí stylesheety.
Stránka svůj stylesheet neobsahuje. Nese na něj <link>, a v tom odkazu není žádné ?v= – verze zapečená do adresy by způsobila, že se každá stránka změní při každé úpravě CSS, tentýž problém v jiném kabátě. Bajty vykreslené stránky se tedy nemohou pohnout, když se pohne site.css. Otisk pokrýval soubor, který žádná stránka nikdy nedržela.
Změřeno v kopii enginu na testovacím webu s 270 příspěvky: nové sestavení, které nic nemění, přeskočí všech 378 stránek, na které se cache ptá, a přidání pravidla do site.css jich přeskočí stále 378. Vrať assets zpět do otisku – chování 1.6 – a táž úprava nepřeskočí žádnou.
Nic se tím nevzdává. Soubory v assets/ se při každém sestavení porovnávají se svými zveřejněnými kopiemi cestou, která se do tohoto záznamu nikdy nedívala. Úprava se na web dostane jako vždy, a nyní stojí ten jeden soubor a nic víc.
Co se otiskuje dál a co to stojí
config/ na seznamu zůstal a paleta je jeden z důvodů, proč musel.
Barvy v config/site.yml se nečtou ze stylesheetu. Ony ho vytvářejí – assets/css/colors.css sestavení zapisuje, nekopíruje ho ze stromu – a jedna z nich se do stránek dostává ještě druhou cestou: světlá a tmavá theme-color v hlavičce každé stránky, kterou layout vykresluje, je pozadí palety. Změň bg a každá z těch stránek se opravdu liší. Jejich nové sestavení znamená, že záznam má pravdu.
Změň accent a žádná stránka se nepohne. Žije jen ve vygenerovaném stylesheetu, a web se přesto sestaví znovu: otisk se bere přes celé stromy, ne přes klíče uvnitř nich, takže změna config/site.yml zahodí celý config/. Na témže testovacím webu ta úprava nepřeskočila nic a vykreslila všech 378. Je to cena, kterou toto vydání sňalo z assets/ a záměrně ponechalo na menším místě – strom je hrubá věc k hašování a hrubý otisk chybuje směrem k práci navíc. Strom patří do otisku tehdy, když stránka může držet jeho obsah; odkazovat není držet.
Kdy se záznamu nevěří
- Při prvním sestavení po aktualizaci. Toto vydání změnilo
lib/build_cache.rb, alib/je v otisku, takže první sestavení na 1.7 vykreslí všechno. Engine, který by vypočítával, kterých stránek se úprava šablony dotkne, by se jednou zmýlil, a zmýlit se tu znamená živý web, který servíruje zastaralý markup, aniž by to cokoli hlásilo. - U skutečností, které sestavení záznamu předává jménem, ne hašováním stromu: menu, jaké typy obsahu archiv drží, adresa, na které je zveřejněn, a časové pásmo – pojmenované obsahem svého souboru zoneinfo, takže aktualizace systému, která přepíše pravidla tvého pásma, záznam zahodí, místo aby na přeskočených stránkách nechala staré časy.
- U každé stránky, jejíž zveřejněný soubor byl smazán nebo se od zápisu sestavením změnil ve velikosti či čase. Záznam se kontroluje proti tomu, co je na disku, nikdy jen sám proti sobě.
- U záznamu, který chybí, je zapsaný napůl nebo nejde přečíst. Smazat
.build_cache.jsonje vždy bezpečné a stojí jedno pomalé sestavení. - U sestavení, které uprostřed zhavarovalo. Nezapíše žádný záznam, protože záznam o napůl zapsaném webu by přiměl příští sestavení přeskočit tu polovinu, která se nikdy nezapsala.
./blog.sh rebuild --full je přepínač pro všechno ostatní: vykreslit vše, porovnat vše, nevěřit ničemu. Je to nouzový východ a zároveň způsob, jak se záznam testuje: sestavení z cache a plné sestavení nad tímtéž obsahem musí dát bajt po bajtu shodné stromy.
Co to stojí
Bez verze v adrese je doručení změněného stylesheetu čtenáři úkolem hostingu: funguje to tam, kde soubory nesou ETag a při každém načtení se znovu ověřují, a hosting, který cachuje tvrdě, bude servírovat starý, dokud nevyprší. A zpětného datování se to netýká: příspěvek datovaný do roku 2003 posune každou stránku výpisu mezi titulní stranou a místem, kam dopadne, a ty stránky se opravdu změnily.

Komentáře