如何在 Gradle 管理的 Groovy class 中实例化一个 FileTree?

How to instantiate a FileTree in a Groovy class managed by Gradle?

我有一个 Gradle 构建脚本,它变得太大了,所以我制作了一个实用程序 class。 在此 class 中,我想使用 Gradle fileTree(或任何其他 Gradle class),我该怎么做? 要清楚,这是在 build.gradle:

ext {
    utils = new Utils()
}

并在 Utils.groovy 中(在 buildSrc/src/main/groovy 中):

def chopBackgroundImage(String inPath, String outPath, int scale) {
       new File(outPath).mkdirs();
       def tree = fileTree(dir: inPath, include: '*.png') // doesnt work
    }

fileTree 是在 Project 接口上定义的方法,因此需要将 project 实例传递给方法并在 [= 中导入 Project class 16=]。 Utils 应该是这样的:

import org.gradle.api.Project

public class Utils {
    def chopBackgroundImage(Project project, String inPath, String outPath, int scale) {
       new File(outPath).mkdirs();
       def tree = project.fileTree(dir: inPath, include: '*.png') 
    }
}

要使 Project 可在 buildSrc 中访问,请修改 build.gradle 添加以下内容:

buildscript {
   dependencies {
      gradleApi()
   }
}

而且 - 当然 - 因为 groovy 是一种动态语言 chopBackgroundImage 可以按以下方式定义:

def chopBackgroundImage(project, inPath, outPath, scale) {
   new File(outPath).mkdirs()
   def tree = project.fileTree(dir: inPath, include: '*.png') 
}

不需要依赖项! ;)