2012-03-16 14 views
5

Como estoy tratando de escribir un plugin de Grails, que tropezaron con dos problemas:¿Cuál es la mejor manera de modificar una configuración de proyecto desde un plugin?

  • ¿Cómo modificar uno de los archivos de configuración como Config.groovy o DataSource.groovy de witin el guión _install.groovy? Es fácil agregar algo a esos archivos, pero ¿cómo lo modifico de una manera limpia? text.replaceAll()? ¿O debería crear un nuevo archivo de configuración?
  • ¿cómo obtengo el nombre de la aplicación actual en la que se instalará el complemento? Traté de usar app.name y appName pero ambos no funcionan.

¿Hay alguna vez un buen tutorial sobre la creación de complementos que aún no haya encontrado?

+0

Wow. Una pregunta con 1000 vistas y no un voto por separado ... ¿No vale esto otra insignia? – rdmueller

Respuesta

5

Aquí hay un ejemplo de edición de archivos de configuración desde scripts/_Install.groovy.
Mi complemento copia tres archivos en el directorio de destino.

  • .hgignore se utiliza para el control de versiones,
  • DataSource.groovy sustituye a la versión predeterminada, y
  • SecurityConfig.groovy contiene ajustes adicionales.

Prefiero editar los archivos de la aplicación lo menos posible, especialmente porque espero cambiar la configuración de seguridad dentro de unos años. También necesito usar propiedades de un archivo jcc-server-config.properties que está personalizado para cada servidor de aplicaciones en nuestro sistema.

Copiar los archivos es fácil.

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") 

La parte difícil es conseguir que Grails recoja el nuevo archivo de configuración. Para hacer esto, tengo que editar la aplicación grails-app/conf/Config.groovy.Agregaré dos archivos de configuración para encontrar en classpath.

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()); 

El único problema es la adición de SecurityConfig.groovy a la ruta de clase. Descubrí que puedes hacerlo creando el siguiente evento en el complemento /scripts/Events.groovy.

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

Ed.

+0

eso es genial código para agregar nuevos archivos de configuración. Todavía me pregunto cuál es la mejor manera de cambiar (por ejemplo) la configuración predeterminada de DataSource ... Tal vez simplemente agregue un comentario al principio del archivo anterior y sobrescriba la configuración en mis nuevos archivos externos. .. – rdmueller

+1

Gracias. Me imagino que el 'DataSource.groovy' por defecto no es muy valioso y fácil de reemplazar, así que simplemente lo sobrescribo con el mío. –

1

para modificar los archivos de configuración, debe utilizar ConfigSlurper:

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

Si necesita obtener el nombre de la aplicación desde el guión, intenta:

metadata.'app.name' 
+0

problema con el slurper es que si quiero agregar una propiedad de configuración en tiempo de instalación, tendría que sorber la configuración, modificarla y serializarla en el disco de nuevo. Pero la serialización eliminará todos los comentarios :-( – rdmueller

+0

genial. 'Metadata.'app.name'' funciona! Gracias! – rdmueller

3

es posible que trate de cambiar la configuración dentro del MyNiftyPlugin. archivo groovy (suponiendo que tu complemento se llame my-ingenioso). Descubrí que puedo cambiar los valores de configuración dentro del cierre doWithApplicationContext. Aquí hay un ejemplo.

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

Los valores que introduzca aquí no aparecer en la variable grailsApplication.config en tiempo de ejecución. Si funciona para usted, será una solución más ordenada, ya que no requiere cambios en el proyecto del cliente.

Debo calificar eso con el hecho de que no pude lograr que Spring Security funcionara con esta técnica. Creo que mi complemento (que depende de Spring Security) se cargó después de que se inició la seguridad. Decidí agregar un archivo adicional al directorio grails-app/conf.

HTH.

+0

hm. Eso suena bien - de esta manera podría sorber otra configuración en la configuración principal ... – rdmueller

Cuestiones relacionadas