2012-03-16 63 views
5

正如我想寫一個Grails插件,我偶然發現了兩個問題:從插件中修改項目配置的最佳方法是什麼?

  • 我怎麼修改像Config.groovy或witin的_install.groovy腳本DataSource.groovy配置文件中的一個?向這些文件添加內容很容易,但是如何以乾淨的方式修改它? text.replaceAll()?或者我應該創建一個新的配置文件?
  • 我該如何獲取插件安裝到的當前應用程序的名稱?我試圖使用app.nameappName,但兩者都不起作用。

有沒有什麼地方可以創建我還沒有找到的插件的好教程?

+0

哇。一個有1000個觀點的問題,而不是單一的upvote ......這是否值得另一個徽章? – rdmueller 2013-08-13 13:31:03

回答

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。我將在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()); 

唯一的問題是增加SecurityConfig.groovy到類路徑。我發現你可以通過在插件的/scripts/Events.groovy中創建以下事件來實現。

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

Ed。

+0

這很棒添加新的配置文件的代碼我仍然想知道什麼是最好的方法來改變(例如)默認的dataSource配置......也許我只是添加一個註釋到舊文件的頂部並覆蓋我的新外部文件中的配置。 .. – rdmueller 2012-03-21 15:20:49

+1

謝謝。我認爲默認的'DataSource.groovy'不是很有價值且易於替換,所以我只是用自己的代碼覆蓋它。 – 2012-03-21 18:09:41

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' 
+0

slurper的問題是,如果我想在安裝時添加一個配置屬性,我將不得不啜泣配置,修改它並將其序列化到磁盤。但是序列化會刪除所有評論:-( – rdmueller 2012-03-16 18:35:31

+0

cool。'metadata.'app.name'' works!Thanx! – rdmueller 2012-03-16 19:01:58

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。

+0

hm。聽起來不錯 - 這種方式我可以啜泣另一個配置進入主配置... – rdmueller 2012-03-16 18:32:52

相關問題