gradle - Gradle自定义插件:如何使用预期在构建脚本中设置的属性配置Gradle任务

标签 gradle build.gradle gradle-plugin

我正在尝试编写一个自定义的Gradle插件,并且需要使用属性值来期望由构建脚本(build.gradle)提供的属性在项目上配置“Zip”任务。

这是我的build.gradle脚本的相关部分:

oozie {
  sourceSets {
    workflow {
      dslDir = 'workflow/dsl'
      dslCopySpec = {
        rename { it - ~/\.[^\.]+$/ + '.xml' }
        filter(OozieDslFilter)
      }
      resourceDir = 'workflow/resources'
      resourceCopySpec = {}
    }
    coordinator {
      dslDir = 'coordinator/dsl'
      dslCopySpec = {
        rename { it - ~/\.[^\.]+$/ + '.xml' }
        filter(OozieDslFilter)
      }
      resourceDir = 'coordinator/resources'
      resourceCopySpec = {}
    }
  }
}

这是我的插件代码,目前无法满足我的期望:
class Oozie implements Plugin<Project> {

  @Override
  void apply(Project project) {

    project.configurations {
      oozieLibs {
        description = /Java libraries (jars) to be downloaded and included in the workflow 'lib' directory/
        transitive = true
      }
    }

    project.extensions.create('oozie',
        OozieExtension,
        project.container(OozieSourceSet)
    )

    project.task('build', type: Zip) {
      group = 'Oozie Workflow Build'
      with {
        archiveName = "${project.name}-${project.version}.${extension}"
        destinationDir = project.buildDir
      }
      from(project.configurations.oozieLibs) {
        into 'lib'
      }

      // project.oozie.sourceSets is empty at this time for obvious reasons.
      println project.oozie.sourceSets

      project.oozie.sourceSets.each { OozieSourceSet sourceSet ->
        println sourceSet
        from(sourceSet.dslDir, sourceSet.dslCopySpec)
        from(sourceSet.resourceDir, sourceSet.resourceCopySpec)
      }
    }

    project.task('clean', type: Delete) {
      group = 'Oozie Workflow Build'
      delete project.buildDir
    }
  }

}

我期望能够读取插件的“apply”方法中的诸如project.oozie.sourceSets之类的属性的值。

但是,在调用我的自定义插件的“apply”方法时,project.oozie.sourceSets的值为空,因为尚未执行为该属性设置值的build.gradle脚本。

我该如何解决这个问题?

谢谢!

最佳答案

我去的解决方案是:

class Oozie implements Plugin<Project> {

  static final String DEFAULT_FILE_EXTENSION_FINDER_REGEX = /\.[^\.]+$/
  static final String DEFAULT_EXTENSION_REPLACEMENT = '.xml'
  final static DEFAULT_WORKFLOW_ROOT = 'workflow'
  final static DEFAULT_COORDINATOR_ROOT = 'coordinator'
  final static DEFAULT_DSL_DIR = 'dsl'
  final static DEFAULT_RESOURCE_DIR = 'resources'

  @Override
  void apply(Project project) {

    project.configurations {
      oozieLibs {
        description = /Java libraries (jars) to be downloaded and included in the workflow 'lib' directory/
        transitive = true
      }
    }

    project.extensions.create('oozie',
        OozieExtension,
        project.container(OozieSourceSet)
    )

    project.oozie.sourceSets {
      workflow {
        dslCopySpec = {
          from("${DEFAULT_WORKFLOW_ROOT}/${DEFAULT_DSL_DIR}") {
            rename { it - ~DEFAULT_FILE_EXTENSION_FINDER_REGEX + DEFAULT_EXTENSION_REPLACEMENT }
            filter(OozieWorkflowDslFilter)
          }
        }
        resourceCopySpec = {
          from("${DEFAULT_WORKFLOW_ROOT}/${DEFAULT_RESOURCE_DIR}")
        }
      }
      coordinator {
        dslCopySpec = {
          from("${DEFAULT_COORDINATOR_ROOT}/${DEFAULT_DSL_DIR}") {
            rename { it - ~DEFAULT_FILE_EXTENSION_FINDER_REGEX + DEFAULT_EXTENSION_REPLACEMENT }
            filter(OozieWorkflowDslFilter)
          }
        }
        resourceCopySpec = {
          from("${DEFAULT_COORDINATOR_ROOT}/${DEFAULT_RESOURCE_DIR}")
        }
      }
    }

    project.task('build', type: Zip) {
      group = 'Oozie Workflow Build'
      with {
        archiveName = "${project.name}-${project.version}.${extension}"
        destinationDir = project.buildDir
      }
    }

    project.task('clean', type: Delete) {
      group = 'Oozie Workflow Build'
      delete project.buildDir
    }

    project.afterEvaluate {
      project.build.with {
        from(project.configurations.oozieLibs) {
          into 'lib'
        }
      }

      project.oozie.sourceSets.each { OozieSourceSet sourceSet ->
        project.build.with(sourceSet.dslCopySpec)
        project.build.with(sourceSet.resourceCopySpec)
      }
    }
  }

}

关于gradle - Gradle自定义插件:如何使用预期在构建脚本中设置的属性配置Gradle任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33835019/

相关文章:

java - 使用 aes/ecb/pkcs5padding 解密字节数组时出现 IllegalBlockSizeException

android - 未找到 ID 为 'com.android.application' 的插件

gradle - gradle将不再同步插件

android - doLast gradle任务未运行

gradle - 如何使用 Gradle API 获取 Android Studio 主 SourceSet?

Gradle 不包含传递依赖

java - 无法使 gradle 导入 Lombok 依赖项

mysql - gradle中字符串的字符编码

Android studio 更新构建错误

gradle - 在Gradle构建中配置多个SonarQube实例