Inicio > ANT > Ant para desarrolladores flash – Task macrodef (parte 4)

Ant para desarrolladores flash – Task macrodef (parte 4)

viernes, 11 de septiembre de 2009 panaewa Dejar un comentario Ir a comentarios

En la parte 3 de esta serie hemos creado nuestra primera aplicación flash utilizando ant, eclipse y flex sdk. Según vayamos trabajando con ANT el fichero build.xml, se irá haciendo mas grande, para evitar que esto suceda, es conveniente definir macros, cuya funcionalidad es similar a las funciones de cualquier lenguaje de programación. El uso de la macro se realiza igual que los tasks.

En los proyectos que realizamos día a día, suelen existir, además de nuestra aplicación main, algún que otro fichero swf, que también tenemos que compilar, y que despues serán cargados desde nuestro main. Por lo tanto el proceso de creación de estas clases y la compilación, es un task susceptible de ser implementado en una macro

Task macrodef

Este task está compuesto de dos partes, en la primera se encuentra la definición de los parametros que puede recibir el nuevo task. Estos a su vez pueden ser de dos tipos, del tipo attribute que es el que vamos a utilizar en nuestro ejemplo, ya que es el que se utiliza para pasar valores de propiedades, o bien del tipo element, mediante el cual pasamos uno o varios task como parámetro.

En este caso en particular vamos a definir el atributo source y el atributo target, que serán la clase de actionscript que queremos compilar, y el nombre del fichero que se creará.

La segunda parte del task macrodef consiste en el cuerpo de la función, esta se define utilizando el task sequential, y todo lo que metamos dentro de sequential sera lo que se ejecute.

Ejemplo de macrodef compile:

	<target name="compile_macro">
		<echo message="compile_macro"/>
		<compile source="${src}/${package.dir}/${appname}.as"
			target="${bin}/${package.dir}/${appname}"/>
	</target>

    <macrodef name="compile">
    	<attribute name="source" />
    	<attribute name="target" default="debug" />
        <sequential>
    	    <mxmlc file="@{source}"
                output="@{target}.swf">
                <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>

				<compiler.library-path dir="${lib}" append="true">
					<include name="*.swc"/>
				</compiler.library-path>    	    	

                <source-path path-element="${FLEX_HOME}/frameworks"/>
    	    	<source-path path-element="${src}"/>
            </mxmlc>
        </sequential>
    </macrodef>

Como vemos, si queremos hacer referencia a los atributos dentro del macro en lugar de $ utilizamos @, tambien se vemos que nuestras propiedades siguen teniendo visibilidad dentro del macro.

Cuando estamos desarrollando actionscript, es normal depurar la aplicación. Para que esta pueda ser depurada hay que compilarla utilizando el parámetro debug=true como atributo del task mxmlc. Aquí surgen dos opciones, una seria pasar un atributo especificando si queremos que se compile para depurar, y otra creando las dos aplicaciones distintas una optimizada en un directorio y otra compilada para depurar en otro directorio. En el ejemplo siguiente se muestra la primera opción.

	<target name="compile_macro">
		<echo message="compile_macro"/>
		<compile source="${src}/${package.dir}/${appname}.as"
			target="${bin}/${package.dir}/${appname}"
			debug="true" />
	</target>

    <macrodef name="compile">
    	<attribute name="source" />
    	<attribute name="target" default="DEPLOY" />
    	<attribute name="debug" default="false" />
        <sequential>
    	    <mxmlc file="@{source}"
                output="@{target}.swf"
    	    	debug="@{debug}"
    	    	optimize="true"
    	    	>
                <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>

				<compiler.library-path dir="${lib}" append="true">
					<include name="*.swc"/>
				</compiler.library-path>    	    	

                <source-path path-element="${FLEX_HOME}/frameworks"/>
    	    	<source-path path-element="${src}"/>
            </mxmlc>
        </sequential>
    </macrodef>

ejecución de la aplicación

Para ejecutar nuestra aplicación, utilizamos el task exec, que nos permite ejecutar comandos del sistema, en nuestro caso queremos ejecutar el Flash Player y pasarle como parametro la ruta de nuestro fichero swf. Para hacer esto modificamos el target compile-macro (ahora compile-and-launch):

	<target name="compile-and-launch">
		<echo message="compile-and-launch"/>
		<compile source="${src}/${package.dir}/${appname}.as"
			target="${bin}/${package.dir}/${appname}"
			debug="false" />
	    <exec executable="${flashplayer}">
	        <arg line="${bin}/${package.dir}/${appname}.swf" />
	    </exec>
	</target>

