RobotLoader – cache autorebuild

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

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

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

To problém neřeší, asi jsi nevšiml, že v příspěvku zmiňuji metodu setProductionMode.

Editoval 22 (22. 12. 2011 20:08)

Aurielle
Člen | 1281
+
0
-

Nestačilo by prosté

$robotLoader = $configurator->createRobotLoader();
$robotLoader->autoRebuild = TRUE;
$robotLoader->addDirectory(...)->register();

?

22
Člen | 1478
+
0
-

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

Pokud je autoRebuild=TRUE, tak je to v pořádku, jak s tím souvisí ta omáčka o Configuratoru?

duke
Člen | 650
+
0
-

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

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

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

Zkusit jsem experimentálně přidat limit, že to zkusí vícekrát, uvidíme, jak se to osvědčí.

22
Člen | 1478
+
0
-

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)

22
Člen | 1478
+
0
-

David Grudl napsal(a):

Zkusit jsem experimentálně přidat limit, že to zkusí vícekrát, uvidíme, jak se to osvědčí.

zdá se, že poslední v poslední dev to teď to funguje. Tedy po přejmenovaní např. modelu na model1 a zpět, tuto třídu opět najde.