代码之家  ›  专栏  ›  技术社区  ›  Nathan Strutz

如何使用Ant将一个文件嵌入到另一个文件中?

  •  3
  • Nathan Strutz  · 技术社区  · 18 年前

    我正在开发一个小型web应用程序项目(ColdFusion),我试图在开发期间将项目拆分为多个文件,但在完成时只部署一个文件。

    我引用了外部文件,例如:

    <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>
    

    3 回复  |  直到 18 年前
        1
  •  3
  •   Peter Boughton    18 年前

    这是你想要的吗?

    <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>
    
        2
  •  2
  •   Mnementh    17 年前

    <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’及‘gt’。

        3
  •  1
  •   Nathan Strutz    18 年前

    <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,但它是我的第一个。此外,它需要几个类路径JAR才能编译。我不知道是哪个,但我相信是javax.scripting引擎、groovy-engine.jar和groovy-all-1.5.6.jar