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

Gradle自定义插件:如何使用预期在构建脚本中设置的属性配置Gradle任务,gradle,build.gradle,gradle-plugin,Gradle,Build.gradle,Gradle Plugin,我正在尝试编写一个定制的Gradle插件,我需要使用构建脚本(build.Gradle)提供的属性值在我的项目上配置一个“Zip”任务 下面是我的build.gradle脚本的相关部分: oozie { sourceSets { workflow { dslDir = 'workflow/dsl' dslCopySpec = { rename { it - ~/\.[^\.]+$/ + '.xml' } filter(Oozie

我正在尝试编写一个定制的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
    }
  }

}
class Oozie实现插件{
@凌驾
无效申请(项目){
project.configurations{
oozieLibs{
description=/Java库(jar)要下载并包含在工作流“lib”目录中/
可传递=真
}
}
project.extensions.create('oozie',
Oozie扩展,
project.container(OozieSourceSet)
)
任务('build',类型:Zip){
组='Oozie工作流生成'
与{
archiveName=“${project.name}-${project.version}.${extension}”
destinationDir=project.buildDir
}
来自(project.configurations.oozieLibs){
进入“自由”
}
//由于明显的原因,project.oozie.sourceset此时为空。
println project.oozie.sourceset
project.oozie.sourceSet.each{OozieSourceSet sourceSet->
println源集
from(sourceSet.dslDir,sourceSet.dslCopySpec)
from(sourceSet.resourceDir,sourceSet.resourceCopySpec)
}
}
项目任务('clean',类型:Delete){
组='Oozie工作流生成'
删除project.buildDir
}
}
}
我希望能够在插件的“apply”方法中读取project.oozie.sourceset等属性的值

但是,在调用我的自定义插件的“apply”方法时,project.oozie.sourceset的值为空,因为为该属性设置值的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)
      }
    }
  }

}
class Oozie实现插件{
静态最终字符串默认\u文件\u扩展名\u查找器\u正则表达式=/\.[^\.]+$/
静态最终字符串默认扩展名替换='.xml'
最终静态默认\u工作流\u根='工作流'
最终静态默认\u协调器\u根='COORDINATOR'
最终静态默认值\u DSL\u DIR='DSL'
最终静态默认资源目录='resources'
@凌驾
无效申请(项目){
project.configurations{
oozieLibs{
description=/Java库(jar)要下载并包含在工作流“lib”目录中/
可传递=真
}
}
project.extensions.create('oozie',
Oozie扩展,
project.container(OozieSourceSet)
)
project.oozie.sourceset{
工作流程{
dslCopySpec={
来自(${DEFAULT\u WORKFLOW\u ROOT}/${DEFAULT\u DSL\u DIR}){
重命名{it-~DEFAULT_FILE_EXTENSION_FINDER_REGEX+DEFAULT_EXTENSION_REPLACEMENT}
过滤器(OozieWorkflowDSLPILTER)
}
}
resourceCopySpec={
来自(${DEFAULT\u工作流\u根目录}/${DEFAULT\u资源\u目录})
}
}
协调人{
dslCopySpec={
从(${DEFAULT\u COORDINATOR\u ROOT}/${DEFAULT\u DSL\u DIR})开始){
重命名{it-~DEFAULT_FILE_EXTENSION_FINDER_REGEX+DEFAULT_EXTENSION_REPLACEMENT}
过滤器(OozieWorkflowDSLPILTER)
}
}
resourceCopySpec={
来自(${DEFAULT\u协调器\u根目录}/${DEFAULT\u资源\u目录})
}
}
}
任务('build',类型:Zip){
组='Oozie工作流生成'
与{
archiveName=“${project.name}-${project.version}.${extension}”
destinationDir=project.buildDir
}
}
项目任务('clean',类型:Delete){
组='Oozie工作流生成'
删除project.buildDir
}
项目后评估{
project.build.with{
来自(project.configurations.oozieLibs){
进入“自由”
}
}
project.oozie.sourceSet.each{OozieSourceSet sourceSet->
project.build.with(sourceSet.dslCopySpec)
project.build.with(sourceSet.resourceCopySpec)
}
}
}
}

如果你能更明确地描述什么对你不起作用,那会很有帮助。谢谢@EricWendelin我用一些解释更新了这个问题。如果您认为需要更多信息,请告诉我。