gpt4 book ai didi

grails - 如何为grails 2.5创建一个简单的构建脚本

转载 作者:行者123 更新时间:2023-12-02 14:30:38 24 4
gpt4 key购买 nike

我已经阅读了here文档,该文档提供了结构,但没有提供有关如何创建实际逻辑的帮助。

我想构建一个非常简单的脚本,该脚本可以执行清理工作,创建 war ,创建源代码的zip文件(不包含目标目录,并且不包含任何svn目录),并创建迁移目录的tar(理想情况下已压缩)。可以与liquibase一起使用。这3个 Artifact 中的每个 Artifact 都应具有其名称的应用程序版本(就像现有的“grails war”一样)。

项目结构如下所示:

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 create-script package-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, PackageUs$_run_closure5@5ed0b4e3]

除了链接中最基本的概述之外,我找不到任何示例脚本或文档。

我什至无法使ant.echo()起作用-intellij说只有一个ant.echo函数带有一个LinkedHashmap,一个字符串和一个闭包,但是ant文档说echo只需要一个“消息”字符串。 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")
}

我还没有弄清楚:
  • 如何掌握app.version,以便可以放入文件名中。例如:println“为$ app.version创建 war ”不起作用
  • 如何建立 war 。不可能将其放在depdends列表中,并且ant.war(“myfile.war”)不幸地无法正常工作。其他策略可能会在 war build 事件上运行此脚本,这并不理想,因为不需要频繁地进行 war 就可以建立 war ,或者通过调用shell命令来调用“grails war”。

  • 更新2-无法产生“刺杀”之战

    在Ashraf Purno的帮助下,我们有一个脚本(如下),该脚本可创建 war ,压缩源代码并压缩liquibase文件的tar.gz并生成它们的包。但是,它有一个主要缺陷,所产生的 war 始终是“dev”版本,因为当您将其部署到tomcat时,会厌倦使用dev数据源和dev环境。似乎没有办法在构建脚本中更改此设置,并且在调用脚本的命令行上设置环境为prod(例如“grails prod myscript”)也没有影响-它还会生成该脚本的dev版本。 war (没有用)
    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" )
    }

    最佳答案

    在仔细浏览并浏览了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上查看脚本中的一些可用 Prop /配置。

    关于grails - 如何为grails 2.5创建一个简单的构建脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32945284/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com