Compilación y enlazado con Modules

En este artículo voy a definir muy brevemente los pasos que se deben seguir para compilar correctamente las distintas partes de una aplicación basada en Modules teniendo en cuenta los tipos de enlaces entre las distintas partes (Modules, Shell y RSL).
Lo haré tomando como ejemplo la aplicación que Xavi preparó para su charla en la última reunión MIFO II acerca de Arquitecturas modulares


Creación del proyecto

Descargamos el ejemplo ( enlaces a la descarga del proyecto, slides y presentación en diferido aquí ).
Una vez descargado lo primero que haremos es descomprimir el zip. Nos quedará la carpeta archivo-comprimido. La copiamos donde queramos definir el proyecto y a continuación vamos a Flex Builder File->Import->Existing Projects into Workspace, Next, Select root directory y vamos a buscar la carpeta archivo-comprimido (o como la hayamos llamado). Al seleccionarla nos aparecerán todos los proyectos del ejemplo:

  • AMFGateway
  • commons
  • SampleApplication
  • SOAPGateway

Finalizamos y ya tenemos los proyectos en FlexBuilder.
Del código no tenemos que tocar nada, lo único que vamos a revisar son los parámetros de configuración de cada uno de los proyectos para entender el mecanismo de enlazado entre ellos.

RSL

El proyecto de librería commons, que es lo que utilizaremos a modo de RSL, no debe compilar nada más que las interfaces y clases que tiene definidas, todos los swc que tiene enlazados no son necesarios, solo ocupan espacio y aumentan el peso final de la aplcación.
Para eliminar las dependencias con los swc del framework de Flex seguiremos estos pasos: Seleccionamos el proyecto commons y vamos a Project->properties->Flex library Build path->Library Path, ahí desplegamos todos los nodos correspondentes a los diferentes archivos swc del framework de Flex: playerglobal.swc, utilities.swc, flex.swc, framework.swc, rpc.swc y charts.swc si los tenemos (dejamos igual el nodo locale) y uno a uno le asignamos Link Type: External. De esta forma la RSL no compilará en su swc todas estas clases y reducirá el peso considerablemente.

Shell

Nuestra Shell (aplicación principal) es SampleApplication. En relación a la compilación, la Shell debe tener en cuenta lo siguiente:

  1. Debe cargar la RSL generada en el proyecto de librería commons
  2. Debe generar un informe donde aparezcan todas las clases que utiliza para que después podamos evitar que los módulos también las compilen

cargar la RSL

Para definir que nuestra Shell cargue la RSL commons haremos lo siguiente:
Seleccionamos el proyecto SampleApplication, Project->properties->Flex Build Path->Library Path y ahí debemos tener un nodo commons. Si no lo tenemos Add swc->Browse y vamos a buscar el archivo commons.swc en la carpeta commons/bin del proyecto commons.
Si desplegamos el nodo commons, seleccionamos RSL URL y editamos con el botón Edit, deberemos tener Link Type: RSL seleccionado, Auto extract swf to RSL URL marcado, y en el campo RSL URL tendremos commons.swf.

Generar el link report

Para generar el informe de clases utilizadas (link report), siguiendo en las propiedades de proyecto vamos a Flex Compiler, ahí añadimos el flag -link-report=C:\report.xml en el campo de Additional compiler arguments. He puesto la ruta absoluta porque en la versión actual de Flex Builder (la 2.0.1) hay un bug que no permite pasar como argumento a este flag una ruta relativa (ver las release notes, el punto Incorrect location for link report).
Además de esto también es interesante enlazar nuestra aplicación Shell a todos sus proyectos relacionados para que se compilen a la vez cuando se haga un cambio en cualquiera de ellos. Para hacerlo vamos a Project References y seleccionamos todos los proyectos relacionados: AMFGateway, commons y SOAPGateway.

Modules

Los proyectos de Modules que tenemos en el ejemplo son: AMFGateway y SOAPGateway. En los dos proyectos (o en tantos módulos como tuviéramos) realizaremos los mismos pasos:

  1. Definir cuales son las clases que no necesitamos compilar en el swf del módulo (las que ya tenemos compiladas en nuestra shell)
  2. Enlazar la RSL del proyecto commons
  3. Definir el output folder para que el swf del módulo se compile en el proyecto de la shell

Compilación de módulos

Lo primero que haremos es copiar el archivo de link report que se creó en C:\report.xml al definir el flag de compilación en la Shell y pegarlo en la raíz del módulo. A continuación abrimos las propiedades de proyecto Project->properties->Flex compiler->Additional compiler arguments y en el campo de Additional compiler arguments añadimos el flag -load-externs=report.xml. Esto le dirá al compilador que no se carguen las clases especificadas en dicho archivo reduciendo el peso del módulo en unos 130Kb aprox.

Enlazar la RSL

Ahora falta enlazar la librería compilada del proyecto commons como RSL en el proyecto Shell.
Vamos a Flex Build Path->Library Path y añadimos (si no está ya) el .swc de commons como hemos descrito más arriba. La diferencia es que esta vez el Link Type será External, lo cual significa que el módulo confiará en que la shell ya tiene cargada la RSL y que solo la utilizará en tiempo de diseño para el type checking, code hinting, etc…

