gpt4 book ai didi

grails - grails:有关编写脚本的指南,特别是调用现有数据库迁移脚本的指南

转载 作者:行者123 更新时间:2023-12-02 15:34:17 24 4
gpt4 key购买 nike

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

我查看了Grails文档和某些db-migration脚本,发现自己陷入了困境-不知道从哪里开始尝试。如果有人可以向我指出任何合适的消息来源,我将不胜感激。顺便说一句,我对Grails有点使用rust 。两年前,通过为期6个月的概念验证项目开始自学。然后回到Eclipse富客户端工作。尽管我从未参与过脚本,但这可能是我的问题的一部分。

在Jenkins evt中,我需要做的一件事就是掌握用于构建的当前SVN版本号。欢迎提出建议。

问候,约翰

最佳答案

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

默认情况下,由create-script生成的脚本会通过_GrailsInit“导入” includeTargets << grailsScript("_GrailsInit")脚本,您可以利用指向已安装插件目录的魔术变量来执行此操作:

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

如果这样做,您可以删除_GrailsInit的包含内容,因为它已经包含在内,但是如果不这样做,则因为Grails仅包含一次文件而已。

然后,您可以定义目标并调用任何插件目标。目标不能接受参数,但是您可以将数据添加到 argsMap(这是Grails从已解析的命令行参数创建的映射),以模拟用户指定的args。注意,传递给脚本的所有args都将由database-migration插件的脚本看到,因为它们使用相同的 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,因此它是唯一的,以防您想从另一个脚本中调用它。

作为使用args的示例,这是一个修改后的版本,如果未提供默认的更改日志名称,则该版本指定默认的更改日志名称:
println 'before'
if (!argsMap.params) {
argsMap.params = ['foo2.groovy']
}
dbmGenerateChangelog()
println 'after'

编辑:这是一个更完整的示例,它将dbm-gorm-diff的输出捕获为字符串:
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

关于grails - grails:有关编写脚本的指南,特别是调用现有数据库迁移脚本的指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14262375/

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