精通 Grails: Grails 事件模型
CreateFile 事件
以下是另一个可在构建期间引入的事件示例。每次输入 create- 命令之一(create-controller、create-domain-class 等等),都会触发 CreatedFile 事件。看看 scripts/CreateDomainClass.groovy,如清单 5 所示:
清单 5. CreateDomainClass.groovy
grailsHome = Ant.antProject.properties."env.GRAILS_HOME"
includeTargets << new File ( "${grailsHome}/scripts/Init.groovy" )
includeTargets << new File( "${grailsHome}/scripts/CreateIntegrationTest.groovy")
target ('default': "Creates a new domain class") {
depends(checkVersion)
typeName = ""
artifactName = "DomainClass"
artifactPath = "grails-app/domain"
createArtifact()
createTestSuite()
}
在此不能看到 CreatedFile 事件的调用,不过看一下 $GRAILS_HOME/scripts/Init.groovy 中的 createArtifact 目标($GRAILS_HOME/scripts/CreateIntegrationTest.groovy 中的 createTestSuite 目标最终也调用 $GRAILS_HOME/scripts/Init.groovy 中的 createArtifact 目标)。在 createArtifact 目标的倒数第二行,可以看到以下调用:event("CreatedFile", [artifactFile])。
该事件与 CleanStart 事件的最大差异是:前者会将一个值传回给事件处理程序。在本例中,它是刚才创建的文件的完全路径(随后会看到,第二个参数是一个列表 — 可以需要传递回以逗号分隔的值)。必须设置事件处理程序来捕获传入的值。
假设您想将这些新创建的文件自动添加到源控件。在 Groovy 中,可以将平时在命令行中输入的所有内容包含在引号内并在 String 上调用 execute()。将清单 6 中的事件处理程序添加到 scripts/Events.groovy:
清单 6. 自动向 Subversion 添加工件
"svn add ${fileName}".execute()
println "### ${fileName} was just added to Subversion."
}
现在输入 grails create-domain-class Hotel 并查看结果。如果没有使用 Subversion,此命令将静默失败。如果使用 Subversion,输入 svn status。此时应该看到添加的文件(域类和对应的集成测试)。
发现调用的构建事件
要发现什么脚本抛出什么事件,最快方式是搜索 Grails 脚本中的 event() 调用。在 UNIX® 系统中,可以使用 grep 搜索 Groovy 脚本中的 event 字符串,如清单 7 所示:
清单 7. 使用 Grep 搜索 Grails 脚本中的事件调用
Bootstrap.groovy: event("AppLoadStart", ["Loading Grails Application"])
Bootstrap.groovy: event("AppLoadEnd", ["Loading Grails Application"])
Bootstrap.groovy: event("ConfigureAppStart", [grailsApp, appCtx])
Bootstrap.groovy: event("ConfigureAppEnd", [grailsApp, appCtx])
BugReport.groovy: event("StatusFinal", ["Created bug-report ZIP at ${zipName}"])
知道调用的事件后,可以在 scripts/Events.groovy 中创建相应的监听器,并高度自定义构建环境。