如何将参数添加到 flyway build.gradle 文件?

How to add parameters to flyway build.gradle file?

我的 build.gradle 文件中有这个:

    flyway {
        url = 'jdbc:oracle:thin:@localhost:1521:DB'
        user = 'user'
        password = 'pass'
        driver = 'oracle.jdbc.OracleDriver'
        placeholderReplacement = true
        schemas = ['OWNER']

    println "PRINT ARG:"
    println testArg

    locations = ["filesystem:soem-path/common"]
    placeholders = [
            'some.store.owner': flyway.schemas[0],
            'some.user'           : 'USER',
    ]
}

在我用 testArg 添加该部分后,构建总是失败。我想这样输入:

./gradlew flywayMigrate -PtestArg=test -Dflyway.configFiles=../flyway/flyway-dev.properties -i

错误信息是:

Caused by: groovy.lang.MissingPropertyException: Could not get unknown property 'testArg' for object of type org.flywaydb.gradle.FlywayExtension.
    at org.gradle.internal.metaobject.AbstractDynamicObject.getMissingProperty(AbstractDynamicObject.java:87)
    at org.gradle.internal.metaobject.ConfigureDelegate.getProperty(ConfigureDelegate.java:130)

我怎样才能在里面得到一个 属性?

我相信你的问题是,当你在 flyway 配置闭包(即 flyway { ... } 部分)时,你的委托对象(即当 属性 未找到时在您的本地代码中,class gradle 将在接下来查找)是 flyway 扩展。换句话说,当您在 flyway { ... } 中时,gradle 将查找在 flyway 插件代码中您的代码中未立即找到的任何 属性。

您要查找的是 gradle project 对象的属性。例如,您可以这样做:

ext {
  projectProperty = { name ->
    project.hasProperty(name) ? project.properties[name] : null
  }
}

flyway { 
  def testArg = projectProperty('testArg')
  println "project property testArg: ${testArg}"
}

(未经测试,但至少原则上应该有效)。

其中 hasProperty 调用可确保在未为项目设置 属性 时代码不会中断。

groovy 闭包委托的解释,groovy 语言文档有 a section specifically explaining this.

这有效:

def devEnv = System.properties.containsKey("devEnv")


flyway {
    .....
    if (devEnv) {
        locations += "filesystem:some/path"
    }
    ....
}

并像这样调用 flyway:

./gradlew flywayClean -DdevEnv -Dflyway.configFiles=...