gradle - 创建具有不同配置值的任务的副本

标签 gradle gradle-task

我有一个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'
正确的方法是什么?我无法找到有关此模式或这些错误的文档。

谢谢。

最佳答案

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

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

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

关于gradle - 创建具有不同配置值的任务的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57226756/

相关文章:

android - 属性名称的Gradle别名

android - 如何使用 Android Gradle 压缩文件夹?

android - kapt 不解析 protobuf 生成的类

android - 将参数传递给 gradle Exec 任务

android - 从gradle中的多个依赖项中排除同一组?

android - 尝试将 Gradle 项目导入 Android Studio 现有项目时出错

gradle - Gradle 包含模式

gradle - 让gradle在每次设置时执行一个finalizedBy任务(多次)

gradle - 在子项目中运行gradle任务

java - 如何在 createStartScripts 任务中更改 unixStartScriptGenerator.template 以便 distTar 在 build.gradle 中使用我的自定义模板文件?