Automatizar las compilaciones

Una de las capacidades del IDE que encontrás más prácticas es la que nos permite realizar una amplia variedad de pasos como parte del proceso de compilación de nuestros productos, ya sea para copiar archivos adicionales en cualquiera de las jerarquías de las carpetas de nuestra aplicación, para ejecutar guiones o bien para definir una serie de ajustes. Además, podremos emplear diferentes versiones de los contenidos en función de que vayamos a ejecutar el producto desde el IDE (en modo de depuración) o bien como aplicación desplegada. Esta es la entrada, traducida al Castellano, publicada originalmente en el área de desarrolladores de Xojo.

La característica de Automatización de la compilación (o Build Automation) se utiliza para ejecutar una serie de tareas específicas cuando se crea la compilción del proyecto. Estas accesiones o tareas se denominan Paso de Compilación (Build Steps). Estos son los tres tipo de pasos disponibles en el momento de escribir esta entrada: Copiar Archivos (Copy Files), Script y Script External (External Script).

Primeros pasos

Para añadir un nuevo Paso de Compilación a tu proyecto, selecciona el menú Insert utilizando la barra de herramientasa del menú principal y selecciona el submenú Build Setup. Por omisión los Pasos de Compilación añadidos al área del Navegador están inactivos.

Para activar un paso de compilación has de moverlo a un destino. Puedes hacerlo arrastrando el Paso de Compilación desde el área de contenidos en el Navegador al área de Ajustes de Compilación del Navegador. Suelta el Paso de Compilación sobre uno de los posibles destinos (macOS, Windows, Linux o iOS) y el Paso de Compilación pasará a estar ativo cuando se ejecute la compilación para dicho destino.

Puedes desactivar un Paso de Compilación simplemente cambiando la propiedad Applies To al valor None.

Una vez que hayas añadido un Paso de Compilación a un destino, este puede desplegarse de modo que puedas ver todos los pasos de compilación asignados. Cuando lo expandas verás el paso de compilación y un elemento denominado simplemente Build. Este elemento te permite indicar si el Paso de Compilación tendrá lugar antes de que se compile el proyecto o bien despés. Arrastra el Paso de Compilación antes del elemento Build para que este se procese antes de que se realice la compilación, o bien arrástralo después del elemento Build para que se procese una vez que se haya realizado la compilación.

Cada Paso de Compilación conlleva asociado un ajuste Applies To en el Panel Inspector que te permite indicar los valores: Both (ambos), Debug (depuración), Release o None (Ninguno):

  • Both: El Paso de Compilación se procesa siempre.
  • Debug: El Paso de Compilación se procesa sólo haciendo un Debug Run.
  • Release: El Paso de Compilación se procesa sólo cuando se crea el ejecutable independiente del IDE.
  • None: No se procesa el paso de compilación (está desactivado).

Copiar Archivos

El paso Copy Files te permite copiar un archivo, archivos o carpeta a la ubicación indicada durante el proceso de compilación. Sólo has de arrastrar los archivos que desees copiar sobre el área vacía (o bien usar el botón Add de la barra de herramientas). Para eliminar un archivo del listado, selecciónalo y pulsa Borrar en el teclado o bien usa el botón de borrar dispuesto en la barra de herramientas. Puedes hacer clic derecho con el ratón sobre un archivo para acceder al menú con las opciones: Abrir Archivo (Open File) y Mostrar en Disco (Show on Disk). Utiliza la opción Abrir Archivo para abrir el archivo en visor por omisión del sistema operativo. La opción Show on Disk muestra el archivo utilizando el visor por defecto del sistema (como por ejemeplo el Finder o bien el Explorador).

Para cada uno de estos archivos también puedes indicar el subdirectorio sobre el que se copiarán, introduciendo para ello un valor en la propiedad Subdirectory del Inspector.

También puedes indicar la ubicación de destino para los archivos utilizando para ello la propiedad Destination del Inspector. Las opciones disponibles son: App Parent, Resources Folder, Frameworks Folder, Bundle Folder Parent y Contents Folder.

  • App Parent Folder: En el caso de Windows y Linux, los archivos indicados se copiarán junto con el ejecutable de la aplicación. En el caso de Mac, los archivos se copiarán junto con el ejecutable en el Bundle de la Aplicación ( Contents > Mac OS).
  • Resources Folder: Los archivos indicados se copiarán en la carpeta Resources. En el caso de Windows y Linux, la carpeta Resources se crea junto con la aplicación propiamente dicha. En el caso de Mac, la carpeta Resources está contenida commo parte del Bundle de la Aplicación (Contents > Resources). En todos los casos, debes considerar los contenidos de esta carpeta como de sólo lectura. Si necesitas escribir sobre estos archivos, cópialos en primer ligar sobre una ubicación con acceso de escritura (por lo general SpecialFolder.ApplicationSupport). Puedes obtener acceso a la carpeta de Recursos utilizando el método SpecialFolder.GetResource.
  • Frameworks Folder: En el caso de Windows y Linux, los archivos se copian a la carpeta Libs de la aplicación. En el caso de Mac, los arhcivos se copian en la carpeta Frameworks del Bundle de la Aplicación (Contents > Frameworks).
  • Bundle Parent Folder: En el caso de Windows y Linux, los archivos se copian sobre la carpeta que contiene el ejecutable (es decir, la misma que App Parent Folder). En el caso de Mac, los archivos se copian sobre la carpeta que contiene al Bundle de la Aplicación propiamente dicho.
  • Contents Folder: En el caso de Windows y Linux, los archivos se copian sobre la carpeta que contiene el ejecutable (es decir, la misma que App Parent Folder). En el caso de Mac, los archivos se copian en el Bundle de la Aplicación (Contents).

