Grails 1.2参考文档速读(5):第4章

Grails不同于以前Java框架的一个地方就是它自己就带了一个命令系统,缺省就提供了开发中常用的命令,如编译、运行、打包等,完全避免了自己书写build文件的必要性。关于Grails命令系统的讲解是在参考文档的第4章完成的。
Grails的命令系统是建立在Gant之上的,但需要注意的是命令脚本的扩展名需为groovy,Grails不会识别gant扩展名。
运行时直接输入:grails 脚本文件名。至于命名约定,也很简单:xx-xx会自动转变成大小写相间的名字,如create-domain-class,对应CreateDomainClass.groovy。在执行脚本时,Grails按以下顺序搜索:
  • USER_HOME/.grails/scripts
  • PROJECT_HOME/scripts
  • PROJECT_HOME/plugins/*/scripts
  • GRAILS_HOME/scripts
如果找到多个匹配,它会让你选择。在执行脚本时,执行脚本的default target。
创建脚本,使用grails create-script,脚本的书写完全是按照Gant的语法。其实很简单,只要熟悉Ant,基本上照着例子改就能很快掌握。在脚本中,你可以使用ant来访问Ant相关的内容。典型的脚本如下:
//另一种设置缺省target的方法是
    //在脚本文件中,调用setDefaultTarget(target名)
    target(default:"定义缺省的target") {
     depends(clean, compile)
    }
    target(clean:"Clean out things") {
     ant.delete(dir:"output")
    }
    target(compile:"Compile some sources") {
     ant.mkdir(dir:"mkdir")
     ant.javac(srcdir:"src/java", destdir:"output")
    }
牛顿告诉我们“要站在巨人的肩上。”。在创建你自己的脚本时,当然也要考虑是否已有现成的可用,比方说Grails中、工程安装的插件中。要利用别人的target,就需要使用includeTarget,它的使用方式(在脚本文件头书写):
  • 方法1:包含文件名,includeTargets << new File("文件名")
  • 方法2:包含类名,includeTargets << gant.tools.Ivy
以上方法只是引入外部target的一般做法,要想引入Grails相关的target,你就得在includeTargets中使用grailsScript()。如:includeTargets << grailsScript("_GrailsBootstrap")。
讲到此处,就有必要介绍一下Grails的脚本架构了。Grails自带的脚本是:内部脚本+外部脚本。其中:
内部脚本的特点:
  • 出于复用目的,定义可能复用的target
  • 以_开始,如“_GrailsTest”
  • Grails不会执行内部脚本
至于外部脚本,它的特点如下:
  • 使用内部脚本的target完成具体任务
  • 不以_开始,如“GrailsTest”
我们使用的那些Grails命令都属于外部脚本,内外部脚本的示例如下:
./scripts/FunctionalTests.groovy:  //外部脚本
    includeTargets << new File("${basedir}/scripts/_FunctionalTests.groovy")
    target(default: "Runs the functional tests for this project.") {
        depends(runFunctionalTests)
    }
    
    ./scripts/_FunctionalTests.groovy: //内部脚本
    includeTargets << grailsScript("_GrailsTest")
    target(runFunctionalTests: "Run functional tests.") {
        depends(...)
        ...
    }
Grails在参考文档中列出了主要内部脚本说明,请查阅。
Grails命令系统的另一个特点是事件机制,开发者可以利用这一机制来对命令执行期的特定阶段完成自己想做的任何事情。在Grails的事件有两类,分别在Grails Target和Plugin脚本执行时触发。事件处理器在_Events.groovy中定义,Grails会在以下目录进行搜索:
  • USER_HOME/.grails/scripts,用户相关目录
  • PROJECT_HOME/scripts,应用相关目录
  • PLUGINS_HOME/*/scripts,plugin相关目录
  • GLOBAL_PLUGINS_HOME/*/scripts,全局plugin相关目录
每个事件处理器是Events.groovy的闭包,以‘event’开头,后跟Event名:
eventCreatedArtefact = { type, name ->
       println "Created $type $name"
    }
    
    eventStatusUpdate = { msg ->
       println msg
    }
    
    eventStatusFinal = { msg ->
       println msg
    }
如果你想自定义事件或触发Grails的事件,那么需要:
  1. 引入_GrailsEvents
  2. 调用event
例子如下:
includeTargets << grailsScript("_GrailsEvents")
    event("StatusFinal", ["Super duper plugin action complete!"])
至于Grails定义的公共事件,请参见参考文档。
在1.2中关于build的配置都统一在BuildConfig.groovy中进行,你可以编辑这个文件对构建过程自定义。至于相关的选项请参考文档。覆盖缺省值,有两种方法:
  • 方法1,使用命令行参数:grails -Dgrails.project.work.dir=work compile
  • 方法2,在conf/BuildConfig.groovy中定义:grails.project.work.dir = "work"
虽然Grails的命令系统相当不错,但它并没有把你绑死在这一根绳上。你依旧还是可以用你的Ant或Maven,至于如何集成它们,请参见参考文档。

你可能感兴趣的:(职场,grails,休闲,脚本命令)