【问题标题】:Creating a copy of a task with different configuration values创建具有不同配置值的任务副本
【发布时间】:2019-12-05 04:41:03
【问题描述】:

我有一个 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'

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

谢谢。

【问题讨论】:

  • 您使用的是公共 Gradle 插件吗? ApplyMigrationsTask 来自哪里?

标签: gradle gradle-task


【解决方案1】:

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

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

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} 将其加载到您的Gradle 任务中。请记住,这些是在配置中设置的,而不是在脚本执行时设置的。此外,您可以查看ext

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2016-09-09
    • 1970-01-01
    • 2014-06-25
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多