2017-04-12 81 views
0

以下內容在gradle中似乎是一種常見的習慣用法,用於過濾資源文件的子集。我知道它做什麼,但我有麻煩破譯語法:瞭解gradle processResources過濾器語法

processResources { 
    filesMatching('foo/*.html') { 
     filter(ReplaceTokens, tokens: [key: 'value']) 
    } 
} 

我明白了這一步:

  • processResources是Java插件,它是複製型的任務。
  • 我通過調用下面的方法配置processResources任務:

    AbstractCopyTask filesMatching(String pattern, Action<? super FileCopyDetails> action)

  • 的第一個參數的方法是一個模式字符串。我提供'foo/*。html'作爲模式。

  • 該方法的第二個參數是Action接口,它只有一個方法。我正在提供一個閉包作爲接口的實現。

這是我迷路的地方。在封閉體中,我調用了過濾方法。它從何而來?它也不是來自隱式項目對象。而且,過濾方法甚至不適用於任何文件對象。代幣是如何替換的?而且,ReplaceTokens是一個類,傳遞類名作爲參數如何在語法上起作用?

我沒有連接點,我也不確定這些點是在gradle還是groovy中。我一直在研究文檔和博客一段時間,但不是運氣。我感謝一些幫助。謝謝。

+0

你覺得我的回答有幫助嗎? – Opal

+0

恐怕這只是部分有用的。我仍然不明白過濾器方法如何在文件對象上運行,而不用作爲參數。當然閱讀源代碼總是一個選項.. – hummingV

+0

你不明白? – Opal

回答

1

您正在查找的filter方法定義在CopySpec接口中,確切地說是herefilesMatchingCopySpec也宣佈,自ProcessResources - >Copy - >AbstractCopyTaskAbstractCopyTask工具CopySpec這些方法是在任務本身的調用。

令牌替換是由來自Ant的ReplaceTokens類完成的,當涉及到groovy String == String.class中的語法時。過濾本身在this類中運行。

我可以向你推薦的就是下載gradle這個來源,將其導入到IDE,並從ProcessResourcess類開始旅程 - 這是爲了瞭解引擎蓋下會發生什麼最簡單的方法。

+0

鏈接到Gradle CopySpec已損壞 – wspurgin

+0

它是https://github.com/gradle/gradle/blob/master/subprojects/core-api/src/main/java/org/gradle/api/file/CopySpec.java現在 – wspurgin