"project.copy" 不适用于 MacOS High Sierra

"project.copy" not working on MacOS High Sierra

在我的 Android Studio 项目中,我有一个小脚本,它从不同的语言资源创建,strings.xml 用于 Android,.lproj 用于 iOS .

到目前为止,一切正常,但后来我升级到 MacOS High Sierra。现在在我的 Android Studio 项目中,创建我的字符串值的 gradle-Task 失败,因为它在将 string.xml 移动到 [=18] 时无法打开 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();
        }
} 

我的第一个猜测是,这可能与新的文件系统有关。有没有人有类似的问题?我可以验证我可能是由 High Sierra 引起的,因为我的同事在更新到 High Sierra 后也有同样的问题。

这里是"What went wrong"-消息:

* What went wrong:
A problem occurred evaluating project ':app'.
> Could not read directory path '/Some/path/from/User/values-da'.

这是我在 运行 使用 --stacktrace:

的任务时得到的 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.postVisitDirectory(Jdk7DirectoryWalker.java:109)
08:14:17.474 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.api.internal.file.collections.jdk7.Jdk7DirectoryWalker.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();
    }
}