我有一个采用字符串和闭包的方法,我将其包含在我的插件约定中:

def someMethod( String obj, Closure closure) {
    println('HERE I AM')
    confFileTree = project.fileTree( obj, closure )
}

从Junit测试中,我这样称呼它:
project.convention.plugins.license.licenseFiles( 'src') {
    include "main/java/**"
    include "main/resources/*.properties"
    exclude "**/Licensed.java"
}

我知道该方法被称为是因为打印了“HERE I AM”。但是然后我得到一个错误,说:
org.gradle.api.internal.MissingMethodException:
    Could not find method fileTree() for arguments
    [src, nl.javadude.gradle.plugins.license.tasks.LicenseTaskTest$_shouldScanFilesForLicenseWithExclude_closure1@3cbdb6ae]
    on root project 'test'.

我应该指出,这段代码最初只是称为fileTree的Closure形式,在其闭包中带有“from'src'”,效果很好,但是Gradle里程碑8告诉我这是一个过时的方法。

最佳答案

您确定测试针对m8运行吗?无论如何,这里有一些改进建议(因为我已经知道您要实现的目标):

  • 我认为您不想构建自己的文件树。您只希望用户传递一个'filter'闭包(例如在您的示例中),然后使用sourceSets.main.java方法将其应用于源目录集(例如FileTree.matching(Closure))。您将获得应用了过滤器的新文件树。
  • 我建议使用扩展名而不是约定对象
  • 从Groovy代码访问约定对象或扩展名时,不需要冗长的语法。在单元测试示例中,您只能说project.licenseFiles(...) {...}
  • 07-28 03:11