vemos que se abre una ventana con nuestra aplicación.

creación de paginas

Vamos a crear ahora las distintas páginas que va a tener nuestra aplicación. Lo primero es definir los nombres que van a tener y asignárselos a una propiedad. Así que en nuestro fichero proyect.propeties añadimos las siguientes líneas.

# Páginas del proyecto
pages.dir = pages
pages = Home, Products, Contact

Hemos definidos tres páginas, cada una de ellas va a generar un fichero swf. También hemos definido la ruta donde se van a crear las clases.

Para crear las distintas clases vamos a utilizar la misma plantilla que utilizamos para crear nuestro main de la aplicación, Main.tpl.

El primer problema que surge es como separar los nombres de las páginas y hacer el bucle sobre ellas. Para solucionar esto vamos a utilizar un librería externa, ANT Contrib, esta librería open source se puede descargar desde Sourceforge. Si quereis echar un vistazo al manual….

Voy a crear una nueva carpeta llamada libs dentro de la ya existente build, y voy a ir dejando en ella las librerías que vaya necesitando. Así que descargo la librería y copio el fichero ant-contrib-1.0b3.jar (viene en el paquete que me he descargado) dentro de la carpeta libs que acabo de crear.

librería ant contrib incluida

librería ant contrib incluida

y la importo al proyecto utilizando el task taskdef.

<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="${build}/libs/ant-contrib-1.0b3.jar"/>

ahora puedo utilizar el task for de esta libreria para recorrer la propiedad pages y crear las distintas clases de actionscript.

	<target name="create-main">
		<echo message="create-main"/>
		<create-main-class dir="${package.dir}" namespace="${namespace}" name="${appname}"/>
		<for list="${pages}" param="page" trim="true" delimiter=",">
		  <sequential>
		  	 <create-main-class dir="${package.dir}/${pages.dir}" namespace="${namespace}.${pages.dir}" name="@{page}"/>
		  </sequential>
		</for>
	</target>

	<macrodef name="create-main-class">
		<attribute name="dir"/>
		<attribute name="namespace"/>
		<attribute name="name"/>
		<sequential>
			<echo message="create-page: @{namespace}.@{name}"/>
			<copy file="${templates}/Main.tpl" tofile="${src}/@{dir}/@{name}.as">
		        <filterchain>
		           <replacetokens>
					    <token key="namespace" value="@{namespace}"/>
					  	<token key="appname"   value="@{name}"/>
					    <token key="width"     value="${width}"/>
					  	<token key="height"    value="${height}"/>
					  	<token key="framerate" value="${framerate}"/>
					  	<token key="bgcolor"   value="${bgcolor}"/>
		           </replacetokens>
		        </filterchain>
			</copy>
		</sequential>
	</macrodef>

He creído conveniente definir una macro para crear clases que después se van a compilar, ya que es una tarea que se repetirá a menudo.

Y para compilar el main y las páginas:

	<target name="compile-and-launch">
		<echo message="compile_macro"/>
		<compile source="${src}/${package.dir}/${appname}.as"
			target="${bin}/${package.dir}/${appname}"
			debug="false" />
		<for list="${pages}" param="page" trim="true" delimiter=",">
		  <sequential>
		  	   <compile source="${src}/${package.dir}/${pages.dir}/@{page}.as"
		  				target="${bin}/${package.dir}/${pages.dir}/@{page}"
		  				debug="false" />
		  </sequential>
		</for>
	    <exec executable="${flashplayer}">
	        <arg line="${bin}/${package.dir}/${appname}.swf" />
	    </exec>
	</target>	

    <macrodef name="compile">
    	<attribute name="source" />
    	<attribute name="target" default="DEPLOY" />
    	<attribute name="debug" default="false" />
        <sequential>
    	    <mxmlc file="@{source}"
                output="@{target}.swf"
    	    	debug="@{debug}"
    	    	optimize="true">
                <load-config filename="${FLEX_HOME}/frameworks/flex-config.xml"/>

				<compiler.library-path dir="${lib}" append="true">
					<include name="*.swc"/>
				</compiler.library-path>    	    	

                <source-path path-element="${FLEX_HOME}/frameworks"/>
    	    	<source-path path-element="${src}"/>
            </mxmlc>
        </sequential>
    </macrodef>

y hasta aquí esta cuarta parte.

Categories: ANT Tags: , , , , ,
  1. Sin comentarios aún.
  1. sábado, 26 de septiembre de 2009 a las 20:29 | #1