¿Cómo puedo incrustar un archivo en otro con Ant?

votos
3

Estoy desarrollando un pequeño proyecto de aplicación web (ColdFusion) y estoy intentando que mi proyecto se divida en varios archivos durante el desarrollo, pero implemente solo un archivo al finalizar.

Tengo referencias a archivos externos, por ejemplo:

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

Y cuando construyo mi proyecto, quiero tener los archivos incluidos e incrustados dentro del único archivo del producto terminado.

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

De todos modos, no parece que haya una forma básica para que Ant haga esto. ¿Nadie sabe?

Publicado el 03/10/2008 a las 16:30
por usuario
En otros idiomas...                            


3 respuestas

votos
3

¿Hace esto lo que quieres?

<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>
Respondida el 03/10/2008 a las 20:56
fuente por usuario

votos
1

Respondiendo a mi propia pregunta después de unas horas de piratería ...

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

y esta secuencia de comandos groovy reemplaza cualquier archivo javascript o css referenciado con el contenido del archivo en sí.

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

Así que supongo que eso lo hace por mí. Ha funcionado bastante bien, y es extensible. Definitivamente no es el mejor Groovy, pero es uno de los primeros. Además, requirió algunos tarros de clase para compilar. Perdí la noción de cuál, pero creo que es el motor javax.scripting, groovy-engine.jar y groovy-all-1.5.6.jar

Respondida el 06/10/2008 a las 16:21
fuente por usuario

votos
2

Para una solución en hormiga pura, intente lo siguiente:

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

Lo probé y funcionó como se esperaba. En el texto para reemplazar y el valor que inserta, todos los caracteres '<', '>' y '"' deben citarse como & lt ;, & gt; y & quot;

Respondida el 05/11/2008 a las 15:54
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more