는 grails create-script scriptname
을 실행하여 새 스크립트를 작성합니다. 데이터베이스 이주 플러그인 스크립트는 쉽게 다시 사용할 수 있도록 구성됩니다. _DatabaseMigrationCommon.groovy
에는 많은 공유 코드가 있으며 각 스크립트는 고유 한 이름을 가진 하나의 대상을 정의합니다. 따라서 공유 스크립트 또는 임의의 독립 실행 형 스크립트 (또는 여러 스크립트)를 가져 와서 메서드처럼 대상을 호출 할 수 있습니다.
includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")
당신이 할 경우 설치된 플러그인 '디렉토리를 가리 마법 변수를 활용 스크립트가 includeTargets << grailsScript("_GrailsInit")
를 통해 create-script
"수입"는 _GrailsInit
스크립트에 의해 생성과 같은 작업을 수행 할 수 있습니다 기본적으로
, 이미 포함되어 있기 때문에 _GrailsInit의 include를 제거 할 수 있지만 Grails가 파일을 한 번만 포함하기 때문에 괜찮 으면.
그런 다음 대상을 정의하고 플러그인 대상 중 하나를 호출 할 수 있습니다. 타겟은 매개 변수를 받아 들일 수 없지만, 사용자가 지정한 args를 시뮬레이트하기 위해 argsMap
에 데이터를 추가 할 수 있습니다 (Grails가 구문 분석 된 명령 행 인수에서 생성 한 맵입니다). 스크립트에 전달 된 인수는 모두 argsMap
을 사용하기 때문에 데이터베이스 이전 플러그인의 스크립트에서 볼 수 있습니다. 여기
그냥
dbm-generate-changelog
같은 일을하지만 추가하는 예제 스크립트의 전 (before) 및 메시지 후 : 내가
foo
에
main
에서 대상을 이름
includeTargets << new File("$databaseMigrationPluginDir/scripts/DbmGenerateChangelog.groovy")
target(foo: "Just calls dbmGenerateChangelog") {
println 'before'
dbmGenerateChangelog()
println 'after'
}
setDefaultTarget foo
주 그래서, 독특한 경우에 당신이 원하는 다른 스크립트에서 이것을 호출하십시오.
println 'before'
if (!argsMap.params) {
argsMap.params = ['foo2.groovy']
}
dbmGenerateChangelog()
println 'after'
편집 : 인수 작업의 예로서
가 여기에 아무도 제공하지 않은 경우 기본 변경 로그의 이름을 지정하는 수정 된 버전의 다음의 출력을 캡처하는 풀러 예입니다 DBM은-GORM 문자열에 대한 차이 :
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
감사합니다. 정말 도움이되는 초보자를 제공하기 위해 문제를 해결해 주셔서 감사합니다. 나는 지금 'diff'파일을 만들 수 있었다. dbmGormDiff()에 파일 이름 매개 변수를 제공하지 않으면 콘솔에 출력이 표시됩니다 (지정된대로). 스크립트에서 콘솔 출력을 클로저로 전달할 수 있습니까? 그런 식으로 '
답변을 편집하고 예제를 추가했습니다 –
감사합니다 버트 - 정말 큰 도움이됩니다. 여전히 1.2.2를 사용하고 있기 때문에 DbmGormDiff 버전의 복사본에 'boasOut'을 대신 사용하여 코드를 작성했습니다. 내 메인 스크립트에서 사용할 내부 'utils'스크립트를 만들었습니다. 최대량은 지금 작동하고있다. 도메인 변경이 있고 changelog-svnRevno.xml 파일 (재실행)이 있으면 삭제하고 계속 진행합니다. 하나의 문제는 master.xml이 duplicates 'includes'로 업데이트되는 것을 막는 방법입니다. SVN에서 이전 버전을 가져 와서 그 문제를 해결할 수 있는지 확신 할 수 없습니다. SVN에서 재실행하는 방법을 모를 수 있기 때문입니다. 간단한 스크립팅이 필요하다고 생각합니다. –