grails - 在编写脚本时,特别是调用现有数据库迁移脚本时,grails: guidance

  显示原文与译文双语对照的内容
0 0

我的要求是从服务器调用一些处理,以确定自上次构建以来域模型是否已经更改。 我已经得出结论,前进的方法是编写一个脚本,它将从数据库迁移插件中调用一系列现有脚本。 然后我可以在调用测试应用程序和war的步骤中调用它。

我已经查看了 Grails doc,并且在db的某些迁移脚本中,我发现我已经被卡住了。 如果有人能给我任何合适的信息,我将非常感激。 ,我对Grails有点生疏。 两年前通过概念项目证明开始自学,这个项目持续了 6个月。 然后又回到 Eclipse 富客户的工作。 这可能是我的问题的一部分,但我从来没有参与过脚本。

我在for中需要的一件事是获取当前用于构建的tftp修订号。 欢迎建议。

约翰

时间:原作者:1个回答

0 0

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

默认情况下,create-script"导入"生成的脚本通过 _GrailsInit 脚本生成 includeTargets <<grailsScript("_GrailsInit") 你可以做同样的操作,利用在安装的插件目录中指出的魔术变量:

includeTargets <<new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")

如果这样做,可以删除_GrailsInit的包含,因为它已经包含,但如果你不这样做,因为Grails只包含文件一次。

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

下面是一个与 dbm-generate-changelog 相同的示例脚本,但是添加了一个以前和之后的消息:

includeTargets <<new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")
target(foo:"Just calls dbmGenerateChangelog") {
 println 'before'
 dbmGenerateChangelog()
 println 'after'
}
setDefaultTarget foo

注意,我将目标从 main 重命名为 foo,所以它是惟一的,如果你想从另一个脚本。

作为使用tmodel的示例,如果没有提供,这里是一个修改后的版本,指定默认的更新名称:

println 'before'
if (!argsMap.params) {
 argsMap.params = ['foo2.groovy']
}
dbmGenerateChangelog()
println 'after'

:下面是一个完整的示例,它将的输出捕获到字符串:

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
原作者:
...