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