技术开发 频道

精通 Grails: Grails 事件模型

  CreateFile 事件

  以下是另一个可在构建期间引入的事件示例。每次输入 create- 命令之一(create-controller、create-domain-class 等等),都会触发 CreatedFile 事件。看看 scripts/CreateDomainClass.groovy,如清单 5 所示:

  清单 5. CreateDomainClass.groovy

Ant.property(environment:"env")
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 添加工件

eventCreatedFile = {fileName ->
  
"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 脚本中的事件调用

$ grep "event(" *.groovy
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 中创建相应的监听器,并高度自定义构建环境。

0
相关文章