Definir output folder para los módulos

Una cosa interesante es configurar las opciones de Output Folder del módulo para que apunten a la carpeta bin del proyecto de la aplicación Shell, así nos despreocupamos de tener que mover manualmente los archivos. Si definimos esta opción es interesante también definir que no se generen los archivos del html wrapper. Esto lo hacemos desde donde estamos pero en el menú Flex Compiler, ahí desmarcamos la opción Generate HTML wraper file.

Estos son todos los pasos a seguir para definir los parámetros de compilación y enlazado de una aplicación basada en Modules. Con ésto y una buena estructura sacaremos el máximo partido a las características del sistema de modularización de Flex.

10 Comentarios

  1. Mitohuffman

    Hola

    Tengo un problema

    A la hora tratar de compilar ya sea solo el modulo o compilar todo usando las directivas link-report y load-externs el compilador me regresa el siguiente error:

    “Could not open ‘c:/path/to/report.xml’ while processing configuration variable ‘load-externs'”

    He visto que la directiva link-report si genera el archivo y que load-externs si encuentra el archivo solo que parece ser o que el archivo esta mal generado o esta ocurriendo un error por falta de permisos en el archivo.

    He visto que toda la documentacion que uno puede encontrar al respecto de modulos y el uso de link-report y load-externs es basicamente la misma. He hecho todos los pasos, la creacion del proyecto principal, la del proyecto que alojara el modulo apuntando a la carpeta bin del proyecto principal, poner las directivas link-report y load-externs en su lugar, desactivar la generacion de HTML wraper, etc.

    Agradeceria si me pudieras dar alguna pista o solucion.
    DTB
    bye

  2. Mitohuffman

    Si de hecho es como lo he intentado y he corroborado que el archivo si se crea. El problema es cuando quiero usar load-externs, he intentado con la ruta absoluta, luego copiando el archivo a la raiz del modulo y me sale exactamente el mismo error.

    Te comentaba que al parecer la directiva load-externs si encuentra el archivo pero por alguna razon no lo puede abrir, esto lo he corroborado especificandole un archivo inexistente y en este caso el error es especifamente debido a que el archivo no lo encontro:
    unable to open ‘archivoInexistente.xml’

    DTB
    saludos

  3. Andres Serral

    Mitohuffman
    En el modulo, no hagas el load-externs desde una ruta absoluta (c:\path\…\report.xml). Copia el archivo al directorio base del modulo y referencialo directamente como -load-externs=report.xml

    Saludos

  4. Nicolas Enriquez

    Hola amigos de made in flex.
    Quiero comentarles un problema que vengo teniedo y que me gustaria resolver si es que son tan amables de ayudarme.

    Eh definido un proyecto AIR con flex 3. El cual esta basado puramente en modulos.
    Mi problema reside en que los modulos no compilan las clases necesarias para su correcta ejecucion.
    Por ejemplo, si uno de los modulos de mi aplicacion usa un Canvas pero la aplicacion “Shell” no, entonces sucede que no esta disponible la clase Canvas en el swf generado por la “shell”. Por lo tanto al cargar el hipotetico modulo tengo un “reference error”.

    Espero puedan ayudarme.

    pd: si necesitan mas datos de configuracion del proyecto no duden en pedirmela

  5. Christian Arias

    Hola Gente,

    Excelente artículo.. funcionó muy bien.. pero mi aplicación está teniendo problemas con el uso del AdvanceDatagrid al ser cargado en tiempo de ejecución en mis módulos que se encuentran como proyectos separados de la Apliacción Shell principal.

    “VerifyError: Error #1014: No se encontró la clase mx.controls::AdvancedDataGrid.”

    Alguien tiene alguna ídea??

  6. Ray Chávez

    Hola, baje el programa e intente seguir las instrucciones pero al momento de añadir el -lik-report no me genera ningun archivo, intente con el cmd del sdk de flex y me manda varios errores uno dice :

    Error: Type was not found or was not a compile-time constant: IGateway.
    private var gateway:IGateway;

    Error: Access of undefined property IGateway.
    gateway=gatewayModule.factory.create() as IGateway

    Y otros erroees mas, a que se peude deber , Gracias por la atención.

  7. Edgar Villegas

    Es un problema Personal sobre Modulos.

    Cargo Multiple modulos externos por medio de URL y al primer Modulo que entro que me trae un String de JAVA con ese se queda referenciado la aplicacion principal y cuando entro al otro Modulo ya no va a JAVA.

    Espero me alla explicado y puedas ayudarme.

    Mi Correo es lega82@gmail
    Soy programador Flex.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acerca de Made In Flex

Made In Flex es una comunidad de desarrolladores de Apache Flex creada en 2006.

Apache Flex, anteriormente conocido como Adobe Flex, es un SDK (kit de desarrollo de software) para crear aplicaciones enriquecidas - multiplataforma basadas en Adobe Flash donado por Adobe a la fundación Apache in 2011 y promocionado a proyecto de primer nivel en Diciembre de 2012.

Actualmente estamos cambiando muchos aspectos del sitio web para ofrecer un sitio útil para toda la comunidad que tenga en cuenta las necesidades actuales.

Últimas Fotos

Instalador de Apache Flex

Entrar o Registrase