格拉德尔';s尝试在Windows上规范化路径导致java.io.IOException:参数无效

格拉德尔';s尝试在Windows上规范化路径导致java.io.IOException:参数无效,windows,gradle,ioexception,Windows,Gradle,Ioexception,假设我已经用以下方式覆盖了Gradle的clean任务,因此只有build/目录的某些子目录被删除: //build.gradle 干净的{ 删除 删除。添加“build/kotlin/**” 删除。添加“build/libs/**” 删除。添加“build/tmp/**” } 这在Unices上工作得很好,但在Windows上出现IOException时失败: 显然。异常源于java.io.File.getCanonicalPath()调用。这个问题在任何Gradle 5.x版本上都是可以重

假设我已经用以下方式覆盖了Gradle的
clean
任务,因此只有
build/
目录的某些子目录被删除:

//build.gradle
干净的{
删除
删除。添加“build/kotlin/**”
删除。添加“build/libs/**”
删除。添加“build/tmp/**”
}
这在Unices上工作得很好,但在Windows上出现
IOException
时失败:

显然。异常源于
java.io.File.getCanonicalPath()
调用。这个问题在任何Gradle 5.x版本上都是可以重现的

在使用路径时,Gradle不应该将斜杠转换为依赖于平台的文件分隔符吗

如何以独立于平台的方式重新实现我的
build.gradle
逻辑?

您不能在提供的文件路径中使用glob(如路径中的
**
)来删除。API文档说,您可以使用“Project.files(object…”接受的任何类型的对象(),在路径字符串的情况下,这意味着“根据
file(object)
”()相对于项目目录进行解释”。但是,传递给的字符串不支持全局

在Unix下,
**
是一个完全有效的文件名,因此您的代码在那里工作(尽管除了一些名为
**
;-)的文件外,没有任何内容被删除)。在Windows下,这样的文件名是不允许的,因此会出现异常

假设您还可以删除要清理的目录,则只需将任务配置更改为以下内容:

clean {
    delete.clear()
    delete.add 'build/kotlin'
    delete.add 'build/libs'
    delete.add 'build/tmp'
}
clean {
    delete.clear()
    delete.add 'build/kotlin'
    delete.add 'build/libs'
    delete.add 'build/tmp'
}