2014-03-04 65 views
1

Java編譯在ANT和Gradle中正常工作。我只是想找到方法來編寫Gradle中的代碼來生成xml文件,ANT正在做什麼(請參見下文)。使用XSL XML模板生成的Gradle任務

文件夾結構:所述pattern.properties文件的

 
src/java -- containing java src code 
src/xml -- contains folders: 
      patterns -- contains one xxx.properties file and bunch of .xml and .template files 
      schema  -- contains a .xsd file 
      stylesheet -- contains 3 .xsl files 

內容是:

# xml header information and root element for the document 
pattern.xml.header=<?xml version="1.0"?>\ 
<patternFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Patterns.xsd"> 

# Patterns in order to load. 
pattern.filelist=\ 
GlobalPoints-Dashboard.xml,\ 
IVCompatibility.xml,\ 
IVCompatibilityAgent.xml,\ 
IVCompatibilityProduct.xml,\ 
TVServicesClassSearch.xml,\ 
TVServicesSearchMartindaleIndexNom.xml 

# end element for the file 
pattern.xml.trailer=</patternFile> 

ANT代碼其生成我需要的是最終Patterns.xml文件:
pattern.src.dir = src/xml/patterns
pattern.schema.dir = 的src/XML /模式
pattern.xml.filename = Patterns.xml
pattern.xsd.filename = Patterns.xsd
pattern.src.xsd = SRC/XML /模式/ Patterns.xsd
pattern.output.dir = 溫度
pattern.output.file = 溫度/ Patterns.xml
pattern.properties = pattern.properties

<!-- transform the template patterns --> 
    <target name="templates" > 
     <xslt basedir="src/xml/patterns" 
       destdir="src/xml/patterns" 
       extension=".xml" 
       force="true" 
       style="src/xml/stylesheets/SearchTemplate.xsl" 
       includes="FOX-Tool-Active-Ingredient.template, 
         FOX-Tool-Product.template, 
         FOX-Tool-Product-Material.template"> 
     </xslt> 
    </target> 

    <!-- create the pattern definition file by concatenating all parts --> 
    <target name="build-xml" depends="init,templates"> 
    <loadproperties srcFile="${pattern.src.dir}/${pattern.properties}" /> 
    <!-- make sure all files exist --> 
    <resourcecount property="fileCount"> 
     <fileset dir="${pattern.src.dir}" includes="${pattern.filelist}" /> 
    </resourcecount> 
    <fail message="Files are missing."> 
     <condition> 
     <not> 
      <resourcecount count="${fileCount}"> 
      <filelist dir="${pattern.src.dir}" files="${pattern.filelist}"/> 
      </resourcecount> 
     </not> 
     </condition> 
    </fail> 

    <concat destfile="${pattern.output.file}">${pattern.xml.header}</concat> 
    <concat append="yes" destfile="${pattern.output.file}"> 
     <filelist dir="${pattern.src.dir}" files="${pattern.filelist}"/> 
    </concat> 
    <concat append="yes" destfile="${pattern.output.file}">${pattern.xml.trailer}</concat> 

    <!-- copy the schema to the output directory for validation --> 
    <copy file="${pattern.src.xsd}" 
      todir="${pattern.output.dir}" 
      overwrite="yes"/> 

    <!-- validate that the combined file matches the schema --> 
    <schemavalidate file="${pattern.output.file}"> 
     <schema file="${pattern.src.xsd}" 
       namespace="http://www.w3.org/2001/XMLSchema-instance"/> 
    </schemavalidate> 
    </target> 

使用下面的搖籃代碼,我可以執行的第一塊什麼「模板」的目標是在ANT做。

// Perform XSL transformations in work directory as similar to ANT "templates" target 
def performXslt() { 
    ant { 
     xslt(
     basedir: "${pattern.src.dir}", 
     destdir: "${pattern.src.dir}", 
     extension: ".xml", 
     force: "true", 
     style: "src/xml/stylesheets/SearchTemplate.xsl", 
     includes: "*.template" 
    ) 
    } 
} 