En el caso de iOS existe un paso adicional añadido por omisión denominado Sign. Cualquier paso de Copia de Arhivos ha de realizarse antes de que se ejecute el paso Sign(firmar), de modo que los archivo que se copien como parte del producto se firmen correctamente como parte del proceso de envío a la App Store.

Acceder a los Archivos

En la mayoría de los casos utilizarás el destino Resources para copiar archivos a la carpeta Resources de modo que puedan utilizarse desde la app. Para acceder a los archivos de esta carpeta, puedes emplear el método SpecialFolder.GetResource de modo que obtengas una referencia al FolderItem que apunta a dicho archivo. Por ejemplo, para obtener una referencia a una base de datos que se ha copiado en la carpeta Resources, podrías utilizar un fragmento de código similar a este:

Dim bundleFile As Folderitem
bundleFile = Xojo.IO.SpecialFolder.GetResource("AppDatabase.sqlite")

Para acceder a los archivos en otras ubicaciones, tendrás que acceder o definir la ruta tú mismo comenzando por ejemplo con Application.ExecutableFile y utilizando luego los métodos Child o Parent de FolderItem para crear la ruta a partir del nodo inicial.

Guiones y Guiones Externos

Los Guiones suponen una herramienta tremendamente potente para automatizar los procesos de compilación del producto. Los Guiones pueden contener una amplia variedad de comandos para controlar el proceso de compilación. Por ejemplo, puedes decidir añadir un guión en línea como parte del proceso de compilación. Esto añade un elemento que es un Editor de Guiones. Aquí puedes introducir directamente el código para tu guión. También puedes añadir un Guión Externo (External Script), de modo que puedas hacer referencia a un archivo de guión guardado en dico. Esto puede resultar de utilidad si quieres reutilizar el mismo guión en las compilaciones de Windows, Mac y Linux, por ejemplo.

Todos los comandos disponibles que se pueden utilizar en la elaboración de guiones son los dispomnibles en la sección Scripts del IDE del área de desarrolladores de Xojo, si bien algunos de los más empleados son: DoCommand, DoShellCommand y Speak.

El comando DoCommand se utiliza para ejecutar cualquiera de los comandos incorporados en el IDE.

Por ejemplo, para añadir un guión como parte del proceso de compilación que se encargue de guardar el proyecto, añade un Script Build Step utilizando el menú Insert o bien el botón del mismo nombre. Se añadirá el guión al Navegador mostrando el Editor de Guiones. En el editor de Guiones asociado, introduce el siguiente código:

DoCommand("SaveFile")

Ahora puedes arrastrar el guión a un destino bajo la sección Build del Navegador para que se ejecute. Si quieres que el guión se ejecute antes de que se inicie la compilación, arrástralo antes del elemento Build; y si quieres que se ejecute después, entonces arrástralo después del elemento Build.

El comando Speak utiliza la característica de síntesis de texto a voz proporcionada por el sistema operativo. Por ejemplo, puedes utilizarlo para saber cuando ha finalizado una compilación:

Speak("Build Complete.")

El comando DoShellCommand te permite ejecutar un comando del Shell. Puedes ejecutar cualquier comando del shell que esté disponible en el Terminal o bien en la Línea de Comandos del sistema operativo. Por ejemplo, puedes utilizar esta capacidad para manipular los permisos, ejecutar comandos para firmar digitalmente la app o cualquier otra operación que desees.

Este ejemplo ejecuta el comando para firmar el código en un Mac:

Dim command As String
command = "codesign -f --deep -s ""Developer ID Application: TuNombre "" ""TuAppXojo.app """
Dim result As String
result = DoShellCommand(command)

Ten en cuenta que cuando firmas el código de tu app has de tener contar ya con todos los archivos empleados en su ubicación final como parte del paquete o bundle del producto. Si añades nuevos archivos al bundle, o modificas cualquiera de los existentes, entonces quedará invalidada la firma realizada.

Un guión externo funciona del mismo modo excepto que el guión está almacenado como un archivo de texto externo que puedes seleccionar. Deberías de utilizar un Script Externo si tienes un script que compartas con varios proyectos o bien entre múltiples despliegues desde Xojo, como por ejemplo macOS, Windows o Linux.

Deja un comentario

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