我有一个任务,它从具有Copy,Jar等排除方法的所有任务中排除某些文件。
task excluder<<{
def alltasks = project.getAllTasks(true).get(project)
for(def t in alltasks){
try{
println t.name
t.exclude([f])
println f
}
catch(MissingMethodException e){}
}
println 'excluded files'
}
当我明确提到要在任务中排除的文件时,例如
t.exclude(['a','b'])
,它们将被排除。但是,如果我在exclude方法中传递属性,则不会将它们排除在外。在gradle.properties中,我设置了
f='a','b'
,当我运行任务测试时,它不排除文件夹“a”和“b”。它没有给出任何错误,并且
println f
方法可以正常工作,它可以打印'a','b'
我想知道为什么会这样。
编辑
在BjörnKautler的回应之后,我在build.gradle中进行了这些更改
.build.gradle
ext{
f="['a','b']"
}
project.tasks.withType(AbstractCopyTask) {
println it
println f
it.exclude(f)
}
task copier(type:Copy){
from 'src'
into 'C:/Documents and Settings/manoj.deshpande/Desktop/Destingation/Copy'
}
task jarer(type:Jar, dependsOn:copier){
from 'src'
archiveName = 'namer.jar'
destinationDir file('C:/Documents and Settings/manoj.deshpande/Desktop/Destingation/Jar')
}
最佳答案
您的问题是您不考虑Gradle阶段。
在初始化阶段,将执行settings.gradle并将多项目构建的项目添加到构建中。
然后是配置阶段,在此阶段配置任务,并设置诸如排除之类的内容。
最后是执行阶段,其中执行了所需的任务。
您尝试在执行阶段更改配置,这确实很糟糕,并且很容易像您观察到的那样无法正常工作。
如果要有条件地排除某些内容,请不要通过任务执行此操作(如果没有任务依赖项,也不能保证在尝试操作的任务之前运行该任务),而是要通过一些项目属性来进行设置从命令行使用-P excludeShit=true
。
然后在之外的构建文件中添加类似以下内容的任何任务if (hasProperty('excludeShit') && excludeShit.toBoolean()) {
project.tasks.withType(AbstractCopyTask) {
it.exclude f
}
}
这会将f
排除在Copy,Sync,Jar,Zip,Tar等类型的任务中。
关于gradle - 排除方法在gradle中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36691233/