“project.copy”不适用于MacOS High Sierra
问题描述:
在我的Android Studio项目中,我有一个小脚本,它可以从不同的Language Resources创建,Android为strings.xml
,iOS为.lproj
。“project.copy”不适用于MacOS High Sierra
到目前为止,一切正常,但后来我升级到MacOS高塞拉利昂。现在在我的Android Studio项目中,创建我的字符串值的gradle-Task失败,因此无法在将string.xml
移动到res/
文件夹时打开values-da
文件夹。
它失败的部分是在这里:
project.fileTree(dir: scriptPath).visit {
FileVisitDetails details ->
if (details.file.name.startsWith("values-")) {
println "copying " + details.file.absolutePath + " to " + resPath;
//It fails here at .copy
project.copy {
from details.file.absolutePath
into resPath + "/" + details.file.name
// copy english resources to base values folder
if (details.file.name.equals("values-en")) {
into resPath + "/values"
}
}
details.file.deleteDir();
}
}
我的第一个猜测是,这可能与新的文件系统。有没有人有类似的问题?我可以证实我可能是由高塞拉引起的,因为我的同事在更新到高塞拉之后也有同样的问题。
这里的“出了什么问题” -Message:
* What went wrong:
A problem occurred evaluating project ':app'.
> Could not read directory path '/Some/path/from/User/values-da'.
这里是堆栈跟踪,同时用--stacktrace
运行任务我:
Caused by: org.gradle.api.GradleException: Could not read directory path '/Some/path/from/User/values-da'.
08:14:17.474 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.collections.jdk7.Jdk7DirectoryWalker$1.postVisitDirectory(Jdk7DirectoryWalker.java:109)
08:14:17.474 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.collections.jdk7.Jdk7DirectoryWalker$1.postVisitDirectory(Jdk7DirectoryWalker.java:58)
08:14:17.475 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.collections.jdk7.Jdk7DirectoryWalker.walkDir(Jdk7DirectoryWalker.java:58)
08:14:17.475 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(DirectoryFileTree.java:163)
08:14:17.475 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.collections.DirectoryFileTree.visitFrom(DirectoryFileTree.java:147)
08:14:17.475 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.collections.DirectoryFileTree.visit(DirectoryFileTree.java:132)
08:14:17.476 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.collections.FileTreeAdapter.visit(FileTreeAdapter.java:110)
08:14:17.476 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.AbstractFileTree.visit(AbstractFileTree.java:123)
08:14:17.476 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.CompositeFileTree.visit(CompositeFileTree.java:64)
08:14:17.476 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.file.CompositeFileTree.visit(CompositeFileTree.java:58)
08:14:17.476 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.file.FileTree$visit.call(Unknown Source)
08:14:17.476 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at build_4z109ko3musne9trwmjez6vxh$_run_closure6.doCall(/Users/mtuchner/fotoplus-android/frontend-android/app/build.gradle:230)
08:14:17.477 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:70)
08:14:17.477 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.util.ConfigureUtil.configureTarget(ConfigureUtil.java:160)
08:14:17.477 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.util.ConfigureUtil.configureSelf(ConfigureUtil.java:136)
08:14:17.477 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.AbstractTask.configure(AbstractTask.java:528)
08:14:17.477 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.tasks.DefaultTaskContainer.create(DefaultTaskContainer.java:137)
08:14:17.478 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.tasks.TaskContainer$create.call(Unknown Source)
08:14:17.478 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at build_4z109ko3musne9trwmjez6vxh.run(/Users/mtuchner/fotoplus-android/frontend-android/app/build.gradle:184)
08:14:17.478 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:90)
08:14:17.478 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] ... 62 more
答
我能解决我的问题,一个小的变化。 在发布我见过的堆栈跟踪之后,JDK7FileProvider的“.postVisitDirectory”方法抛出错误。
文档说,在FileTree中访问后,总是调用此方法。于是我将删除操作从当前访问中移出并放入.visit{}
后面的关闭中,然后再次编译。
下面的代码:
List<File> dirsToDelete = new ArrayList<File>()
// copy string resources from shared
project.fileTree(dir: scriptPath).visit {
FileVisitDetails details ->
if (details.file.name.startsWith("values-")) {
println "copying " + details.file.absolutePath + " to " + resPath;
project.copy {
from details.file.absolutePath
into resPath + "/" + details.file.name
// copy english resources to base values folder
if (details.file.name.equals("values-en")) {
into resPath + "/values"
}
dirsToDelete.add(details.file)
}
}
}.with {
for(Iterator<File> i = dirsToDelete.iterator(); i.hasNext();) {
File file = i.next();
file.deleteDir();
}
}