RobotLoader – cache autorebuild
- 22
- Člen | 1478
Byl jsem zvyklý, když jsem změnil název např. nějaké třídy, cache
RobotLoaderu se vytvořila znovu, což se v posledních dev verzích neděje a
končí na chybě Class not found
.
Vzhledem k tomu, že mám server na interni IP, jsem kvůli intranetistům teď detekovanej jako PRODUCTION. Musím tedy v bootstrapu nastavovat mod pomocí setProductionMode(FALSE). Navíc je s tím spojená další nepříjemnost, že se samozřejmě neobnovuje ani cache configu.
Předpokládám, že když se RobotLoader inicializuje před Configurátorem a mod nastavuji až na configurátoru, tak se sám nemá jak dozvědět, že mod je ve skutečnosti DEVELOPMENT.
Předchozí chování bylo pro mě milejší tedy. Jaký je tedy teď doporučený postup pro nastavení autorebuildingu RobotLoaderu při vynuceném PRODUCTION modu aplikace?
Editoval 22 (22. 12. 2011 14:40)
- duke
- Člen | 650
Nevím, jestli je to best practice, ale já mám kvůli tomuto v bootstrapu následující:
$configurator = new Nette\Configurator;
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->addParameters(array(
'appDir' => APP_DIR,
'libsDir' => LIBS_DIR,
'productionMode' => FALSE, // toto by mělo řešit tvůj problém
));
- 22
- Člen | 1478
@gmvasek: jo, myslel jsem si, ale výpis RobotLoaderu:
ignoreDirs => ".*, *.old, *.bak, *.tmp, temp" (29)
acceptFiles => "*.php, *.php5" (13)
autoRebuild => TRUE
list private => array(76) {
bootstrap.php
// Configure application
$configurator = new Nette\Config\Configurator;
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->setProductionMode(FALSE);
// Enable RobotLoader - this will load all classes automatically
$robotLoader = $configurator->createRobotLoader();
$robotLoader->autoRebuild = TRUE;
$robotLoader->addDirectory(APP_DIR)
->addDirectory(LIBS_DIR)
->register();
ovšem rebuild neproběhne, aspoň u mě..
- David Grudl
- Nette Core | 8228
Pokud je autoRebuild=TRUE, tak je to v pořádku, jak s tím souvisí ta omáčka o Configuratoru?
- duke
- Člen | 650
22 napsal(a):
To problém neřeší, asi jsi nevšiml, že v příspěvku zmiňuji metodu setProductionMode.
Máš pravdu. Pokládal jsem to za něco jiného, protože v době, kdy jsem tento problém řešil já, ještě tato metoda neexistovala.
Z toho co uvádíš níže se to jeví tak, že problém nemá s Configuratorem nic společného, a že se tedy týká přímo RobotLoaderu, ale to už sis jistě uvědomil sám.
EDIT: Ještě jsi vlastně uvedl, že se ti neobnovuje ani cache configu. Společným jmenovatelem je tu tedy Nette\Caching\Cache. V čem by mohl být zádrhel tam bude vědět spíš David.
Editoval duke (23. 12. 2011 1:24)
- 22
- Člen | 1478
David Grudl napsal(a):
Pokud je autoRebuild=TRUE, tak je to v pořádku, jak s tím souvisí ta omáčka o Configuratoru?
To je jen pro @duke, že mám vynucený mod DEVELOPMENT… pokud je to v pořádku, proč, když přejmenuju Model na Model1 a zase zpět, tu třídu už Nette nikdy nenajde, dokud nesmažu cache RobotLoaderu?
Editoval 22 (23. 12. 2011 6:42)
- David Grudl
- Nette Core | 8228
Ale to je úplně korektní chování, RobotLoader si pamatuje, že nějaká třída, jejíž existence se testuje přes class_exists(), neexistuje a pak ji více nehledá. Pak nezbývá než smazat cache.
- David Grudl
- Nette Core | 8228
Zkusit jsem experimentálně přidat limit, že to zkusí vícekrát, uvidíme, jak se to osvědčí.
- 22
- Člen | 1478
vyzkouším, ale v předchozích verzích se to takto nechovalo, čili mám
za to, že změna chování nastala až po změně detekce produkčního
prostředí..
Nevím, jak se hlídá cache robotLoaderu, ale předpokládál bych, že pokud
jsem na DEV prostředí, ať už detekovaném nebo vynuceném, tak změna názvu
třídy, tedy změna souboru, by měla vyvolat autoRebuilding cache..? nebo
se pletu?
Editoval 22 (23. 12. 2011 9:58)