从插件中修改项目配置的最佳方法是什么?

时间:2012-03-16 15:36:49

标签: grails plugins

当我正在尝试编写Grails插件时,我偶然发现了两个问题:

  • 如何从Config.groovy脚本修改其中一个配置文件,如DataSource.groovy_install.groovy?向这些文件添加内容很容易,但如何以干净的方式修改它? text.replaceAll()?或者我应该创建一个新的配置文件吗?
  • 如何获取插件将安装到的当前应用程序的名称?我尝试使用app.nameappName,但两者都不起作用。

是否有可能在某处创建一个我尚未找到的插件的好教程?

3 个答案:

答案 0 :(得分:5)

以下是从scripts/_Install.groovy编辑配置文件的示例 我的插件将三个文件复制到目标目录。

  • .hgignore用于版本控制,
  • DataSource.groovy替换默认版本,
  • SecurityConfig.groovy包含额外设置。

我更喜欢尽可能少地编辑应用程序的文件,特别是因为我希望在未来几年内更改安全设置。我还需要使用jcc-server-config.properties文件中的属性,该文件是为我们系统中的每个应用程序服务器定制的。

复制文件很简单。

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

困难的部分是让Grails拿起新的配置文件。为此,我必须编辑应用程序的grails-app/conf/Config.groovy。我将在类路径中添加两个配置文件。

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

唯一的问题是将SecurityConfig.groovy添加到类路径中。我发现你可以通过在插件/scripts/Events.groovy中创建以下事件来实现这一点。

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

答案 1 :(得分:3)

您可以尝试更改MyNiftyPlugin.groovy文件中的配置(假设您的插件名为my-nifty)。我发现我可以在doWithApplicationContext闭包中更改配置值。这是一个例子。

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

您在此处输入的值确实会在运行时显示在grailsApplication.config变量中。如果它适合您,它将是一个更简洁的解决方案,因为它不需要更改客户端项目。

我必须通过这种技术让我无法使Spring Security工作这一事实。我相信我的插件(依赖于Spring Security)是在初始化安全性之后加载的。我决定在grails-app / conf目录中添加一个额外的文件。

HTH。

答案 2 :(得分:1)

要修改配置文件,您应该使用ConfigSlurper

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

如果您需要从脚本获取应用程序名称,请尝试:

metadata.'app.name'