0

我有一个 gradle 任务,我想有 2 个不同的版本。该任务是一个名为“migrate”的自定义任务,它将应用数据库迁移以便以后生成数据库类。

我想创建一个具有不同配置的副本,以将迁移应用到本地数据库。

目前,我有:

task migrateLocal(type: com.me.tasks.ApplyMigrationsTask) {
  port = 3306
  dbName = "me"
  host = 'localhost'
  migrationsDirectoryPath = project.layout.projectDirectory.dir("src/main/resources/me/migrations")
}

但是,我收到一个错误Cannot cast object '3306' with class 'java.lang.Integer' to class 'org.gradle.api.provider.Provider'

经过进一步调查,我试图做:

task migrateLocal(type: com.me.tasks.ApplyMigrationsTask) {
  port.set(3306)
  dbName.set("me")
  host.set('localhost')
  migrationsDirectoryPath.set(project.layout.projectDirectory.dir("src/main/resources/me/migrations"))
}

但后来我得到一个错误,如:Cannot get the value of write-only property 'port' for task 'migrateLocal'

这样做的正确方法是什么?我无法找到有关此模式或这些错误的文档。

谢谢。

4

1 回答 1

0

有很多方法可以做到这一点。

一种方法是为每个配置定义通用任务:

def configs = ["C1", "C2"]
configs.each{ cfg -> 

    // call this using migrateLocalC1 or migrateLocalC2 
    task "migrateLocal${cfg}"{
        description 'some generic task'
        // do magic
    }
}

然后,您可以进一步全局定义,例如def dbNameC1="me"并在相应的任务中检索/设置它dbName = ${dbname${cfg}}(这发生// do magic在我的示例中)。

我认为更适合您的情况的另一种方法是将这些属性存储在配置中,特别是您可以将其放入gradle.properties. 例如,您可以放置​​一个属性dbName=me,然后通过${dbName}. 请记住,这些是在配置中设置的,而不是在脚本执行时设置的。此外,您可以查看ext.

于 2019-08-07T12:29:41.400 回答