2008-10-03 75 views
3

我正在開發一個小型web應用程序項目(ColdFusion),並且我試圖在開發過程中將我的項目分割成多個文件,但完成時只部署一個文件。如何使用Ant將一個文件嵌入到另一個文件中?

我不得不引用外部文件,例如:

<script type="text/javascript" src="jquery-1.2.6.pack.js"></script> 
<link type="text/css" rel="stylesheet" href="project.css" /> 

當我建立我的項目,我想有包括嵌入式單成品文件中的文件。

<script type="text/javascript">eval(function(p,a,c,k,e,r) [...]</script> 
<style type="text/css">div{font:normal;} [...]</style> 

無論如何,它看起來並不像Ant這樣做的基本方式。有人知道嗎?

回答

1

回答我的問題黑客攻擊的幾個小時後...

<script language="groovy" src="build.groovy" /> 

這Groovy腳本替換該文件的內容本身的任何引用的JavaScript或CSS文件。

f = new File("${targetDir}/index.cfm") 
fContent = f.text 
fContent = jsReplace(fContent) 
fContent = cssReplace(fContent) 
f.write(fContent) 

// JS Replacement 
def jsReplace(htmlFileText) { 
    println "Groovy: Replacing Javascript includes" 
    // extract all matched javascript src links 
    def jsRegex = /<script [^>]*src=\"([^\"]+)\"><\/script>/ 
    def matcher = (htmlFileText =~ jsRegex) 
    for (i in matcher) { 
     // read external files in 
     def includeText = new File(matcher.group(1)).text 
     // sanitize the string for being regex replace string (dollar signs like jQuery/Prototype will screw it up) 
     includeText = java.util.regex.Matcher.quoteReplacement(includeText) 
     // weak compression (might as well) 
     includeText = includeText.replaceAll(/\/\/.*/, "") // remove single-line comments (like this!) 
     includeText = includeText.replaceAll(/[\n\r\f\s]+/, " ") // replace all whitespace with single space 
     // return content with embedded file 
     htmlFileText = htmlFileText.replaceFirst('<script [^>]*src="'+ matcher.group(1) +'"[^>]*></script>', '<script type="text/javascript">'+ includeText+'</script>'); 
    } 
    return htmlFileText; 
} 

// CSS Replacement 
def cssReplace(htmlFileText) { 
    println "Groovy: Replacing CSS includes" 
    // extract all matched CSS style href links 
    def cssRegex = /<link [^>]*href=\"([^\"]+)\"[^>]*>(<\/link>)?/ 
    def matcher = (htmlFileText =~ cssRegex) 
    for (i in matcher) { 
     // read external files in 
     def includeText = new File(matcher.group(1)).text 
     // compress CSS 
     includeText = includeText.replaceAll(/[\n\r\t\f\s]+/, " ") 
     // sanitize the string for being regex replace string (dollar signs like jQuery/Prototype will screw it up) 
     includeText = java.util.regex.Matcher.quoteReplacement(includeText) 
     // return content with embedded file 
     htmlFileText = htmlFileText.replaceFirst('<link [^>]*href="'+ matcher.group(1) +'"[^>]*>(<\\/link>)?', '<style type=\"text/css\">'+ includeText+'</style>'); 
    } 
    return htmlFileText; 
} 

所以我想這對我來說。它工作得很好,而且是可擴展的。絕對不是最好的Groovy,但這是我的第一個。此外,它需要幾個classpathed的罐子來編譯它。我失去了它的軌道,但我相信這是javax.scripting引擎,Groovy的engine.jar和Groovy的全1.5.6.jar

+0

感謝您的建議,抱歉,但我會選擇我自己的答案,因爲它對未來更具可擴展性。 – 2009-02-19 20:03:38

3

這是做你想做的嗎?

<property 
    name="filename" 
    value="jquery-1.2.6.pack.js" 
/> 

<loadfile 
    property="contents" 
    srcfile="${filename}" 
/> 

<replace dir="."> 
    <include name="index.cfm"/> 
    <replacetoken><![CDATA[<script type="text/javascript" src="${filename}"></script>]]></replacetoken> 
    <replacevalue><![CDATA[<script type="text/javascript">${contents}</script>]]></replacevalue> 
</replace> 
+0

彼得,謝謝你的建議,這我只是得到︰ 我試過它和沒有CDATA塊沒有任何變化它是加載$ {jQueryContent }價值,但不能取代它在文件中 – 2008-10-06 14:53:02

2

對於純螞蟻的解決方案,請嘗試以下操作:

<target name="replace"> 
    <property name="js-filename" value="jquery-1.2.6.pack.js"/> 
    <property name="css-filename" value="project.css"/> 
    <loadfile property="js-file" srcfile="${js-filename}"/> 
    <loadfile property="css-file" srcfile="${css-filename}"/> 
    <replace file="input.txt"> 
     <replacefilter token="&lt;script type=&quot;text/javascript&quot; src=&quot;${js-filename}&quot;&gt;&lt;/script&gt;" value="&lt;script type=&quot;text/javascript&quot;&gt;${js-file}&lt;/script&gt;"/> 
     <replacefilter token="&lt;link type=&quot;text/css&quot; rel=&quot;stylesheet&quot; href=&quot;${css-filename}&quot; /&gt;" value="&lt;style type=&quot;text/css&quot;&gt;${css-file}&lt;/style&gt;"/> 
    </replace> 
</target> 

我測試了它,它按預期工作。在文本更換和值插入,而不是所有的字符「<」,「>」和「「」應該援引& LT ;, & GT;和& QUOT

相關問題