我可以調用上述任務,我會再寫搖籃自定義任務的dependsOn或doFirst。對於這個第二個任務,它將等同於ANT中的「build-xml」目標,我試圖與大家一起檢查 - 什麼是編碼它的有效方法。

當我在ANT中看到「build-xml」目標時,它所做的只是首先調用「template」目標,然後讀取具有3個變量的pattern.properties文件,1)頭字符串。 2).xml文件列表和3)trail/footnote字符串及其所有的「doing」將這些變量/字符串的值1(字符串)+(第2個變量中提到的所有.xml文件內容的內容)連接起來+3 (字符串)變成最後的Patterns.xml文件。最後,它將複製另一個.xsd文件放在同一個輸出文件夾中,並使用最終的Patterns.xml文件上的模式進行一些模式驗證。

有人可以幫助我在Gradle中將上述「build-xml」ANT目標登錄名編寫爲「buildXML」任務,這樣我就不會編寫2頁腳本。
謝謝。

回答

2

最終的解決方案:(與而不是使用的src/XML /模式,我創建了一個TMP /模板位置做一切小調整)..

//--- 
    // 1. Transform the template patterns 
    copy { 
     into "${buildDir}/tmp/template" 
     from "src" 
     include "xml/**" 
    } 
    ant { 
     xslt(
     basedir: "${buildDir}/tmp/template/xml/patterns", 
     destdir: "${buildDir}/tmp/template/xml/patterns", 
     extension: ".xml", 
     force: "true", 
     style: "${buildDir}/tmp/template/xml/stylesheets/SearchTemplate.xsl", 
     includes: "*.template" 
    ) 
    } 

    // 2. Create the pattern definition file by concatenating all parts 
    def outFile = new File ("${buildDir}/tmp/template", "Patterns.xml") 
    def props = new Properties() 
    new File("${buildDir}/tmp/template/xml/patterns/_patternlist.properties").withInputStream { 
    stream -> props.load(stream) 
    } 
    outFile.text = props["pattern.xml.header"].toString() 
    props["pattern.filelist"].split(',').each { 
     String s1 = "${buildDir}/tmp/template/xml/patterns/" + it 
     String s = new File (s1).text 
     outFile.append(s) 
    } 
    outFile.append(props["pattern.xml.trailer"].toString()) 

    // 3. Copy .xsd file 
    copy { 
     into "${buildDir}/tmp/template" 
     from "src/xml/schema" 
     include "Patterns.xsd" 
    } 

    // 4. Validate schema 
    ant { 
     schemavalidate(file: "${buildDir}/tmp/template/Patterns.xml") { 
      schema(file: "${buildDir}/tmp/template/xml/schema/Patterns.xsd", 
        namespace: "http://www.w3.org/2001/XMLSchema-instance") 
     } 
    } 
1

好的。我到這一點,我現在可以讀取使用以下這些變量的多值:

def props = new Properties() 
new File("pattern.properties").withInputStream { 
    stream -> props.load(stream) 
} 
// accessing the property from Properties object using Groovy's map notation 
println "pattern.xml.header=" + props["pattern.xml.header"] 
println "pattern.filelist=" + props["pattern.filelist"] 
println "pattern.xml.trailer=" + props["pattern.xml.trailer"] 

此輸出爲:

-bash-3。2 $ /production/gradle/gradle-1.6/bin/gradle -b的build.gradle

pattern.xml.header=<?xml version="1.0"?><patternFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Patterns.xsd"> 
pattern.filelist=1.xml,2-a.xml,3-iii.xml,4_dddd.xml,File6.xml 
pattern.xml.trailer=</patternFile> 

PS:的pattern.properties以上輸出文件有不同的內容比我在帖子中提到的上述(我正在玩我的本地機器上的代碼,並不想使用真正的內容)..但代碼將適用於任何pattern.properties文件。

現在,我需要做的就是最後一個文件創建部分,這將非常簡單。即使用foreach循環並寫入每個文件的內容(使用第二個參數)並連接param1 + param2(每個文件內容)+ param3,你去了。

順便說一句,我會發布最後的解決方案,當我有..仍然,如果你知道一個更有效的方式,請告知。