首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >grails:编写脚本(尤其是调用现有数据库迁移脚本的指南)。

grails:编写脚本(尤其是调用现有数据库迁移脚本的指南)。
EN

Stack Overflow用户
提问于 2013-01-10 16:18:12
回答 1查看 1.4K关注 0票数 0

我的要求是从Jenkins构建服务器调用一些处理,以确定域模型自上次构建以来是否发生了更改。我得出的结论是,前进的方向是编写一个脚本,该脚本将从db迁移插件中调用一系列现有脚本。然后,我可以在调用test-app和war的步骤中调用它。

我查看了Grails文档,查看了一些db--迁移脚本,我发现我陷入了困境--不知道从哪里开始尝试。如果有人能告诉我任何合适的消息来源,我会非常感激的。顺便说一句,我在Grails有点生疏了。两年前通过“概念证明”项目开始自学,历时6个月。然后返回到Eclipse富客户端工作。这可能是我的问题的一部分,虽然我从来不参与脚本。

在Jenkins evt中,我需要的一件事是获取当前用于构建的SVN修订号。欢迎提出建议。

你好,约翰

EN

回答 1

Stack Overflow用户

发布于 2013-01-10 20:43:45

通过运行grails create-script scriptname创建一个新脚本。数据库迁移插件脚本被配置为易于重用。_DatabaseMigrationCommon.groovy中有很多共享代码,每个脚本都定义了一个具有唯一名称的目标。因此,您可以导入共享脚本或任何独立脚本(或多个脚本),并像调用方法一样调用目标。

默认情况下,create-script生成的脚本通过includeTargets << grailsScript("_GrailsInit")“导入”_GrailsInit脚本,您也可以使用指向已安装插件目录的神奇变量进行相同的操作:

代码语言:javascript
代码运行次数:0
运行
复制
includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")

如果这样做,您可以删除_GrailsInit的包含,因为它已经包含了,但是如果没有,那就好了,因为Grails只包含了一次文件。

然后你可以定义你的目标,并调用任何插件的目标。目标不能接受参数,但是可以将数据添加到argsMap (这是Grails从解析的命令行参数中创建的映射)来模拟用户指定的args。请注意,传递给您的脚本的任何arg都会被数据库迁移插件的脚本看到,因为它们使用相同的argsMap

下面是一个示例脚本,它只执行与dbm-generate-changelog相同的操作,但是添加了一个前后消息:

代码语言:javascript
代码运行次数:0
运行
复制
includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")

target(foo: "Just calls dbmGenerateChangelog") {
   println 'before'
   dbmGenerateChangelog()
   println 'after'
}

setDefaultTarget foo

请注意,我将目标从main重命名为foo,因此它是唯一的,以防您想要从另一个脚本调用它。

作为使用args的一个示例,下面是一个修改后的版本,如果没有提供,则指定默认的changelog名称:

代码语言:javascript
代码运行次数:0
运行
复制
println 'before'
if (!argsMap.params) {
   argsMap.params = ['foo2.groovy']
}
dbmGenerateChangelog()
println 'after'

编辑:下面是一个更完整的示例,它将diff的输出捕获为字符串:

代码语言:javascript
代码运行次数:0
运行
复制
includeTargets << new File("$databaseMigrationPluginDir/scripts/_DatabaseMigrationCommon.groovy")

target(foo: "foo") {
   depends dbmInit

   def configuredSchema = config.grails.plugin.databasemigration.schema
   String argSchema = argsMap.schema
   String effectiveSchema = argSchema ?: configuredSchema ?: defaultSchema

   def realDatabase
   boolean add = false // booleanArg('add')
   String filename = null // argsList[0]

   try {
      printMessage "Starting $hyphenatedScriptName"

      ByteArrayOutputStream baos = new ByteArrayOutputStream()
      def baosOut = new PrintStream(baos)

      ScriptUtils.executeAndWrite filename, add, dsName, { PrintStream out ->
         MigrationUtils.executeInSession(dsName) {
            realDatabase = MigrationUtils.getDatabase(effectiveSchema, dsName)
            def gormDatabase = ScriptUtils.createGormDatabase(dataSourceSuffix, config, appCtx, realDatabase, effectiveSchema)
            ScriptUtils.createAndPrintFixedDiff(gormDatabase, realDatabase, realDatabase, appCtx, diffTypes, baosOut)
         }
      }

      String xml = new String(baos.toString('UTF-8'))
      def ChangelogXml2Groovy = classLoader.loadClass('grails.plugin.databasemigration.ChangelogXml2Groovy')
      String groovy = ChangelogXml2Groovy.convert(xml)

      // do something with the groovy or xml here

      printMessage "Finished $hyphenatedScriptName"
   }
   catch (e) {
      ScriptUtils.printStackTrace e
      exit 1
   }
   finally {
      ScriptUtils.closeConnection realDatabase
   }
}

setDefaultTarget foo
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14262375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档