2012-02-21 15 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