2015-10-05 80 views
1

我已阅读文档here,它给出了结构,但对如何创建实际逻辑没有提供任何帮助。如何为grails创建一个简单的构建脚本2.5

我想要构建一个非常简单的脚本,它可以清理干净,创建战争,创建源文件的压缩文件(没有目标目录,没有任何svn目录),并创建一个tar(理想压缩)迁移目录,这可以用于liquibase。每个3件文物应该有他们的名字的应用程序版本(如现有的“Grails的战争”确实

项目结构如下所示:

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 
} 

上述脚本最初是用“Grails的创建脚本包-US”

可悲的是,即使没有这个工程,它产生以下错误创建:

| Error Error executing script PackageUs: No signature of method: org.codehaus.gant.GantBinding$_initializeGantBinding_closure5.doCall() is applicable 
for argument types: (java.lang.String, PackageUs$_run_closure5) values: [clean, [email protected]] 

我找不到任何示例脚本和超出链接非常基本概述的文档。

我甚至无法得到ant.echo()工作 - intellij说只有一个ant.echo函数需要一个LinkedHashmap,一个String和一个Closure,但是ant文档说回声只需要一个“消息”字符串。 linkedhashmap,string和closure应该是什么?我已经尝试了至少30种不同的变化,没有任何工作

更新1:我有什么到目前为止

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") 
} 

什么我还没有想通了工作:

  1. 如何获得app.version的保持,因此可以把放在文件名。例如:println“为$ app.version创建战争”不起作用
  2. 如何构建战争。不可能将它放入depdends列表中,而ant.war(“myfile.war”)不起作用。其他策略可能会在战争建筑事件中运行这个脚本,这并不理想,因为战争是在没有这个需要的情况下创建的,或者通过调用shell命令来调用“grails战争”。

更新2 - 不能产生一个“正式版”战争

与阿什拉夫Purno帮助下,我们有一个脚本(下)它创建了一个战争,拉链的来源和TAR.GZ的liquibase文件并生产我们的包装。然而,它有一个主要缺陷,创建的战争总是“开发”版本,因为当你将它部署到tomcat时,它会疲于使用开发数据源和开发环境。在构建scirpt中似乎没有办法改变这一点,并且将环境设置为调用脚本的命令行(例如“grails prod myscript”)也没有影响 - 它也生成了dev版本的战争(这是没有用的)

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") 
} 

回答

2

有点谷歌搜索,并通过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) 

我已经把所有的任务放在一个单一的目标只是为了简单。你可以把它们分成几个目标,如果你愿意,可以把它们加到depends。我用Grails 2.5.1来测试这个脚本。

你可以在这里看看http://mrhaki.blogspot.com/2014/05/grails-goodness-run-groovy-scripts-in.html对于脚本中的一些可用的道具/配置。

+0

哇,你有没有发现这在谷歌?我一直在Google上搜索例子或文档,并且几乎空白。 –

+0

我确实找到了一个简单的方法来拉app.version:“xxx _ $ {metadata.'app.version'}” –

+0

你是正确的谷歌搜索除了在脚本中可用的应用程序属性的列表没有提供给我很多。我主要得到grails核心脚本资源的帮助。 *“xxx _ $ {metadata.'app.version'}”*其中'metadata'来自哪里?它是否被自动注入? –

相关问题