如何为Grails2.5创建一个简单的构建脚本

如何为Grails2.5创建一个简单的构建脚本,grails,build,Grails,Build,我已经阅读了文档,它给出了结构,但没有提供任何关于如何创建实际逻辑的帮助 我想构建一个非常简单的脚本,它进行清理,创建war,创建源代码的zip(没有目标目录,也没有任何svn目录),并创建migrations目录的tar(理想的gzip),这样就可以与liquibase一起使用。这3个工件中的每一个都应该在其名称中包含应用程序版本(就像现有的“GrailsWar”一样) 项目结构如下所示: svn main-app grails-app migrations

我已经阅读了文档,它给出了结构,但没有提供任何关于如何创建实际逻辑的帮助

我想构建一个非常简单的脚本,它进行清理,创建war,创建源代码的zip(没有目标目录,也没有任何svn目录),并创建migrations目录的tar(理想的gzip),这样就可以与liquibase一起使用。这3个工件中的每一个都应该在其名称中包含应用程序版本(就像现有的“GrailsWar”一样)

项目结构如下所示:

svn
main-app
   grails-app
       migrations
       target
       :
exploded-plugin-1
   grails-app
   :
exploded-plugin-2
   grails-app
   :
这就是我所取得的成绩:

includeTargets << grailsScript("_GrailsInit")

target(packageUs: "Creates war, zips source, tars liquibase scripts") {
    depends(clean, war-us, zip-source, tar-liquibase)
}

setDefaultTarget(packageUs)

target ("war-us" : "creates war") {
    ant.war()  // this was a guess at calling the existing war - it doesnt work
}

target ("zip-source" : "zips sources") {
  // cd to top dir of project, i.e. above the app.
}

target ("tar-liquibase":"produces tar of migrations dir") {
    // tar up the migrations dir
    // name it with the app-version
    // put it in the target dir along side the war etc.
}

target ("clean") {
  // call the default clean some how, or cd to target dir, and delete everything
}
除了链接中非常基本的概述之外,我找不到任何示例脚本或文档

我甚至不能让ant.echo()工作-intellij说只有一个ant.echo函数接受LinkedHashmap、字符串和闭包,但ant文档说echo只接受“消息”字符串。LinkedHashmap、字符串和闭包应该是什么?我尝试了至少30种不同的变体,都不起作用

更新1:到目前为止我所做的工作
includeTargets在谷歌搜索和浏览了一下grails核心脚本之后,我成功地创建了一个脚本,实现了您在问题中提到的功能

    import grails.util.Metadata

    includeTargets << grailsScript("_GrailsInit")
    includeTargets << grailsScript("_GrailsClean")
    includeTargets << grailsScript("_GrailsWar")

    target(pack: "Creates war, zips source, tars liquibase scripts") {
        depends(cleanAll, war)

        String appVersion = Metadata.current[Metadata.APPLICATION_VERSION],
               zipFileName = "${basedir}/target/sources-${appVersion}.zip",
               tarFileName = "${basedir}/target/migrations-${appVersion}.tar.gz"

        println "Creating Sources Zip"
        ant.delete(file: zipFileName)
        ant.zip(destfile: zipFileName, basedir: basedir, excludes: "**/target/**  **/.idea/** **/.classpath/** **/.iml/**")

        println "Creating Migrations Tar Ball"
        ant.delete(file: tarFileName)
        ant.tar(destfile: tarFileName, basedir: "${basedir}/grails-app/migrations")
    }

    setDefaultTarget(pack)
导入grails.util.Metadata

