grails可以配置多個環境,開發、測試、生産環境,隻需要在application.yml中配置即可,打包方式分别為:
grails dev war
grails test war
grails prod war
每個環境配置
Grails支援每個環境配置的概念。目錄中的
application.yml
和
application.groovy
檔案
grails-app/conf
可以使用YAML或ConfigSlurper提供的文法來使用每個環境配置。作為示例,請考慮
application.yml
Grails提供的以下預設定義:
environments:
development:
dataSource:
dbCreate: update
url: jdbc:oracle:thin:@114.55.235.233:1540:HSZF
logSql: true
test:
dataSource:
dbCreate: update
url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
production:
dataSource:
dbCreate: update
#jdbc:h2:./prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
url: jdbc:oracle:thin:@114.55.235.233:1540:HSZF
properties:
jmxEnabled: true
initialSize: 5
maxActive: 50
minIdle: 5
maxIdle: 25
maxWait: 10000
maxAge: 600000
timeBetweenEvictionRunsMillis: 5000
minEvictableIdleTimeMillis: 60000
validationQuery: SELECT 1
validationQueryTimeout: 3
validationInterval: 15000
testOnBorrow: true
testWhileIdle: true
testOnReturn: false
jdbcInterceptors: ConnectionState
defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED
以上可以用Groovy文法表示
application.groovy
如下:
dataSource {
pooled = false
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
environments {
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:h2:mem:devDb"
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:mem:testDb"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb"
}
}
}
注意如何在頂層提供通用配置,然後一個environments塊指定每個環境設定的屬性dbCreate和url屬性DataSource。
包裝和運作不同的環境
Grails的指令行具有内置功能,可以在特定環境的上下文中執行任何指令。格式為:
grails <<environment>> <<command name>>
此外,已知有以Grails的3個預設環境:dev,prod,和test為development,production和test。例如,要為test您将運作的環境建立WAR :
grails test war
要定位其他環境,您可以将grails.env變量傳遞給任何指令:
grails -Dgrails.env=UAT run-app
程式化環境檢測
在您的代碼中,例如在Gant腳本或引導類中,您可以使用Environment類檢測環境:
import grails.util.Environment
...
switch (Environment.current) {
case Environment.DEVELOPMENT:
configureForDevelopment()
break
case Environment.PRODUCTION:
configureForProduction()
break
}
每個環境引導
當您的應用程式在每個環境的基礎上啟動時,通常需要運作代碼。為此,您可以使用該grails-app/init/BootStrap.groovy檔案對每個環境執行的支援:
def init = { ServletContext ctx ->
environments {
production {
ctx.setAttribute("env", "prod")
}
development {
ctx.setAttribute("env", "dev")
}
}
ctx.setAttribute("foo", "bar")
}
通用環境執行
前面的BootStrap示例在grails.util.Environment内部使用該類來執行。您也可以自己使用此類來執行您自己的特定于環境的邏輯:
Environment.executeForCurrentEnvironment {
production {
// do something in production
}
development {
// do something only in development
}
}