Při deploymentu vytvořit konteiner a kompilovat všechny šablony

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Petr Hudík
Člen | 49
+
0
-

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
+
+1
-

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
+
0
-

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?

newPOPE
Člen | 648
+
0
-

Nevytvara sa kontainer tu? Ak ano tak by malo stacit len zavolat $configurator->createContainer();

Petr Hudík
Člen | 49
+
0
-

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)

newPOPE
Člen | 648
+
0
-

Mali by

Pavel Janda
Člen | 977
+
0
-

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)