What is the best way to modify a project configuration from within a plugin?

前端 未结 3 589
忘了有多久
忘了有多久 2020-12-15 14:16

As I am trying to write a Grails Plugin, I stumbled upon two problems:

  • how do I modify one of the configuration files like Config.groovy or
相关标签:
3条回答
  • 2020-12-15 14:52

    Here is an example of editing configuration files from scripts/_Install.groovy.
    My plugin copies three files to the target directory.

    • .hgignore is used for version control,
    • DataSource.groovy replaces the default version, and
    • SecurityConfig.groovy contains extra settings.

    I prefer to edit the application's files as little as possible, especially because I expect to change the security setup a few years down the road. I also need to use properties from a jcc-server-config.properties file which is customized for each application server in our system.

    Copying the files is easy.

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

    The hard part is getting Grails to pick up the new configuration file. To do this, I have to edit the application's grails-app/conf/Config.groovy. I will add two configuration files to be found on the 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());
    

    The only problem is adding SecurityConfig.groovy to the classpath. I found that you can do that by creating the following event in the plugin's /scripts/Events.groovy.

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

    Ed.

    0 讨论(0)
  • 2020-12-15 15:02

    You might try changing the configuration within the MyNiftyPlugin.groovy file (assuming that your plugin is named my-nifty). I've found that I can change the configuration values within the doWithApplicationContext closure. Here's an example.

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

    The values you enter here do show up in the grailsApplication.config variable at run time. If it works for you, it will be a neater solution, because it doesn't require changes to the client project.

    I must qualify that with the fact that I wasn't able to get Spring Security to work by this technique. I believe that my plugin (which depends on Spring Security) was loaded after the security was initialized. I decided to add an extra file to the grails-app/conf directory.

    HTH.

    0 讨论(0)
  • 2020-12-15 15:09

    For modifying configuration files, you should use ConfigSlurper:

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

    If you need to get application name from script, try:

    metadata.'app.name'
    
    0 讨论(0)
提交回复
热议问题