格拉德尔';s尝试在Windows上规范化路径导致java.io.IOException:参数无效
假设我已经用以下方式覆盖了Gradle的格拉德尔';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版本上都是可以重
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'
}