是否有用于檢索包含給定字串、字串集或模式的檔案夾或檔案夾集中的檔案串列的 Gradle 模式?
我的專案生成 RPM 并使用 Nebula RPM 型別(很棒的包!)。有幾種不同型別的檔案需要后處理。我正在嘗試生成包含作為后處理指標的字串的檔案串列。例如,包含“@doc”的檔案需要由檔案生成器腳本處理。包含“@HOSTNAME@”和“@HOSTFQDN@”的檔案需要由 sed 處理,以將字串替換為實際的主機名或主機 fqdn。
包中的搜索根目錄為 src\main\resources。結果,構建腳本設定了安裝后腳本命令 - 類似于:
postInstall('/opt/product/bin/postprocess.sh ' join(filesContainingDocs, " "))
postInstall('/bin/sed -i -e "s/@HOSTNAME@/$(hostname -s)/" -e s/@HOSTFQDN@/$(hostname)/" ' join(filesContainingHostname, " ")
我可以弄清楚安裝后的語法。我很難找到對檔案內容而不是檔案名進行操作的任何常規 Gradle“事物”(即 FileTree)的過濾器。我將如何填充 filesContainingDocs 和 filesContainingHostname - 類似于:
filesContainingDocs = FileTree('src/main/resources', { contents.matches('@doc') }
filesContainingHostname = FileTree('src/main/resources', { contents.matches('@(HOSTNAME|HOSTFQDN)@') }
雖然后處理腳本可以簡單地執行 grep,但我們產品中的幾個 RPM 相互重疊,每個 RPM 應該只對它提供的檔案進行后處理,因此對最終安裝的檔案夾進行通用 grep 是不可行的 - 它會捕獲其他 RPM 提供的檔案。在我看來,我應該能夠在構建時從包含給定 RPM 專案的更大源檔案集中生成正確的靜態檔案串列。
它不一定是 FileTree - 運行像findstr /s /m /c:"@doc" src\main\resources\*.conf(唉,構建平臺是 Windows)這樣的命令會在標準輸出中產生答案,但我不確定如何將該結果轉換為 Gradle 可以用來擴展結果的物件。(我也懷疑有一種“更多的 Gradle 方式”可以做到這一點。)
檔案集和這些檔案的內容通常相當小。
uj5u.com熱心網友回復:
我很難找到對檔案內容而不是檔案名進行操作的任何常規 Gradle“事物”(即 FileTree)的過濾器。
您可以在 Gradle 檔案樹上應用您可以想象的任何過濾器,最終它只是在 JVM 中運行的 Groovy(或 Kotlin)代碼。每個 GradleFileTree只不過是 JavaFile物件的(懶惰評估)集合。要過濾這些File物件,您可以讀取它們的內容,例如以您在 Java 中讀取它們的相同方式。Groovy 甚至為Java 類提供了 JDK 增強,FilegetText()其中包括用于此目的的簡單方法。現在您可以輕松過濾包含特定字串的檔案:
filesContainingDocs = fileTree('src/main/resources', {
filter { file -> file.text.contains('@doc') }
}
.getText()使用 Groovy,您可以像訪問欄位一樣呼叫 getter (.text在本例中)。
如果一個簡單的contains檢查還不夠,Groovy JDK 的增強功能甚至提供了matches(Pattern pattern)on CharSequence/ stringinstances 的方法來執行常規的擴展檢查:
filesContainingDocs = fileTree('src/main/resources', {
filter { file -> file.text.matches('some regex') }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/432349.html
標籤:毕业典礼
上一篇:顫動的android應用程式在發布模式下凍結在啟動螢屏上
下一篇:無法應用插件類“org.gradle.plugins.ide.idea.IdeaPlugin”。專案已評估時無法運行Project.afterEvaluate(Action)
