2012-03-16 14 views
5

Jak próbuję napisać Grails wtyczki, natknąłem się na dwa problemy:Jaki jest najlepszy sposób modyfikacji konfiguracji projektu z poziomu wtyczki?

  • Jak zmodyfikować jeden z plików konfiguracyjnych, takich jak Config.groovy lub DataSource.groovy od witin skryptu _install.groovy? Łatwo jest dołączyć coś do tych plików, ale jak mogę je zmodyfikować w czysty sposób? text.replaceAll()? Czy powinienem utworzyć nowy plik konfiguracyjny?
  • Jak uzyskać nazwę bieżącej aplikacji, w której zainstalowana będzie wtyczka? Próbowałem użyć app.name i appName, ale oba nie działają.

Czy jest gdzieś dobry samouczek na temat tworzenia wtyczek, których jeszcze nie znalazłem?

+0

Wow. Pytanie z 1000 odsłonami, a nie z jednym przegłosowaniem ... Czy to nie jest warte innej odznaki? – rdmueller

Odpowiedz

5

Oto przykład edytowania plików konfiguracyjnych z scripts/_Install.groovy.
Moja wtyczka kopiuje trzy pliki do katalogu docelowego.

  • .hgignore służy do kontroli wersji,
  • DataSource.groovy zastępuje wersję domyślną, a
  • SecurityConfig.groovy zawiera dodatkowe ustawienia.

Wolę edytować pliki aplikacji w jak najmniejszym stopniu, szczególnie dlatego, że spodziewam się zmiany konfiguracji zabezpieczeń na kilka lat. Muszę również użyć właściwości z pliku jcc-server-config.properties, który jest dostosowany do każdego serwera aplikacji w naszym systemie.

Kopiowanie plików jest łatwe.

println ('* copying .hgignore ') 
ant.copy(file: "${pluginBasedir}/src/samples/.hgignore", 
     todir: "${basedir}") 
println ('* copying SecurityConfig.groovy') 
ant.copy(file: "${pluginBasedir}/src/samples/SecurityConfig.groovy", 
     todir: "${basedir}/grails-app/conf") 
println ('* copying DataSource.groovy') 
ant.copy(file: "${pluginBasedir}/src/samples/DataSource.groovy", 
     todir: "${basedir}/grails-app/conf") 

Najtrudniejszym zadaniem jest pobranie Grailsa do pobrania nowego pliku konfiguracyjnego. Aby to zrobić, muszę edytować aplikację grails-app/conf/Config.groovy.Dodam dwa pliki konfiguracyjne, które można znaleźć w ścieżce klas.

println ('* Adding configuration files to grails.config.locations'); 
// Add configuration files to grails.config.locations. 
def newConfigFiles = ["classpath:jcc-server-config.properties", 
         "classpath:SecurityConfig.groovy"] 
// Get the application's Config.groovy file 
def cfg = new File("${basedir}/grails-app/conf/Config.groovy"); 
def cfgText = cfg.text 
def appendedText = new StringWriter() 
appendedText.println "" 
appendedText.println ("// Added by edu-sunyjcc-addons plugin"); 
// Slurp the configuration so we can look at grails.config.locations. 
def config = new ConfigSlurper().parse(cfg.toURL()); 
// If it isn't defined, create it as a list. 
if (config.grails.config.locations.getClass() == groovy.util.ConfigObject) { 
    appendedText.println('grails.config.locations = []'); 
} else { 
    // Don't add configuration files that are already on the list. 
    newConfigFiles = newConfigFiles.grep { 
     !config.grails.config.locations.contains(it) 
    }; 
} 
// Add each surviving location to the list. 
newConfigFiles.each { 
    // The name will have quotes around it... 
    appendedText.println "grails.config.locations << \"$it\""; 
} 
// Write the new configuration code to the end of Config.groovy. 
cfg.append(appendedText.toString()); 

Jedynym problemem jest dodanie SecurityConfig.groovy na ścieżce klasy. Odkryłem, że możesz to zrobić, tworząc następujące zdarzenie w wtyczce: /scripts/Events.groovy.

eventCompileEnd = { 
    ant.copy(todir:classesDirPath) { 
     fileset(file:"${basedir}/grails-app/conf/SecurityConfig.groovy") 
    } 
} 

Ed.

+0

to świetnie kod do dodawania nowych plików konfiguracyjnych. Nadal zastanawiam się, jaki jest najlepszy sposób na zmianę (na przykład) domyślnej konfiguracji źródła danych ... Może po prostu dodaję komentarz do górnej części starego pliku i zastąpię konfigurację w moich nowych plikach zewnętrznych. .. – rdmueller

+1

Dzięki. Domyślam się, że domyślne 'DataSource.groovy' nie jest bardzo cenne i łatwe do zastąpienia, więc po prostu nadpisuję je moim własnym. –

1

Do modyfikacji plików konfiguracyjnych, należy użyć ConfigSlurper:

def configParser = new ConfigSlurper(grailsSettings.grailsEnv) 
configParser.binding = [userHome: userHome] 
def config = configParser.parse(new URL("file:./grails-app/conf/Config.groovy")) 

Jeśli trzeba uzyskać nazwę aplikacji ze skryptu, spróbuj:

metadata.'app.name' 
+0

Problem z suwakiem polega na tym, że gdybym chciał dodać właściwość konfiguracyjną podczas instalacji, musiałabym siknąć konfigurację, zmodyfikować ją i ponownie przekształcić na dysk. Ale serializacja usunie wszystkie komentarze :-( – rdmueller

+0

fajne. 'Metadata.'app.name'' działa! Thanx! – rdmueller

3

Można spróbować zmienić konfigurację w MyNiftyPlugin. groovy (zakładając, że twoja wtyczka nazywa się my-nifty). Odkryłem, że mogę zmienić wartości konfiguracyjne w ramach zamknięcia doWithApplicationContext. Oto przykład.

def doWithApplicationContext = { applicationContext -> 
    def config = application.config; 
    config.edu.mycollege.server.name = 'http://localhost:8080' 
    config.edu.mycollege.server.instance = 'pprd' 
} 

Wprowadzone tutaj wartości pojawiają się w zmiennej grailsApplication.config w czasie wykonywania. Jeśli to działa, będzie to lepsze rozwiązanie, ponieważ nie wymaga zmian w projekcie klienta.

Muszę się do tego zakwalifikować, ponieważ nie byłem w stanie zapewnić Spring Security do pracy dzięki tej technice. Wierzę, że moja wtyczka (która zależy od Spring Security) została załadowana po zainicjowaniu zabezpieczeń. Postanowiłem dodać dodatkowy plik do katalogu grails-app/conf.

HTH.

+0

hm. Brzmi dobrze - w ten sposób mógłbym siknąć inną konfigurację do głównej konfiguracji ... – rdmueller

Powiązane problemy