Při deploymentu vytvořit konteiner a kompilovat všechny šablony
- Petr Hudík
- Člen | 49
Dobrý den, ahoj,
Motivace: vytvářím vlastní build script a chtěl bych, aby součástí buildu bylo vygenerování celého konteineru a cache všech šablon.
V současné době po nasazení nové verze na web promažu celou složku
temp/cache
. A Nette se po prvních requestech postará
o vygenerování. Ale jak se web rozrůstá tak toto generování trvá dlouhé
(a cenné) vteřiny. Proto bych rád vytvářel cache již při buildu, který
může klidně nějakou dobu běžet a pak při nahrazení by vše šlapalo
rychle. Je má úvaha správná? používáte někdo podobný přístup?
Pokusil jsem se takový skript sestavit, který stačí zavolat z CLI:
<?php
/** @var \Nette\DI\Container $container */
$container = require __DIR__ . '/../app/bootstrap.php';
/** @var \Nette\Bridges\ApplicationLatte\ILatteFactory $latteFactory */
$latteFactory = $container->getByType('Nette\Bridges\ApplicationLatte\ILatteFactory');
/** @var \Latte\Engine $latte */
$latte = $latteFactory->create();
// později projde všechny šablony, nyní na zkoušku alespoň tato jedna:
$latte->compile(__DIR__ . '/../app/templates/@layout.latte');
?>
Bohužel tento skript skončí chybou:
exception 'Latte\CompileException' with message 'Unknown macro {control} in .../templates/@english.latte:28' in .../vendor/latte/latte/src/Latte/Compiler.php:563
Stack trace:
#0 .../vendor/latte/latte/src/Latte/Compiler.php(399): Latte\Compiler->expandMacro('control', 'css', '', NULL)
#1 .../vendor/latte/latte/src/Latte/Compiler.php(241): Latte\Compiler->openMacro('control', 'css', '', true)
#2 .../HelpForEnglish/vendor/latte/latte/src/Latte/Compiler.php(108): Latte\Compiler->processMacroTag(Object(Latte\Token))
#3 .../vendor/latte/latte/src/Latte/Engine.php(135): Latte\Compiler->compile(Array, 'Template27e6c61...')
#4 .../bin/build.php(22): Latte\Engine->compile('...')
#5 {main}
Dodám, že šabloně je uvedeno makro {control css}
které se
vygeneruje z Webloaderu, ale
to by při kompilaci šablony vadit nemělo.
Vždycky jsem si myslel, že makro control
je výchozí makro a
není nutné ho samostatně registrovat – viz https://latte.nette.org/en/tags#…
- enumag
- Člen | 2118
UIMacros, kam patří i {control}
přidává až TemplateFactory.
Takže zkus cca tohle:
/** @var \Nette\Application\UI\ITemplateFactory $templateFactory */
$templateFactory = $container->getByType('Nette\Application\UI\ITemplateFactory');
/** @var \Latte\Engine $latte */
$latte = $templateFactory->createTemplate()->getLatte();
Editoval enumag (3. 5. 2015 10:20)
- Petr Hudík
- Člen | 49
Děkuji za odpověď. Upravil jsem daný skript, zdá se že to funguje – šablonky se určitě kompilují a pokud správně krokuji, tak se při prvních requestech nekompilují znovu. Zde je upravený kód:
<?php
/** @var \Nette\DI\Container $container */
$container = require __DIR__ . '/../app/bootstrap.php';
/** @var \Nette\Application\UI\ITemplateFactory $templateFactory */
$templateFactory = $container->getByType('Nette\Application\UI\ITemplateFactory');
echo "TemplateFactory \n";
/** @var \Latte\Engine $latte */
$latte = $templateFactory->createTemplate()->getLatte();
foreach (\Nette\Utils\Finder::findFiles('*.latte')->from(__DIR__ . '/../app') as $file) {
$fileName = $file->getRealPath();
$tempFile = $latte->getCacheFile($fileName);
$code = $latte->compile($fileName);
file_put_contents($tempFile, $code);
}
?>
Rád bych se vrátil k původní otázce – má někdo s vytvářením conteineru zkušenosti? řešili jste stejný problém, nebo to necháváte být?
- Petr Hudík
- Člen | 49
newPOPE napsal(a):
Nevytvara sa kontainer tu? Ak ano tak by malo stacit len zavolat
$configurator->createContainer();
Ano vytváří. V mém kódu vkládám soubor bootstrap.php, který funkci createContainer() volá, tím mám zajištěno, že se konteiner zavolá se stejnými parametry jako v normálním běhu programu.
Pokud tomu správně rozumím, tak tím, že kód výše zavolám při deploymentu, tak se při prvních requestech nebude muset vytvářet cache a proběhnou stejně rychle.
Editoval Petr Hudík (7. 5. 2015 11:20)
- Pavel Janda
- Člen | 977
Upravil jsem daný skript, zdá se že to funguje – šablonky se určitě kompilují a pokud správně krokuji, tak se při prvních requestech nekompilují znovu.
Pokud nad latteFactory nevoláš setAutoRefresh(TRUE)
, tak se
ani kompilovat znovu nemohou. V defaultním chování Nette v produkčním
režimu vůbec stáří cache šablon nekontroluje. Stačí, že tam jsou.
Editoval Beton (7. 5. 2015 14:30)