konfigurace RobotLoaderu v config.ini

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

Narazil jsem na problém s konfigurací Robotloaderu (rev. 7c147b1). Vycházel jsem ze změn popsaných Davidem.

Pokud v config.ini zadám tohle:

service.Nette-Loaders-RobotLoader.option.directory[] 	= %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] 	= %libsDir%
service.Nette-Loaders-RobotLoader.option.directory[] 	= "cesta/nekam"
service.Nette-Loaders-RobotLoader.run 			= TRUE

, tak se vůbec nic nestane. I když bych očekával, že jsem právě přidal další adresář pro skenování RobotLoaderem.

Druhý pokus:

service.RobotLoader.factory = Nette\Configurator::createRobotLoader
service.RobotLoader.option.directory[] 	= %appDir%
service.RobotLoader.option.directory[] 	= %libsDir%
service.RobotLoader.option.directory[] 	= "cesta/nekam"
service.RobotLoader.run 		= TRUE

funguje podle očekávání. Není to tedy BUG?

A ještě jeden poznatek, pokud přidám adresář pro skenování, NESMÍM vynechat výchozí adresáře. Nestálo by za úvahu změnit chování tak, aby se tyto dva adresáře skenovaly vždy (tj. appDir a libsDir)?

BigCharlie
Člen | 283
+
0
-

A ještě jedna drobnost – pokud je potřeba přidat napřiklad potřebný adresář pouze v jiné sekci (jako třeba v development), musí se zopakovat vše, není možné vytrhnout z kontextu pouze konkrétní řádek. Tedy tohle

[common]
service.RobotLoader.factory = Nette\Configurator::createRobotLoader
service.RobotLoader.option.directory[] 	= %appDir%
service.RobotLoader.option.directory[] 	= %libsDir%
service.RobotLoader.run			= TRUE

[production < common]
service.RobotLoader.option.directory[] 	= "cesta/nekam"

fungovat nebude. Nebo dělám někde chybu?

BigCharlie
Člen | 283
+
0
-

redhead napsal(a):

ad1:
https://forum.nette.org/…-konfigurace?…

Úplně nerozumím, na co odkaz upozorňuje? Pokud na to, že Pandovi to v odkazovaném příspěvku nefungovalo, nemohu potvrdit, mně verze s service.RobotLoader. atd fungovala bez problémů (možná problém s číslem revize).

Spíš mě zaráží, že nefunguje zápis s service.Nette-Loaders-RobotLoader. atd, převzatý z příkladů v distribuci (konkrétně z CD-collection). Abych byl zcela přesný, nefunguje přidání dalšího adresáře pro scanování RoborLoaderem, viz první příspěvek.

Honza Kuchař
Člen | 1662
+
0
-

V příkladu uvedená továrnička Nette\Configurator::createRobotLoader skutečně existuje. Její implementace nevyžaduje seznam indexovaných adresářů – pokud je vynecháme, použije se výchozí hodnota, což jsou právě cesty %appDir% a %libsDir%. Tudíž oba řádky service.RobotLoader.option.directory můžeme v tomto případě vynechat. Dokonce tato továrna je už předdefinovaná pod službou Nette\Loaders\RobotLoader – tedy vlastně stačí udělat jediné – službu nastartovat:

[common]
service.Nette-Loaders-RobotLoader.run = TRUE
BigCharlie
Člen | 283
+
0
-

Honzo, jsi strašně rychlej, než jsem stačil dočíst tvůj první post a zareagovat, už jsi ho stihnul smazat/opravit :-)

O tom, co píšeš, se asi nikdo nepře, viz můj první post. Zkus ale vyzkoušet konfiguraci z prvního postu, tj. do konfigurace přidat řádek

service.Nette-Loaders-RobotLoader.option.directory[]    = "cesta/nekam"

, odkud bys chtěl načítat knihovny mimo adresáře appDir a libsDir (ponechme nyní stranou důvody proč). Tady jsem narazil na problém! Přídání adresáře do konfigurace RobotLoaderu neproběhne.

Editoval BigCharlie (18. 10. 2009 17:14)

Honza Kuchař
Člen | 1662
+
0
-

Teď teda nemám moc čas to zkoušet, ale netváří se mi to, že by se to chovalo divně. Zadáváš tam tu cestu absolutně?

Honza Kuchař
Člen | 1662
+
0
-

Máš recht, fakt to nejde. Asi je to bug.

Editoval honzakuchar (18. 10. 2009 17:24)

kravčo
Člen | 721
+
0
-

Prečo to funguje tak ako to funguje snáď vysvetlí kód.

Honza Kuchař
Člen | 1662
+
0
-

@kravčo: snáď

Asi jsem natvrdlej. :(

BigCharlie
Člen | 283
+
0
-

Pokud jsem to správně pochopil (debug step by step :-), jinak jsem byl ztracen), pokud není v config.ini uvedena factory pro službu, jsou nyní veškeré uvedené možnosti option ignorovány, protože se neuplatní tato podmínka. Pokud se tedy služba spouští při startu (což pro RobotLoader obvykle platí), záleží na implicitní konfiguraci.

Takže Davidův popis platí beze zbytku s jedním dodatkem. Implementace továrničky Nette\Configurator::createRobotLoader nepotřebuje seznam indexovaných adresářů. Pokud ho ale chci upravit (zadat jiné adresáře, nebo některé přidat), musím nyní explicitně uvést i továrničku. A skutečně, tohle funguje:

service.Nette-Loaders-RobotLoader.factory		= Nette\Configurator::createRobotLoader
service.Nette-Loaders-RobotLoader.option.directory[]    = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[]    = %libsDir%
service.Nette-Loaders-RobotLoader.option.directory[]    = "cesta/nekam"
service.Nette-Loaders-RobotLoader.run                   = TRUE

Otázkou je, zda je to ignorování option direktiv bez uvedení factory v pořádku. Minimálně by to mohlo být zavádějící a přimlouval bych se buď za změnu (neznám ale dopad ny zbytek frameworku), nebo významné upozornění v dokumentaci.

Honza Kuchař
Člen | 1662
+
0
-

přimlouval bych se buď za změnu

Já taky. Nebo to výrazné upozornění. (ale teď nevím, co jsem tak zkoušel /ale jen tak letmo/, tak mi to co píšeš taky nefungovalo. Ale pokud to funguje tobě, tak bude chybka u mě)

arron
Člen | 464
+
0
-

Do prkna…tak timhle jsem prave stravil peknych par hodin, desitky ladicich vypisu z jadra Nette a stovky prozkoumanych radku kodu. Takze za me muzu reportovat vysoky WTF faktor:-/

BigCharlie
Člen | 283
+
0
-

Tak zřejmě od verze 1.x výš by měl být problém vyřešen.

EDIT: právě jsem ověřil, že pro verzi 0.9.4 tento problém stále platí a je potřeba ho obejít uvedeným řešením.

Editoval BigCharlie (23. 6. 2010 23:13)