0

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

}

我希望能够在我的插件的“应用”方法中读取 project.oozie.sourceSets 等属性的值。

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

我该如何解决这个问题?

谢谢!

4

1 回答 1

0

我采用的解决方案是:

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)
      }
    }
  }

}
于 2015-11-20T22:03:28.613 回答