2012-02-21 12 views
0

我有需要一个字符串和闭合,其中包括我在我的插件约定的方法:麻烦调用文件树(对象,闭合)签名

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" 
} 

我知道这个方法被调用,因为“我在这里”被打印出来。但我然后得到一个错误,指出:

org.gradle.api.internal.MissingMethodException: 
    Could not find method fileTree() for arguments 
    [src, nl.javadude.gradle.plugins.license.tasks[email protected]3cbdb6ae] 
    on root project 'test'. 

我应该指出,这个代码原本只是叫文件树的封闭形式,以“从‘src’中”在封闭,工作正常,但摇篮里程碑8告诉我,这是一个不赞成的方法。

回答

1

您确定测试针对m8运行吗?在任何情况下,这里有改善的几点建议(因为我已经知道你想达到什么目的):

  • 我不认为你想构建自己的文件树。您只希望用户通过“过滤器”关闭(如您的示例中),然后将其应用于源目录集(例如sourceSets.main.java)和FileTree.matching(Closure)方法。你将得到一个应用了过滤器的新文件树。
  • 我建议使用扩展名而不是约定对象
  • 从Groovy代码访问约定对象或扩展时,您不需要冗长的语法。在你的单元测试例子中,你可以说project.licenseFiles(...) {...}
+0

到你的第一个项目符号:源目录集只包含src下的东西,对不对?例如src/main/java和src/main/resources在java项目中的情况。例如我想操作的一个项目至少有4条原始内容的其他路径,它们是“src”目录的兄弟。我可以想象提供配置选项可以与SourceSets或FileTree一起使用)。我会仔细检查我在M8上。为什么你推荐一个扩展对象而不是一个约定对象? – harschware 2012-02-21 04:22:51

+0

项目应该通过源集声明所有源。他们可以添加尽可能多的源代码,比如'sourceSets.main.java'。因此,我首先要专注于过滤现有的源集。通常,即使过滤也不会被需要 - 默认情况下,插件应该简单地在所有来源上运行。为每个源集添加一个任务可能是好事,因为这是Gradle中的一般约定。公约对象是旧的机制。扩展对于几乎所有用例都更好,而且它们是未来。 – 2012-02-21 04:47:53

+0

看来我并没有使用m8,即使我配置了它,请参见[STS-2458](https://issuetracker.springsource.com/browse/STS-2458) – harschware 2012-02-21 06:07:11