を実行して新しいスクリプトを作成しますgrails create-script scriptname
。データベース移行プラグイン スクリプトは、簡単に再利用できるように構成されています。には多くの共有コードが_DatabaseMigrationCommon.groovy
あり、各スクリプトは一意の名前を持つ 1 つのターゲットを定義します。したがって、共有スクリプトまたは任意のスタンドアロン スクリプト (または複数のスクリプト) をインポートして、ターゲットをメソッドのように呼び出すことができます。
デフォルトでは、によって生成されたスクリプトはスクリプトを「create-script
インポート」します。インストールされたプラグインのディレクトリを指す魔法の変数を利用して、同じことを行うことができます。_GrailsInit
includeTargets << grailsScript("_GrailsInit")
includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")
_GrailsInit は既にインクルードされているため、これを行うとインクルードを削除できますが、Grails はファイルを 1 回しかインクルードしないため、削除しなくても問題ありません。
次に、ターゲットを定義して、プラグインのターゲットを呼び出すことができます。ターゲットはパラメーターを受け入れることはできませんが、データを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
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