30 ago 2009

Empaquetado con PAR

Durante mucho tiempo, el uso de los diferentes módulos que tenemos a nuestra disposición a través del CPAN nos creaba un pequeños handicap: cuando tenemos que distribuir nuestro programa, es necesario asegurar que todas las dependencias están disponibles para poder ser empleadas. Esto, que a priori debería ser algo sencillo, no ha quedado bien resuelto hasta la aparición del Perl Archiver (PAR). En resumidas cuentas, PAR nos permite agrupar todos los módulos, ficheros de configuración, recursos y otras dependencias en un único fichero comprimido, para facilitar su distribución.
Imagino que a los que trabajen con Java les resultará familiar este concepto, incluso el nombre que se utiliza es similar (JAR, Java Archiver), que se inspira obviamente en el archiconocido TAR.

En este artículo trataré de resumir las opciones más importantes de cara al uso de esta estupenda herramienta, que pasa por ser un tanto desconocida pese a que tiene sus orígenes por el año 2003.

Crear un fichero PAR


(a) El caso sencillo
Un fichero PAR está comprimido en un formato ZIP, por tanto podremos utilizar nuestra herramienta preferida que maneja este tipo de formatos (por ejemplo, el comando "zip" en Linux, o 7-zip en Windows). Imaginemos que deseamos crear el fichero "prueba.par", con un par de módulos de contenido
%> zip prueba.par Modulo1.pm Prueba/Modulo2.pm
Como vemos, podemos (y debemos) incluir las estructuras de directorios que estemos utilizando.

(b) Algo más habitual...
Aunque crear un fichero de esta forma es muy sencillo, en aquellos casos en los cuales tengamos un programa complejo que requiera localizar las dependencias de módulos que tiene, puede llegar a ser tedioso, sobre todo cuando además realizamos cambios en el programa que afectan a esas dependencias. Para estos casos disponemos de una utilidad, el PAR Packager (pp) que se encarga de realizar este tipo de tareas, y que obviamente sólo hay que tener instalado en el equipo de desarrollo, no en los usuarios del fichero PAR que construyamos.
Imagina que partimos del "programa.pl" y que deseamos encontrar todas sus dependencias y empaquetarlas en un fichero PAR; simplemente hacemos:

%> pp -p -o programa.par programa.pl

Con "-o" especificamos el fichero PAR de salida que se genera, y "-p" indicamos que deseamos generar un fichero PAR. En este ejemplo, el fichero "programa.par" contiene por tanto, todas las dependencias que se han encontrado. Este fichero se puede utilizar así:
  1. Para visualizarlo, con nuestra herramienta ZIP favorita
  2. Para utilizar los recursos que contiene desde otro programa, como se mostrará más adelante
  3. Para ejecutarlo directamente, ya que el fichero PAR creado de la forma anterior ha incluido el fichero "programa.pl" dentro del mismo, si tenemos instalado el PAR Packager, podemos probarlo sin más que escribir:

  4. parl programa.par

  5. Si queremos distribuirlo a un equipo en el cual no tenemos PAR PAckager, pero sí PAR, podemos usar la opción "-P" cuando lo creamos
  6. %> pp -P -o programa_empaquetado.pl programa.pl
    %> perl programa_empaquetado.pl
(c) Crear un fichero ejecutable "stand-alone"
Una posibilidad muy interesante que nos proporciona el uso de PAR es la capacidad de crear ejecutables que puedan ser utilizados en plataformas donde ni siquiera se ha instalado Perl. Esto es un concepto bastante interesante cuando queremos asegurarnos de que nuestro programa funciona en cualquier sitio, aunque un pequeño detalle es que sólo funcionará en la misma arquitectura en la que fue construido. La herramienta que utilizamos para esto sigue siendo obviamente, "pp".
Siguiendo con los ejemplos anteriores, podemos hacer esto:

pp -o programa programa.pl       # en Linux
pp -o programa.exe programa.pl # en Windows

Usar un fichero PAR

Una ver que disponemos del fichero PAR con un conjunto de módulos, si lo queremos emplear desde nuestro programa, debemos tener instalado en nuestro sistema el módulo PAR, que lo podemos realizar a través del CPAN, como otro módulo normal.

En nuestro programa debemos hacer entonces (siguiendo con el ejemplo "prueba.par"):
use PAR "ejemplo.par";
use Prueba::Modulo2;
#...
Como vemos, todo lo necesario está en el fichero ".par", y si queremos ubicarlo en una ubicación específica lo podemos hacer sin más que especificarlo a la hora de utilizarlo:

use PAR "/la/ruta/del/fichero/par/ejemplo.par";
use Prueba::Modulo2;
#...

Referencias

Si deseas profundizar, te recomiendo una serie de lecturas:

¿Cuáles son tus experiencias en la distribución de tu código Perl?

No hay comentarios:

Publicar un comentario