includeTargets哇,你是在谷歌上找到的吗?我在谷歌上搜索示例或文档已经好几天了,结果大部分是空白的。我确实找到了一个简单的方法来获取app.version:“xxx_${metadata.app.version'}”你说得对,除了脚本中可用的应用程序属性列表,谷歌搜索并没有给我提供太多。我主要从grails核心脚本源中得到帮助。“xxx_${metadata.'app.version'}”元数据从哪里来?它是自动注入的吗?奇怪的是,使用warMain依赖项创建的战争不起作用。它们产生的战争与执行“grails战争”不同2个字节,当放到tomcat上时,它们无法连接到db(连接被拒绝)。这非常奇怪。我试着仅仅依靠“战争”,它会产生相同的结果-一个与grails war不同几个字节的war,以及一个无法连接到db(无法创建连接池)的war。这可能是因为它使用了错误的环境吗?grails war=production,也许这是在尝试使用dev?
includeTargets << grailsScript("_GrailsInit")
target(packageUs: "Creates war, zips source, tars liquibase scripts") {
    depends(clean, "war-us", "zip-source")
}
setDefaultTarget(packageUs)

target ("war-us" : "creates war") {
   ant.echo(message:"hello") // this compiles and runs, but does nothing.
   println "hello there"  // this does work.
   // ant.war(?)
}

// puts in it wrong dir, and doen't have app version in name, but at least it zips the right content!
target ("zip-source" : "zips sources") {
    ant.delete(file: 'sources.zip')  // dont know how to add this to the clean cycle
    ant.zip(destfile: 'sources.zip', basedir: '..', excludes: "**/*.zip **/target/**  **.idea **/.classpath **/.iml")
}
includeTargets << grailsScript("_GrailsInit")
includeTargets << grailsScript("_GrailsClean")
includeTargets << grailsScript("War")

target(warpack: "Creates war, zips source, tars liquibase scripts") {
    depends(cleanAll, cleanRealyAll, war, "zip-source", "tar-liquibase", "package-all")
}

setDefaultTarget(warpack)

target ("cleanRealyAll" : "Cleans stuff that clean-all wont touch") {
    println "wiping the target dir"
    ant.delete(dir: "target")
    ant.mkdir(dir: "target")
}

target ("zip-source" : "zips sources") {
    println "zipping sources for ${metadata.'app.version'}"

    String zipFile = "target/sources-${metadata.'app.version'}.zip"
    ant.delete(file: zipFile)
    ant.zip(destfile: zipFile, basedir: '..', excludes: "**/*.zip **/target/**  **.idea **/.classpath **/.iml")
}

target ("tar-liquibase":"produces tar of migrations dir") {
    println "tarring liquibase for ${metadata.'app.version'}"

    String tarFile = "target/migrations-${metadata.'app.version'}.tar"
    String gzipfile = "target/migrations-${metadata.'app.version'}.tar.gz"

    ant.tar(destfile:tarFile, basedir: "grails-app/migrations")
    ant.gzip(src: tarFile, destfile : gzipfile )
    ant.delete(file: tarFile)
}

target ("package-all":"puts it all together in one file, relies on externally running 'grails war' first") {
    println "creating package for ${metadata.'app.version'}"

    String packageFile = "target/ourpackage-${metadata.'app.version'}.tar"

    ant.delete(file: packageFile)
    ant.tar (destfile: packageFile, basedir:"target", includes: "*.war *.zip *.gz" )
}
    import grails.util.Metadata

    includeTargets << grailsScript("_GrailsInit")
    includeTargets << grailsScript("_GrailsClean")
    includeTargets << grailsScript("_GrailsWar")

    target(pack: "Creates war, zips source, tars liquibase scripts") {
        depends(cleanAll, war)

        String appVersion = Metadata.current[Metadata.APPLICATION_VERSION],
               zipFileName = "${basedir}/target/sources-${appVersion}.zip",
               tarFileName = "${basedir}/target/migrations-${appVersion}.tar.gz"

        println "Creating Sources Zip"
        ant.delete(file: zipFileName)
        ant.zip(destfile: zipFileName, basedir: basedir, excludes: "**/target/**  **/.idea/** **/.classpath/** **/.iml/**")

        println "Creating Migrations Tar Ball"
        ant.delete(file: tarFileName)
        ant.tar(destfile: tarFileName, basedir: "${basedir}/grails-app/migrations")
    }

    setDefaultTarget(pack)