Difference between revisions of "Lazarus Packages/es"

From Lazarus wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(35 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Lazarus Packages}}[[Category:Castellano]][[Category:Español]]
+
{{Lazarus Packages}}
 +
[[Category:Castellano]][[Category:Español]]
 +
 
 +
 
  
 
=Descripción del sistema de paquetes Lazarus=
 
=Descripción del sistema de paquetes Lazarus=
 
+
[[File:packagegraph1.png]]
 +
__TOC__
 
==¿Qué es un paquete Lazarus?==
 
==¿Qué es un paquete Lazarus?==
  
   Es una conjunto de unidade y componentes, que contiene información sobre cómo compilarlos y utilizarlos en proyectos, otros paquetes o en el IDE. Al contraio que en DElphi los paquetes no están limitados a librerías y pueden ser independientes de la plataforma. Los [[packages| paquetes Delphi]] son librerías especiales compiladas que utilizan las aplicaciones, el IDE o ámbos. Los paquetes Delphi necesitan de un soporte interno del compilador, FPC no es capaz por ahora de hacerlo y este truco es dependiente del sistema operativo)
+
   Es una conjunto de unidades y componentes, que contiene información sobre cómo compilarlos y utilizarlos en proyectos, otros paquetes o en el IDE. Al contraio que en Delphi los paquetes no están limitados a librerías y pueden ser independientes de la plataforma. Los [[packages| paquetes Delphi]] son librerías especiales compiladas que utilizan las aplicaciones, el IDE o ambos. Los paquetes Delphi necesitan de un soporte interno del compilador, FPC no es capaz por ahora de hacerlo y este truco es dependiente del sistema operativo)
  
   Actualmente el compilador [[Free Pascal]] únicamente soporta paquetes estáticos. Por tanto hay que compilar y relanzar el IDE cada vez que se instala o elimina un paquete.
+
   Actualmente el compilador [[Free Pascal]] únicamente soporta paquetes estáticos. Por tanto hay que compilar y relanzar el IDE cada vez que se instala o elimina un paquete. El IDE automaticamente compila los paquetes si alguno de sus archivos es modificado.
  
 
   Un paquete Lazarus se identifica y distingue por su nombre y su versión.
 
   Un paquete Lazarus se identifica y distingue por su nombre y su versión.
 +
Los paquetes son ideales para compartir código entre proyectos.
 +
 +
==Desde Delphi==
 +
 +
   Si estás familiarizado con los paquetes de Delphi lee el párrafo siguiente, porque hay algunas diferencias importantes entre los paquetes de Delphi y los de Lazarus.
 +
 +
* Los paquetes de Lazarus, no son sólo una librería dinámica. Se utilizan para compartir unidades entre los proyectos y modular grandes proyectos.
 +
* A veces, el archivo de Delphi principal de un paquete se denomina "proyecto de paquete". Este término no tiene sentido en Lazarus.
 +
* Muchos paquetes de Delphi proporcionan un "proyecto de paquete" por cada versión del compilador. Esto no es necesario en Lazarus. Pero puedes hacerlo por compatibilidad con Delphi. Los paquetes de Lazarus  disponen de información de versión y en los proyectos se puede definir que requieren una versión superior o inferior a una específica de cierto paquete. Lazarus cargará automáticamente la versión correcta.
 +
* Si una unidad no puede encontrarse, en Delphi se debe agregar el directorio a la ruta de búsqueda global. Esto tiene muchos inconvenientes al compartir código. Es por eso que no es compatible con Lazarus. Utiliza paquetes en su lugar.
  
 
==Preguntas frecuentes==
 
==Preguntas frecuentes==
Line 23: Line 37:
 
   Para ver el sistema de paquetes en acción y familiarizarse con él, haz lo siguiente:
 
   Para ver el sistema de paquetes en acción y familiarizarse con él, haz lo siguiente:
  
   '''Creando un nuevo paquete:'''
+
===Creando un nuevo paquete===
 
* En el menú principal del IDE, Archivo -> Nuevo... -> Paquete -> [http://wiki.lazarus.freepascal.org/images/2/2d/Lazarus_IDE_Nuevo_Paquete.png Standard Package]
 
* En el menú principal del IDE, Archivo -> Nuevo... -> Paquete -> [http://wiki.lazarus.freepascal.org/images/2/2d/Lazarus_IDE_Nuevo_Paquete.png Standard Package]
 +
* Se abre una ventana titulada "Guardar Paquete Nuevo_paquete 0.0(*.lpk)". Escoge una ruta y un nombre para tu nievo paquete. El nombre debe ser un identificador válido Pascal con extensión ''.lpk''. (Vamos al siguiente paso tanto si se cancela como si se guarda)
 
* Se abre la  [http://wiki.lazarus.freepascal.org/images/a/a2/Lazarus_IDE_Nuevo_Paquete_Edicion.png ventana de edición de paquetes].
 
* Se abre la  [http://wiki.lazarus.freepascal.org/images/a/a2/Lazarus_IDE_Nuevo_Paquete_Edicion.png ventana de edición de paquetes].
 
* Utiliza el botón Guardar.
 
* Utiliza el botón Guardar.
Line 30: Line 45:
 
   ¡Felicidades! has creado tu primer paquete.
 
   ¡Felicidades! has creado tu primer paquete.
  
 
+
===Añadiendo un nuevo componente===
   '''Añadiendo un nuevo componente:'''
 
 
* Utiliza el botón Añadir y selecciona la [http://wiki.lazarus.freepascal.org/images/4/4c/Lazarus_IDE_Nuevo_Paquete_Edicion_Componente.png pestaña Nuevo componente de la ventana].
 
* Utiliza el botón Añadir y selecciona la [http://wiki.lazarus.freepascal.org/images/4/4c/Lazarus_IDE_Nuevo_Paquete_Edicion_Componente.png pestaña Nuevo componente de la ventana].
 
* Selecciona el ancestro del componente de entre la lista. Por ejemplo: ''TBevel''. Las otras opciones se cumplimentan por defecto.Se pueden cambiar.
 
* Selecciona el ancestro del componente de entre la lista. Por ejemplo: ''TBevel''. Las otras opciones se cumplimentan por defecto.Se pueden cambiar.
Line 43: Line 57:
  
 
   ¡Felicidades! has instalado tu primer paquete con tu primer componente.
 
   ¡Felicidades! has instalado tu primer paquete con tu primer componente.
 +
 +
===Añadir un icono para el componente===
 +
Para los iconos del componente pueden usarse recursos Lazarus o recursos FPC.
 +
 +
====Utilizando Recursos Lazarus:====
 +
* El tamaño de la imagen PNG debe ser de 24x24 puntos.
 +
* El nombre del archivo png debe ser el mismo de la clase del nuevo componente (TMiComponente.png o tmicomponente para TMiComponente, por ejemplo).
 +
 +
   Para crear el archivo lrs ejecutar (donde mi_paquete es el nombre de tu paquete y TMiComponente es el nombre de tu componente):
 +
 +
  ~/lazarus/tools/lazres mi_paquete.lrs TMiComponente.png
 +
 +
* Puede que necesites compilar lazres para su primer uso. Simplemente abre  ''lazres.lpi'' en el IDE y en el menú Ejecutar -> Construir.
 +
 +
   Puedes agregar más de una imagen al archivo lrs, añadiendo el nombre del archivo de imagen al final. Por ejemplo ~/lazarus/tools/lazres mi_paquete.lrs TMiComponente.png TMiOtroComponente.png ...
 +
 +
   Si abrimos el archivo ''mi_paquete.lrs'' veremos algo como esto.
 +
 +
<syntaxhighlight lang=pascal> LazarusResources.Add('TMiComponente','PNG',[
 +
#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#2#0#0#0'o'#21#170#175
 +
+#0#0#0#4'gAMA'#0#0#177#143#11#252'a'#5#0#0#0'|IDAT8O'#237#212#209#10#192' '#8
 +
+#5'P'#247#231#251's'#215#138#133#164#166'\'#220#195'`'#209'c'#157'L'#173#131
 +
+#153#169'd4'#168'dP'#137'r_'#235'5'#136'@Zmk'#16'd9'#144#176#232#164'1'#247
 +
+'I'#8#160'IL'#206'C'#179#144#12#199#140'.'#134#244#141'~'#168#247#209'S~;'#29
 +
+'V+'#196#201'^'#10#15#150'?'#255#18#227#206'NZ>42'#181#159#226#144#15'@'#201
 +
+#148#168'e'#224'7f<@4'#130'u_YD'#23#213#131#134'Q]'#158#188#135#0#0#0#0'IEND'
 +
+#174'B`'#130
 +
]);</syntaxhighlight>
 +
 +
* Añade el archivo al paquete. Haz clic de nuevo en el botón Añadir, ve a la pestaña Agregar archivo y busca el archivo mi_paquete.lrs y haz clic en Aceptar. Así lograremos que el IDE controle los cambios en el archivo y lo compile cuando sea necesario.
 +
 +
* Añade una directiva de inclusión  en tu unidad:
 +
 +
<syntaxhighlight lang=pascal> unit TuUnidad;
 +
...
 +
uses
 +
  ..., LResources;
 +
...
 +
implementation
 +
...
 +
initialization
 +
  {$I tuunidad.lrs}
 +
end.</syntaxhighlight>
 +
 +
&nbsp;&nbsp;&nbsp;Nota: Puedes incluir más de un archivo lrs, pero sólo una vez.
 +
 +
* Esto es todo. Compila e instala tu paquete.
 +
 +
====Utilizando Recursos FPC====
 +
 +
&nbsp;&nbsp;&nbsp;Crea una imágen de 24 x 24 puntos y 16 colores para cada componente. Ahora crea un archivo rc como este:
 +
 +
  Nombre_Componente_1 BITMAP "ruta_a_imagen_1//imagen_1.bmp"
 +
  Nombre_Componente_2 BITMAP "ruta_a_imagen_2//imagen_2.bmp"
 +
  ....
 +
  Nombre_Componente_N BITMAP "ruta_a_imagen_N//imagen_N.bmp"
 +
 +
&nbsp;&nbsp;&nbsp;Resaltar que se utilizan dobles barras (// en linux y \\ en windows) en la ruta de las imágenes. Es aconsejable que el nombre del archivo sea el mismo que el nombre del paquete con la extensión .rc, por ejemplo Nombre_Paquete.rc.
 +
 +
&nbsp;&nbsp;&nbsp;Usamos windres (Binutils) para crear el recurso:
 +
 +
  (ruta_a_windres)windres -J rc -O res "Nombre_Paquete.rc" "Nombre_Paquete.dcr"
 +
 +
&nbsp;&nbsp;&nbsp;Añade a la unidad de registro del paquete {$R *.dcr} justo después de la palabra clave implementation, y compila e instala el paquete.
 +
 +
=== Crear un paquete para nuestras unidades comunes ===
 +
 +
&nbsp;&nbsp;&nbsp;Pongamos que tenemos varias unidades, que deseamos utilizar en nuestros proyectos. Colocaremos las unidades en un directorio independiente, por ejemplo, ''C:\MisUnidadesCompartidas''.
 +
 +
* ''Paquete->Paquete Nuevo...'' o ''Archivo->Nuevo... -> Paquete -> Paquete''
 +
* El editor de paquetes se abre
 +
* Usar el botón ''Guardar''. Navegar hasta nuestro directorio (''C:\MisUnidadesCompartidas''), poner el nombre que queremos (''MiPaqueteUnidadesCompartidas.lpk''). El nombre no debe entrar en conflicto con el de una unidad existente.
 +
* Dependiendo de la opción 'nombrado' en las 'opciones de entorno'  el IDE pude avisar para que al guardar se ponga el nombre en minúsculas. Aceptamos.
 +
* Ahora tendremos un paquete de nombre ''MiPaqueteUnidadesCompartidas'' en ''C:\MisUnidadesCompartidas\mipaqueteunidadescompartidas.lpk''.
 +
* Añadir las unidades: ''Añadir->Añadir Archivos->Añadir Directorio''.
 +
* Aparece un diálogo con el directorio ''C:\MisUnidadesCompartidas''  y los filtros incluir y excluir. Clic ''Aceptar'' para añadir todas las unidades.
 +
* Las unidades aparecen en la lista. Clic ''Añadir archivos al paquete''.
 +
* Los archivos han sido añadidos al paquete. Clic ''Guardar''.
 +
* Si nuestras unidades únicamente requieren de las unidades normales de FPC, podemos simplemente dar a ''Compilar''. En otro caso ver lo que sigue.
 +
 +
=== Añadir la LCL como una dependencia ===
 +
 +
&nbsp;&nbsp;&nbsp;Si nuestro paquete contiene formularios u otros objetos de la LCL, entonces requerirá del paquete LCL.
 +
 +
* En el editor de paquetes pulsamos en el botón ''Añadir'' y seleccionamos la pestaña ''Nuevo Requerimiento''
 +
* De la lista desplegable, elegimos el paquete ''LCL''
 +
* Damos al botón ''Aceptar''.
 +
* La LCL ha sido añadida bajo el rótulo Paquetes Requeridos. Damos al botón ''Guardar''.
 +
 +
&nbsp;&nbsp;&nbsp;Podemos ver el efecto de la inclusión paquete LCL, haciendo doble clic en el editor de paquetes sobre ''Opciones del compilador'' en la pestaña  ''Heredado''.
 +
 +
=== Usar nuestro paquete en nuestros proyectos ===
 +
 +
&nbsp;&nbsp;&nbsp;Necesitamos añadir la dependencia de nuestro proyecto respecto del nuevo paquete. Hay varias formas de hacerlo:
 +
 +
*Abrir el paquete. Por ejemplo vía ''Paquete / Abrir paquete reciente...''. En el editor de paquetes pulsar el botón ''Más ...'' y en la lista, seleccionar  ''Agregar al proyecto''.
 +
*También podemos utilizar el ''Inspector de Proyecto'':
 +
** Menú ''Proyecto'' opción ''Inspector de Proyecto''.
 +
** Dar al botón con el icono + para añadir.
 +
** Seleccionar la pestaña ''Nuevo Requirimiento''
 +
** En la lista deplegable ''Nombre del Paquete'' seleccionar nuestro paquete
 +
** ''Aceptar''
  
 
== Los elementos del menú del IDE para paquetes: ==
 
== Los elementos del menú del IDE para paquetes: ==
  
* '''Archivo -> Nuevo... -> Package -> Package -> Standard Package'''
+
* '''Archivo -> Nuevo... -> Paquete -> Paquete'''
 
** Crea un nuevo paquete.
 
** Crea un nuevo paquete.
* '''Proyecto -> Inspector de proyecto'''
+
* '''Proyecto -> Inspector de Proyecto'''
 
** En la ventana se ve la lista de paquetes que utiliza el proyecto abierto.
 
** En la ventana se ve la lista de paquetes que utiliza el proyecto abierto.
 
** Es posible añadir ( -> botón Añadir -> pestaña Nuevo Requerimiento) o eliminar ( botón Eliminar) paquetes.
 
** Es posible añadir ( -> botón Añadir -> pestaña Nuevo Requerimiento) o eliminar ( botón Eliminar) paquetes.
Line 54: Line 170:
 
** Aquí vemos las opciones del compilador que son heredadas desde los paquetes usados.
 
** Aquí vemos las opciones del compilador que son heredadas desde los paquetes usados.
 
* '''Componentes'''
 
* '''Componentes'''
** 'Abrir paquete cargado': Un dálogo muestra todos los paquetes abiertos con su estado e información cada uno sobre ellos.
+
** 'Abrir paquete cargado': Un diálogo muestra todos los paquetes abiertos con su estado e información cada uno sobre ellos.
** 'Abrir archivo de paquete (.lpk)...': Abre un paquete desde un archivo .lpk, para editarlo, compilarlo o instalarlo.
+
** 'Abrir archivo de paquete (.lpk) ...': Abre un paquete desde un archivo .lpk, para editarlo, compilarlo o instalarlo.
 
** 'Abrir paquete de unidad actual': Abre el archivo .lpk, del paquete al que pertenece el archivo activo en el editor.  
 
** 'Abrir paquete de unidad actual': Abre el archivo .lpk, del paquete al que pertenece el archivo activo en el editor.  
** 'Abrir paquete reciente...': Muestra la lista de los archivos .lpk de los paquetes más recientes abiertos o editados.
+
** 'Abrir paquete reciente ...': Muestra la lista de los archivos .lpk de los paquetes más recientes abiertos o editados.
 
** 'Añadir unidad activa a un paquete': Añade el archivo activo en el editor aun paquete.
 
** 'Añadir unidad activa a un paquete': Añade el archivo activo en el editor aun paquete.
** 'Gráfico de paquete...': Un gráfico muestra todos los paquetes abiertos y sus dependencias.
+
** 'Gráfico de paquete ...': Un gráfico muestra todos los paquetes abiertos y sus dependencias.
 
** 'Configurar paquetes instalados': Edita la lista de los paquetes instalados en el IDE. Permite instalar o eliminar varios paquetes a la vez.
 
** 'Configurar paquetes instalados': Edita la lista de los paquetes instalados en el IDE. Permite instalar o eliminar varios paquetes a la vez.
 +
 +
===Eliminar paquetes===
 +
 +
<div class="floatleft">[[Image:Componentes_Instalados.png|Paquetes instalados]]</div>Para eliminar componentes instalados, en el menú ''Paquete'' seleccionar la opción ''Configurar paquetes instalados ...''. La imagen muestra la ventana de gestión de los paquetes instalados.
 +
 +
&nbsp;&nbsp;&nbsp;Marcar los paquetes que queremos desinstalar y damos al botón ''Desinstalar selección''.
 +
 +
&nbsp;&nbsp;&nbsp;Si algo va mal con un paquete (por ejemplo, un directorio de paquete se elimina sin desinstalarlo), Lazarus no permitirá desinstalar los paquetes. Para solucionar el problema, deberemos reconstruir Lazarus (menú ''Herramientas'' / ''Construir Lazarus ...''), y en el proceso eliminar los paquetes problemáticos.
  
 
==La teoría==
 
==La teoría==
Line 80: Line 204:
 
&nbsp;&nbsp;&nbsp;Por ejemplo:
 
&nbsp;&nbsp;&nbsp;Por ejemplo:
  
<delphi> {This file was automatically created by Lazarus. Do not edit!
+
<syntaxhighlight lang=pascal> {This file was automatically created by Lazarus. Do not edit!
 
  This source is only used to compile and install the package GTKOpenGL 1.0.}
 
  This source is only used to compile and install the package GTKOpenGL 1.0.}
 
  unit GTKOpenGL;
 
  unit GTKOpenGL;
Line 92: Line 216:
 
  initialization
 
  initialization
 
   RegisterPackage('GTKOpenGL', @Register)
 
   RegisterPackage('GTKOpenGL', @Register)
  end.</delphi>
+
  end.</syntaxhighlight>
  
* El compilador se lanza y el paquete se compila en el directorio de salida
+
* El compilador se lanza y el paquete se compila en el directorio de salida.
  
* Tras una compilación correcta se crea un archivo de estado en el directorio de salida; su nombre será de la forma ''<nombrepaquete>.compiled'' y contiene información sobre cómo se compiló el paquete. Este fichero de estado es utilizado por el IDE para comprobar si es necesaria una actualización.
+
* El IDE compara las opciones de compilación actuales con las previas, que se almacenan en el archivo .compiled. Si difieren el IDE limpia el directorio de salida y compila el paquete con la opción -B, diciéndole al compilador que compiler todo lo que pueda. Las diferencias en las rutas de búsqueda y opciones de verbosidad no desencadenan una limpieza. Desde 0.9.31 el IDE elimina todos los archivos en el directorio de salida de la unidad al limpiar si el directorio de salida no contiene archivos fuente (que figuran en el editor de paquetes) y no son compartidos con los paquetes necesarios.
 +
 
 +
* Tras una compilación (correcta o no) se crea un archivo de estado en el directorio de salida; su nombre será de la forma ''<nombrepaquete>.compiled'' y contiene información sobre cómo se compiló el paquete y el resultado. Este fichero de estado es utilizado por el IDE para comprobar si es necesaria una actualización y si es necesario que sea completa (-B).
  
 
&nbsp;&nbsp;&nbsp;Por ejemplo: gtkopengl.compiled:
 
&nbsp;&nbsp;&nbsp;Por ejemplo: gtkopengl.compiled:
  
<delphi> <?xml version="1.0"?>
+
<syntaxhighlight lang="xml"> <?xml version="1.0"?>
 
  <CONFIG>
 
  <CONFIG>
 
   <Compiler Value="/usr/bin/ppc386" Date="781388725"/>
 
   <Compiler Value="/usr/bin/ppc386" Date="781388725"/>
Line 107: Line 233:
 
     -Fu../../../lcl/units/gtk -Fu../../../packager/units
 
     -Fu../../../lcl/units/gtk -Fu../../../packager/units
 
     -Fu. -FElib/ gtkopengl.pas"/>
 
     -Fu. -FElib/ gtkopengl.pas"/>
  </CONFIG></delphi>
+
  </CONFIG></syntaxhighlight>
  
 
* El IDE abre automáticamente todos los paquetes necesarios. Es decir, abre todos los paquetes instalados, todos los marcados para instalación (instalación automática), los que tengan un archivo en edición, todos los necesarios por el proyecto y todos los que necesiten otros paquetes. Los paquetes innecesarios son descargados automáticamente.
 
* El IDE abre automáticamente todos los paquetes necesarios. Es decir, abre todos los paquetes instalados, todos los marcados para instalación (instalación automática), los que tengan un archivo en edición, todos los necesarios por el proyecto y todos los que necesiten otros paquetes. Los paquetes innecesarios son descargados automáticamente.
Line 119: Line 245:
  
 
*Para renombrar un paquete utiliza 'Archivo -> Guardar Como...'.
 
*Para renombrar un paquete utiliza 'Archivo -> Guardar Como...'.
 +
 +
* Puedes agregar a cada dependencia el nombre de archivo predeterminado. Por ejemplo al ofrecer un proyecto de ejemplo para tsu paquete. Cuando otro programador abre tu ejemplo por primera vez, el IDE no sabe dónde está el lpk del paquete. Simplemente haz clic derecho sobre la dependencia y en menú contextual selecciona ''Guardar nombre de archivo de dependencia''. El nombre de archivo se almacena relativo a la ruta  del proyecto. Puedes hacer lo mismo con las dependencias del paquete.
  
 
*Configuración de paquete
 
*Configuración de paquete
Line 154: Line 282:
 
&nbsp;&nbsp;&nbsp;Para mostrar el componente en la paleta de componentes, hay que registrarlo en el IDE de Lazarus. Para ello se utiliza el procedimiento de registro.
 
&nbsp;&nbsp;&nbsp;Para mostrar el componente en la paleta de componentes, hay que registrarlo en el IDE de Lazarus. Para ello se utiliza el procedimiento de registro.
  
&nbsp;&nbsp;&nbsp;Este procedimiento que debe aparecer en la sección interfaz de la unidad, y en el mismo se realizarán una o más llamadas a ''RegisterComponent'', así mismo instalará los editores de componentes y propiedades.
+
&nbsp;&nbsp;&nbsp;Este procedimiento que debe aparecer en la sección interfaz de la unidad, y en el mismo se realizarán una o más llamadas a ''RegisterComponents'', así mismo instalará los editores de componentes y propiedades.
  
 
&nbsp;&nbsp;&nbsp;En un paquete puede haber uno o más procedimientos; en el editor de paquetes hay que indicar la unidad que contiene el procedimiento de registro, para que Lazarus sepa cuál debe llamar cuándo se instala el paquete.
 
&nbsp;&nbsp;&nbsp;En un paquete puede haber uno o más procedimientos; en el editor de paquetes hay que indicar la unidad que contiene el procedimiento de registro, para que Lazarus sepa cuál debe llamar cuándo se instala el paquete.
Line 164: Line 292:
  
 
&nbsp;&nbsp;&nbsp;Hay que volver a compilar e instalar el paquete después de cambiar las propiedades.
 
&nbsp;&nbsp;&nbsp;Hay que volver a compilar e instalar el paquete después de cambiar las propiedades.
 +
 +
== Rutas de búsqueda ==
 +
 +
&nbsp;&nbsp;&nbsp;Todas las rutas de búsqueda son relativas al directorio donde reside el archivo ''.lpk''. Si usamos una ruta absoluta, es que no entendemos los paquetes o no nos preocupa.
 +
 +
&nbsp;&nbsp;&nbsp;Cada paquete tiene dos tipos de rutas de búsqueda:
 +
* Rutas en las ''Opciones del compilador'', que son utilizadas para compilar el propio paquete.
 +
* Rutas en  ''Opciones'' (del paquete)'' / Uso'', que son utilizadas por los paquetes y proyectos que requieren este paquete, y por tanto añadidas a sus rutas de búsqueda.
 +
 +
== Paquetes para ejecución y paquetes de diseño ==
 +
 +
* Un paquete puede ser '''para diseño''' (''design time''), '''de ejecución''' (''run time'') o ámbos a la vez.
 +
* Un paquete ''para diseño'' puede ser instalado en el IDE y provee extensiones al mismo, tales como nuevos componentes, nuevos tipos de archivos o proyectos, nuevos elementos de menú, nuevos editores de propiedades o componentes, etc.
 +
* Un paquete ''de ejecución'' será usado por los proyectos.
 +
* Un paquete ''de sólo ejecución'' (''run time only'') no puede instalarse en el IDE, por ejemplo, porque es incompatible con la LCL. El IDE lanza una advertencia si intentamos instalarlo.
 +
* Un paquete ''para diseño únicamente'' (''design time only'') no se puede compilar en los proyectos. Por ejemplo, cuándo únicamente contiene extensiones del IDE. Desde la versión 9.31 el IDE no compila este tipo de paquetes en los priyectos. Cuando un proyecto utiliza un paquete el IDE lanza un aviso antes de abrir un formulario del proyecto, por lo que el usuario sabrá que debe instalarlo previamente.
 +
* Estas restricciones no son fuertes. Por ejemplo, para probar un paquete ''para diseño'' habrá que usarlo en un proyecto de prueba. Desde la versión 0.9.31 se debe señalar la opción Proyecto/Opciones del proyecto.../Miscelánea/Usar de paquetes de tiempo de diseño.
 +
 +
===Escenario típico de los paquetes ''para diseño''  y  ''de ejecución''===
 +
&nbsp;&nbsp;&nbsp;Tenemos una librería de componentes llamados ''MisComponentes'' y queremos escribir editores IDE para algunas propiedades especiales. Por ejemplo, un editor de propiedades para la propiedad ArchivoDatos que muestra un ''TOpenDialog'' para que el usuario seleccione un archivo. Podemos poner los componentes en un paquete ''de ejecución'' llamado ''MisComponentesLaz.lpk'' y crear otro directorio ''diseño'' para el paquete ''para diseño'' ''MisComponentesIDELaz.lpk''. Movemos todas las unidades que contienen los editores IDE y el registro de componenentes al directorio ''diseño''. Añadir una dependencia en ''MisComponentesIDELaz.lpk'' a ''MisComponentesLaz.lpk''. Comprobamos que no compartimos unidades ni rutas de búsqueda. Para ver un ejemplo, ''../componentes/turbopower_ipro/'': El paquete ''de ejecución'' es ''turbopoweripro.lpk'' y el paquete ''para diseño'' es ''design/turbopoweriprodsgn.lpk''.
 +
 +
===Para ''Delphinianos'': No puedo instalar un paquete ''de ejecución'', ¿por qué?===
 +
 +
&nbsp;&nbsp;&nbsp;'''Instalar un paquete''' implica compilar el código en su totalidad en el IDE. Un paquete ''de ejecución'' no contiene código para el IDE e incluso puede lastrarlo. Para utilizar un paquete en un proyecto, estando en el Editor de paquetes, hacer clic derecho para en el menú contextual seleccionar''Agregar al proyecto''. O bien, usar el menú ''Proyecto / Inspector de Proyecto'' y desde ahí, añadir o eliminar paquetes y dependencias.
 +
 +
==Varias versiones de un paquete==
 +
 +
Puede especificar la versión mínima y máxima requerida. Cuando el proyecto se abre y hay varios archivos .lpk el IDE abrirá automáticamente el de la versión correcta.
 +
 +
Si trabajas con distintas versiones de un paquete, puedes abrir en cualquier momento, el archivo de otro paquete. El paquete previo será cerrado y el nuevo se abrirá. Los elementos registrados se transferirán al nuevo paquete.
 +
 +
Si trabajas con varios proyectos que requieren diferentes versiones de un paquete (por ejemplo, con diferentes ramas del mismo paquete), puedes definir el preferido en las dependencias. En el inspector de proyecto, haz clic derecho sobre la dependencia y en el menú contextual selecciona ''Establecer nombre de archivo como preferido para esta dependencia''. Cuando se abra el proyecto, el paquete preferido será abierto. Si ya existe un paquete con el mismo nombre, será reemplazado. Esta característica aparece en la versión 0.9.29.
 +
 +
==Compilar un paquete mediante ''make''==
 +
 +
&nbsp;&nbsp;&nbsp;El IDE puede crear un sencillo '''Makefile''' para un paquete a través de la opción '''Crear Makefile''' del menú '''Más''' de la ventana de edición de paquetes. El IDE crea el archivo '''Makefile.fpc''' y llama a '''fpcmake''', que crea el Makefile. Desde la versión 0.9.29 el IDE también crea el archivo '''Makefile.compiled'''. Si usas un sistema de control de versiones como svn o git, agrega estos tres archivos al repositorio:
 +
 +
  Makefile
 +
  Makefile.fpc
 +
  Makefile.compiled
 +
 +
&nbsp;&nbsp;&nbsp;Ahora puedes ejecutar '''make''' (v.g. abriendo una consola,  yendo (cd) al direcorio del paquete dode está el archivo Makefile) para compilar el paquete.
 +
 +
'''Notas:'''
 +
*Makefile utiliza rutas fijas, por lo que no se adaptará automáticamente a los cambios en el IDE o lazbuild.
 +
*Makefile no contiene la lógica de construcción condicional ni macros, contiene la configuración en el momento de la creación.
 +
*Las macros $(TargetOS), $(TargetCPU) y $(LCLWidgetType) son reemplazadas por %TargetOS%, %TargetCPU% y %LCLPlatform%.
 +
 +
* El archivo Makefile.compiled es copiado por el Makefile después de la compilación con éxito a <PkgOutDir>/<PkgName>compiled y el IDE (y lazbuild) comprueban si un paquete necesita una recompilación. Por ejemplo los binarios de Lazarus se recopilan a través de '''make''' y cuando el IDE se inicia y se compila un programa que no se vuelven compilar los paquetes utilizados, a menos que el usuario establezca algunos parámetros adicionales.
 +
* Si olvidas añadir Makefile.compiled a svn obtendrás el error: /bin/cp: cannot stat `Makefile.compiled': No such file or directory (/bin/cp: no se puede crear 'Makefile.compiled': No existe el fichero o directorio.
 +
 +
== Creación de un paquete de fuentes cerradas ==
 +
 +
&nbsp;&nbsp;&nbsp;Propósito: Queremos publicar un paquete, pero deseamos mantener el código cerrado.
 +
 +
&nbsp;&nbsp;&nbsp;Por el momento muchas de las funciones IDE requieren los fuentes y le avisan si no encuentra los fuentes de una unidad. Por lo tanto, hay que publicar la sección de la interfaz de las unidades, y los archivos que el compilador crea (archivos .ppu y .o). Pasos a seguir:
 +
* Crea una copia del paquete.
 +
* Configura en el editor de paquetes la opción de /Opciones de Paquete/Integración IDE/Actualizar/Reconstruir en '''compilación manual (nunca automáticamente)'''.
 +
* Compila una vez.
 +
* Elimina las secciones de implementación de todas las unidades (es decir, todo lo que hay después de la palabra clave "implementation" de cada unidad, incluyendo la iniciación y finalización dejando únicamente el "end.")
 +
* Opcional: Puedes utilizar la herramienta de publicación de paquetes (Editor de Paquetes/Más .../Publicar Paquete) para crear un zip del paquete.
 +
* No es necesario distribuir los archivos .compiled, .Makefile, .rst ni .lrt.
 +
 +
== Links ==
 +
&nbsp;&nbsp;&nbsp;[[How To Write Lazarus Component|Cómo escribir componentes Lazarus]] - una tutoría sobre cómo crear un nuevo componente.
  
 
==Contribuciones y comentarios==
 
==Contribuciones y comentarios==
  
 
* Esta página ha sido convertida desde la [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusPackagesversión ''epiwiki''].
 
* Esta página ha sido convertida desde la [http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusPackagesversión ''epiwiki''].
* Versión en castellano (español) [[User:Iskraelectrica | iskraelectrica (jldc)]] / julio de 2008.
+
* Versión en castellano (español) [[User:Iskraelectrica | iskraelectrica (jldc)]] / noviembre de 2009.

Latest revision as of 00:24, 19 February 2020

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja) português (pt) русский (ru) slovenčina (sk)


Descripción del sistema de paquetes Lazarus

packagegraph1.png

¿Qué es un paquete Lazarus?

   Es una conjunto de unidades y componentes, que contiene información sobre cómo compilarlos y utilizarlos en proyectos, otros paquetes o en el IDE. Al contraio que en Delphi los paquetes no están limitados a librerías y pueden ser independientes de la plataforma. Los paquetes Delphi son librerías especiales compiladas que utilizan las aplicaciones, el IDE o ambos. Los paquetes Delphi necesitan de un soporte interno del compilador, FPC no es capaz por ahora de hacerlo y este truco es dependiente del sistema operativo)

   Actualmente el compilador Free Pascal únicamente soporta paquetes estáticos. Por tanto hay que compilar y relanzar el IDE cada vez que se instala o elimina un paquete. El IDE automaticamente compila los paquetes si alguno de sus archivos es modificado.

   Un paquete Lazarus se identifica y distingue por su nombre y su versión. Los paquetes son ideales para compartir código entre proyectos.

Desde Delphi

   Si estás familiarizado con los paquetes de Delphi lee el párrafo siguiente, porque hay algunas diferencias importantes entre los paquetes de Delphi y los de Lazarus.

  • Los paquetes de Lazarus, no son sólo una librería dinámica. Se utilizan para compartir unidades entre los proyectos y modular grandes proyectos.
  • A veces, el archivo de Delphi principal de un paquete se denomina "proyecto de paquete". Este término no tiene sentido en Lazarus.
  • Muchos paquetes de Delphi proporcionan un "proyecto de paquete" por cada versión del compilador. Esto no es necesario en Lazarus. Pero puedes hacerlo por compatibilidad con Delphi. Los paquetes de Lazarus disponen de información de versión y en los proyectos se puede definir que requieren una versión superior o inferior a una específica de cierto paquete. Lazarus cargará automáticamente la versión correcta.
  • Si una unidad no puede encontrarse, en Delphi se debe agregar el directorio a la ruta de búsqueda global. Esto tiene muchos inconvenientes al compartir código. Es por eso que no es compatible con Lazarus. Utiliza paquetes en su lugar.

Preguntas frecuentes

   ¿Es necesario instalar un paquete?

Únicamente si el paquete contiene elementos de diseño, cómo componentes para la paleta del IDE. Si no es así, sí sólo utilizas el paquete en el proyecto, no hay que instalarlo.

   He instalado un paquete, pero el IDE no encuentra las unidades

Al instalar un paquete este se integra en el IDE, no en tu proyecto. Son dos cosas distintas. Para utilizar un paquete en tu proyecto añádelo al mismo, con Proyecto -> Inspector del proyecto, y en la ventana, botón Añadir, y Nuevo Requerimiento.

Inicio rápido

   Para ver el sistema de paquetes en acción y familiarizarse con él, haz lo siguiente:

Creando un nuevo paquete

  • En el menú principal del IDE, Archivo -> Nuevo... -> Paquete -> Standard Package
  • Se abre una ventana titulada "Guardar Paquete Nuevo_paquete 0.0(*.lpk)". Escoge una ruta y un nombre para tu nievo paquete. El nombre debe ser un identificador válido Pascal con extensión .lpk. (Vamos al siguiente paso tanto si se cancela como si se guarda)
  • Se abre la ventana de edición de paquetes.
  • Utiliza el botón Guardar.
  • Dependiendo de la configuración de Nombrado en las Opciones de del Entorno, el IDE preguntará si la guarda en minúsculas. Responde sí.

   ¡Felicidades! has creado tu primer paquete.

Añadiendo un nuevo componente

  • Utiliza el botón Añadir y selecciona la pestaña Nuevo componente de la ventana.
  • Selecciona el ancestro del componente de entre la lista. Por ejemplo: TBevel. Las otras opciones se cumplimentan por defecto.Se pueden cambiar.
  • Pulsa el botón aceptar.
  • El archivo creado será añadido al paquete y aparecerá abierto en el editor.
  • Instala el paquete usando el botón Instalar.
  • Lazarus guardará el paquete y preguntará si reconstruye el IDE. Responde sí.
  • El paquete será enlazado de forma estática y será necesario relanzar el IDE de Lazarus.
  • Una vez de nuevo en Lazarus veremos nuestro nuevo componente del paquete en la pestaña que elegimos al crearlo (Por ejemplo: TBevel1 en la pestaña Additional).
  • Si no se ve el nuevo componente en la paleta será seguramente porque no se está ejecutando la nueva versión compilada del IDE de Lazarus. Puedes ver donde se ha construido en: Entorno -> Opciones del Entorno ... Archivos -> Directorio de Lazarus (...). En vez de ejecutar directamente Lazarus puedes usar startlazarus, que arranca el recién creado Lazarus, en el directorio ~/.lazarus, si no tienes permiso de escritura en el directorio donde Lazarus está instalado.

   ¡Felicidades! has instalado tu primer paquete con tu primer componente.

Añadir un icono para el componente

Para los iconos del componente pueden usarse recursos Lazarus o recursos FPC.

Utilizando Recursos Lazarus:

  • El tamaño de la imagen PNG debe ser de 24x24 puntos.
  • El nombre del archivo png debe ser el mismo de la clase del nuevo componente (TMiComponente.png o tmicomponente para TMiComponente, por ejemplo).

   Para crear el archivo lrs ejecutar (donde mi_paquete es el nombre de tu paquete y TMiComponente es el nombre de tu componente):

 ~/lazarus/tools/lazres mi_paquete.lrs TMiComponente.png
  • Puede que necesites compilar lazres para su primer uso. Simplemente abre lazres.lpi en el IDE y en el menú Ejecutar -> Construir.

   Puedes agregar más de una imagen al archivo lrs, añadiendo el nombre del archivo de imagen al final. Por ejemplo ~/lazarus/tools/lazres mi_paquete.lrs TMiComponente.png TMiOtroComponente.png ...

   Si abrimos el archivo mi_paquete.lrs veremos algo como esto.

 LazarusResources.Add('TMiComponente','PNG',[
 #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#2#0#0#0'o'#21#170#175
 +#0#0#0#4'gAMA'#0#0#177#143#11#252'a'#5#0#0#0'|IDAT8O'#237#212#209#10#192' '#8
 +#5'P'#247#231#251's'#215#138#133#164#166'\'#220#195'`'#209'c'#157'L'#173#131
 +#153#169'd4'#168'dP'#137'r_'#235'5'#136'@Zmk'#16'd9'#144#176#232#164'1'#247
 +'I'#8#160'IL'#206'C'#179#144#12#199#140'.'#134#244#141'~'#168#247#209'S~;'#29
 +'V+'#196#201'^'#10#15#150'?'#255#18#227#206'NZ>42'#181#159#226#144#15'@'#201
 +#148#168'e'#224'7f<@4'#130'u_YD'#23#213#131#134'Q]'#158#188#135#0#0#0#0'IEND'
 +#174'B`'#130
 ]);
  • Añade el archivo al paquete. Haz clic de nuevo en el botón Añadir, ve a la pestaña Agregar archivo y busca el archivo mi_paquete.lrs y haz clic en Aceptar. Así lograremos que el IDE controle los cambios en el archivo y lo compile cuando sea necesario.
  • Añade una directiva de inclusión en tu unidad:
 unit TuUnidad;
 ...
 uses 
  ..., LResources;
 ...
 implementation
 ...
 initialization
  {$I tuunidad.lrs}
 end.

   Nota: Puedes incluir más de un archivo lrs, pero sólo una vez.

  • Esto es todo. Compila e instala tu paquete.

Utilizando Recursos FPC

   Crea una imágen de 24 x 24 puntos y 16 colores para cada componente. Ahora crea un archivo rc como este:

 Nombre_Componente_1 BITMAP "ruta_a_imagen_1//imagen_1.bmp"
 Nombre_Componente_2 BITMAP "ruta_a_imagen_2//imagen_2.bmp"
 ....
 Nombre_Componente_N BITMAP "ruta_a_imagen_N//imagen_N.bmp"

   Resaltar que se utilizan dobles barras (// en linux y \\ en windows) en la ruta de las imágenes. Es aconsejable que el nombre del archivo sea el mismo que el nombre del paquete con la extensión .rc, por ejemplo Nombre_Paquete.rc.

   Usamos windres (Binutils) para crear el recurso:

 (ruta_a_windres)windres -J rc -O res "Nombre_Paquete.rc" "Nombre_Paquete.dcr"

   Añade a la unidad de registro del paquete {$R *.dcr} justo después de la palabra clave implementation, y compila e instala el paquete.

Crear un paquete para nuestras unidades comunes

   Pongamos que tenemos varias unidades, que deseamos utilizar en nuestros proyectos. Colocaremos las unidades en un directorio independiente, por ejemplo, C:\MisUnidadesCompartidas.

  • Paquete->Paquete Nuevo... o Archivo->Nuevo... -> Paquete -> Paquete
  • El editor de paquetes se abre
  • Usar el botón Guardar. Navegar hasta nuestro directorio (C:\MisUnidadesCompartidas), poner el nombre que queremos (MiPaqueteUnidadesCompartidas.lpk). El nombre no debe entrar en conflicto con el de una unidad existente.
  • Dependiendo de la opción 'nombrado' en las 'opciones de entorno' el IDE pude avisar para que al guardar se ponga el nombre en minúsculas. Aceptamos.
  • Ahora tendremos un paquete de nombre MiPaqueteUnidadesCompartidas en C:\MisUnidadesCompartidas\mipaqueteunidadescompartidas.lpk.
  • Añadir las unidades: Añadir->Añadir Archivos->Añadir Directorio.
  • Aparece un diálogo con el directorio C:\MisUnidadesCompartidas y los filtros incluir y excluir. Clic Aceptar para añadir todas las unidades.
  • Las unidades aparecen en la lista. Clic Añadir archivos al paquete.
  • Los archivos han sido añadidos al paquete. Clic Guardar.
  • Si nuestras unidades únicamente requieren de las unidades normales de FPC, podemos simplemente dar a Compilar. En otro caso ver lo que sigue.

Añadir la LCL como una dependencia

   Si nuestro paquete contiene formularios u otros objetos de la LCL, entonces requerirá del paquete LCL.

  • En el editor de paquetes pulsamos en el botón Añadir y seleccionamos la pestaña Nuevo Requerimiento
  • De la lista desplegable, elegimos el paquete LCL
  • Damos al botón Aceptar.
  • La LCL ha sido añadida bajo el rótulo Paquetes Requeridos. Damos al botón Guardar.

   Podemos ver el efecto de la inclusión paquete LCL, haciendo doble clic en el editor de paquetes sobre Opciones del compilador en la pestaña Heredado.

Usar nuestro paquete en nuestros proyectos

   Necesitamos añadir la dependencia de nuestro proyecto respecto del nuevo paquete. Hay varias formas de hacerlo:

  • Abrir el paquete. Por ejemplo vía Paquete / Abrir paquete reciente.... En el editor de paquetes pulsar el botón Más ... y en la lista, seleccionar Agregar al proyecto.
  • También podemos utilizar el Inspector de Proyecto:
    • Menú Proyecto opción Inspector de Proyecto.
    • Dar al botón con el icono + para añadir.
    • Seleccionar la pestaña Nuevo Requirimiento
    • En la lista deplegable Nombre del Paquete seleccionar nuestro paquete
    • Aceptar

Los elementos del menú del IDE para paquetes:

  • Archivo -> Nuevo... -> Paquete -> Paquete
    • Crea un nuevo paquete.
  • Proyecto -> Inspector de Proyecto
    • En la ventana se ve la lista de paquetes que utiliza el proyecto abierto.
    • Es posible añadir ( -> botón Añadir -> pestaña Nuevo Requerimiento) o eliminar ( botón Eliminar) paquetes.
  • Proyecto -> Opciones del Compilador... -> Heredado
    • Aquí vemos las opciones del compilador que son heredadas desde los paquetes usados.
  • Componentes
    • 'Abrir paquete cargado': Un diálogo muestra todos los paquetes abiertos con su estado e información cada uno sobre ellos.
    • 'Abrir archivo de paquete (.lpk) ...': Abre un paquete desde un archivo .lpk, para editarlo, compilarlo o instalarlo.
    • 'Abrir paquete de unidad actual': Abre el archivo .lpk, del paquete al que pertenece el archivo activo en el editor.
    • 'Abrir paquete reciente ...': Muestra la lista de los archivos .lpk de los paquetes más recientes abiertos o editados.
    • 'Añadir unidad activa a un paquete': Añade el archivo activo en el editor aun paquete.
    • 'Gráfico de paquete ...': Un gráfico muestra todos los paquetes abiertos y sus dependencias.
    • 'Configurar paquetes instalados': Edita la lista de los paquetes instalados en el IDE. Permite instalar o eliminar varios paquetes a la vez.

Eliminar paquetes

Paquetes instalados

Para eliminar componentes instalados, en el menú Paquete seleccionar la opción Configurar paquetes instalados .... La imagen muestra la ventana de gestión de los paquetes instalados.

   Marcar los paquetes que queremos desinstalar y damos al botón Desinstalar selección.

   Si algo va mal con un paquete (por ejemplo, un directorio de paquete se elimina sin desinstalarlo), Lazarus no permitirá desinstalar los paquetes. Para solucionar el problema, deberemos reconstruir Lazarus (menú Herramientas / Construir Lazarus ...), y en el proceso eliminar los paquetes problemáticos.

La teoría

   Todo paquete Lazarus tiene un archivo .lpk. Un paquete se identifica por su nombre y su versión. El nombre se corresponde con el nombre del archivo lpk. Por ejemplo:

   Nombre: Paquete1, Versión: 1.0, Nombre de archivo: /home/.../Paquete1.lpk.

  • El IDE crea automáticamente el archivo principal Paquete1.pas, ver más adelante. El archivo lpk contiene información sobre los paquetes necesarios, los archivos necesarios para compilarlo y que es necesario para usar el paquete con otros paquetes o proyectos. El directorio en el que reside el lpk se denomina directorio del paquete.
  • El IDE mantiene una lista de todos los archivos de paquete (<config directory>/packagelinks.xml). Cada vez que un paquete es abierto por el IDE se añade a la lista. Cada vez que se abre un paquete, el IDE automáticamente abre todos los paquetes necesarios usando la lista.
  • Hay tres paquetes básicos: FCL,LCL y SynEdit. Son parte del IDE y son creados automáticamente, son de sólo lectura y no tienen un archivo lpk.
  • Normalmente un paquete tiene un directorio con las unidades con el código fuente pascal. También dispone de un directorio de destino, que por defecto es 'lib/$(TargetCPU)-$(TargetOS)/' dentro del directorio del paquete.
  • Antes de compilar un paquete el IDE verifica todos los paquetes necesarios y si si estos necesitan actualización y la señal de hacerlo está marcada, se compilan antes. Después el IDE crea el archivo principal del paquete. Si el lpk es 'paquete1.lpk' es archivo principal será 'paquete1.pas'. Este archivo contendrá todas la unidades necesarias en la cláusula uses y además el procedimiento de registro que se llamará en la sección initialization.

   Por ejemplo:

 {This file was automatically created by Lazarus. Do not edit!
 This source is only used to compile and install the package GTKOpenGL 1.0.}
 unit GTKOpenGL;
 interface
 uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;
 implementation
 procedure Register;
 begin
   RegisterUnit('GTKGLArea', @GTKGLArea.Register);
 end;</elphi>
 initialization
   RegisterPackage('GTKOpenGL', @Register)
 end.
  • El compilador se lanza y el paquete se compila en el directorio de salida.
  • El IDE compara las opciones de compilación actuales con las previas, que se almacenan en el archivo .compiled. Si difieren el IDE limpia el directorio de salida y compila el paquete con la opción -B, diciéndole al compilador que compiler todo lo que pueda. Las diferencias en las rutas de búsqueda y opciones de verbosidad no desencadenan una limpieza. Desde 0.9.31 el IDE elimina todos los archivos en el directorio de salida de la unidad al limpiar si el directorio de salida no contiene archivos fuente (que figuran en el editor de paquetes) y no son compartidos con los paquetes necesarios.
  • Tras una compilación (correcta o no) se crea un archivo de estado en el directorio de salida; su nombre será de la forma <nombrepaquete>.compiled y contiene información sobre cómo se compiló el paquete y el resultado. Este fichero de estado es utilizado por el IDE para comprobar si es necesaria una actualización y si es necesario que sea completa (-B).

   Por ejemplo: gtkopengl.compiled:

 <?xml version="1.0"?>
 <CONFIG>
   <Compiler Value="/usr/bin/ppc386" Date="781388725"/>
   <Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1
     -Tlinux -gl -vewnhi -l -Fu../../../lcl/units
     -Fu../../../lcl/units/gtk -Fu../../../packager/units
     -Fu. -FElib/ gtkopengl.pas"/>
 </CONFIG>
  • El IDE abre automáticamente todos los paquetes necesarios. Es decir, abre todos los paquetes instalados, todos los marcados para instalación (instalación automática), los que tengan un archivo en edición, todos los necesarios por el proyecto y todos los que necesiten otros paquetes. Los paquetes innecesarios son descargados automáticamente.
  • El IDE núnca abre dos paquetes que se llaman igual al mismo tiempo. Cuándo el usuario abre un paquete con el mismo nombre que uno abierto el IDE solicita sustituir el anterior.
  • El IDE mantiene dos conjuntos adicionales de paquetes: Los paquetes instalados y los paquetes de instalación automática, que serán enlazados al IDE en la siguiente compilación. SE crean dos nuevos archivos en el directorio de configuración staticpackages.inc y idemake.cfg. Ahora se lanzará make ide OPT=@/path/to/your/config/idemake.cfg para compilar el nuevo IDE.

Consejos y sugerencias

   Por favor, añada cualquier consejo, sugerencia o error aquí.

  • Para renombrar un paquete utiliza 'Archivo -> Guardar Como...'.
  • Puedes agregar a cada dependencia el nombre de archivo predeterminado. Por ejemplo al ofrecer un proyecto de ejemplo para tsu paquete. Cuando otro programador abre tu ejemplo por primera vez, el IDE no sabe dónde está el lpk del paquete. Simplemente haz clic derecho sobre la dependencia y en menú contextual selecciona Guardar nombre de archivo de dependencia. El nombre de archivo se almacena relativo a la ruta del proyecto. Puedes hacer lo mismo con las dependencias del paquete.
  • Configuración de paquete

   Utilizamos tiOPF como ejemplo. El paquete tiOPF tiene esta estructura de directorios, debido al hecho de que se compila para FPC, Delphi 5-7, D2005 y D200.

 Source                <= ruta completa \Programming\3rdParty\tiOPF\Source
  \Compilers
     \Delphi7          <= el paquete para Delphi 7 está aquí
     \D2005
     \FPC              <= el archivo tiOPF.lpk está aquí
  \Core                <= archivos de la unidades del núcleo
  \Options             <= archivos de unidades opcionales para características adicionales
  \GUI

   Usando este ejemplo, se añade en la ventana de edición del paquete en "botón Opciones - pestaña Uso - Unidad" las siguientes rutas:

 "$(PkgOutDir);..\..\Core;..\..\Options;..\..\GUI" 

   que se añadirán a cualquier proyecto que utilice el paquete.

Añadir componentes existentes a un paquete

   Si se quiere añadir un archivo que contiene un componente a un paquete existente, hay que hacer los siguiente:

  • Abrimos el archivo del paquete.
  • En la ventana de edición pulsamos el botón 'Añadir' para añadir un nuevo elemento al paquete.
  • Seleccionamos la pestaña Añadir Unidad del diálogo Añadir a paquete.
  • Seleccionamos el archivo que queremos añadir.
  • Marca Tiene procedimiento de registro si la unida contiene un procedimiento de registro del componente. Sin esto el componente no se mostrará en la paleta de componentes.
  • Pulsa el botón Añadir Unidad.
  • Vuelve a compilar e instalar el paquete.

   Y ya está, el componente aparecerá en la paleta de componentes.

El procedimiento de registro (procedure Register;)

   Para mostrar el componente en la paleta de componentes, hay que registrarlo en el IDE de Lazarus. Para ello se utiliza el procedimiento de registro.

   Este procedimiento que debe aparecer en la sección interfaz de la unidad, y en el mismo se realizarán una o más llamadas a RegisterComponents, así mismo instalará los editores de componentes y propiedades.

   En un paquete puede haber uno o más procedimientos; en el editor de paquetes hay que indicar la unidad que contiene el procedimiento de registro, para que Lazarus sepa cuál debe llamar cuándo se instala el paquete.

    Hay dos formas de marcar la unidad que contiene el procedimiento de registro:

   Hay que volver a compilar e instalar el paquete después de cambiar las propiedades.

Rutas de búsqueda

   Todas las rutas de búsqueda son relativas al directorio donde reside el archivo .lpk. Si usamos una ruta absoluta, es que no entendemos los paquetes o no nos preocupa.

   Cada paquete tiene dos tipos de rutas de búsqueda:

  • Rutas en las Opciones del compilador, que son utilizadas para compilar el propio paquete.
  • Rutas en Opciones (del paquete) / Uso, que son utilizadas por los paquetes y proyectos que requieren este paquete, y por tanto añadidas a sus rutas de búsqueda.

Paquetes para ejecución y paquetes de diseño

  • Un paquete puede ser para diseño (design time), de ejecución (run time) o ámbos a la vez.
  • Un paquete para diseño puede ser instalado en el IDE y provee extensiones al mismo, tales como nuevos componentes, nuevos tipos de archivos o proyectos, nuevos elementos de menú, nuevos editores de propiedades o componentes, etc.
  • Un paquete de ejecución será usado por los proyectos.
  • Un paquete de sólo ejecución (run time only) no puede instalarse en el IDE, por ejemplo, porque es incompatible con la LCL. El IDE lanza una advertencia si intentamos instalarlo.
  • Un paquete para diseño únicamente (design time only) no se puede compilar en los proyectos. Por ejemplo, cuándo únicamente contiene extensiones del IDE. Desde la versión 9.31 el IDE no compila este tipo de paquetes en los priyectos. Cuando un proyecto utiliza un paquete el IDE lanza un aviso antes de abrir un formulario del proyecto, por lo que el usuario sabrá que debe instalarlo previamente.
  • Estas restricciones no son fuertes. Por ejemplo, para probar un paquete para diseño habrá que usarlo en un proyecto de prueba. Desde la versión 0.9.31 se debe señalar la opción Proyecto/Opciones del proyecto.../Miscelánea/Usar de paquetes de tiempo de diseño.

Escenario típico de los paquetes para diseño y de ejecución

   Tenemos una librería de componentes llamados MisComponentes y queremos escribir editores IDE para algunas propiedades especiales. Por ejemplo, un editor de propiedades para la propiedad ArchivoDatos que muestra un TOpenDialog para que el usuario seleccione un archivo. Podemos poner los componentes en un paquete de ejecución llamado MisComponentesLaz.lpk y crear otro directorio diseño para el paquete para diseño MisComponentesIDELaz.lpk. Movemos todas las unidades que contienen los editores IDE y el registro de componenentes al directorio diseño. Añadir una dependencia en MisComponentesIDELaz.lpk a MisComponentesLaz.lpk. Comprobamos que no compartimos unidades ni rutas de búsqueda. Para ver un ejemplo, ../componentes/turbopower_ipro/: El paquete de ejecución es turbopoweripro.lpk y el paquete para diseño es design/turbopoweriprodsgn.lpk.

Para Delphinianos: No puedo instalar un paquete de ejecución, ¿por qué?

   Instalar un paquete implica compilar el código en su totalidad en el IDE. Un paquete de ejecución no contiene código para el IDE e incluso puede lastrarlo. Para utilizar un paquete en un proyecto, estando en el Editor de paquetes, hacer clic derecho para en el menú contextual seleccionarAgregar al proyecto. O bien, usar el menú Proyecto / Inspector de Proyecto y desde ahí, añadir o eliminar paquetes y dependencias.

Varias versiones de un paquete

Puede especificar la versión mínima y máxima requerida. Cuando el proyecto se abre y hay varios archivos .lpk el IDE abrirá automáticamente el de la versión correcta.

Si trabajas con distintas versiones de un paquete, puedes abrir en cualquier momento, el archivo de otro paquete. El paquete previo será cerrado y el nuevo se abrirá. Los elementos registrados se transferirán al nuevo paquete.

Si trabajas con varios proyectos que requieren diferentes versiones de un paquete (por ejemplo, con diferentes ramas del mismo paquete), puedes definir el preferido en las dependencias. En el inspector de proyecto, haz clic derecho sobre la dependencia y en el menú contextual selecciona Establecer nombre de archivo como preferido para esta dependencia. Cuando se abra el proyecto, el paquete preferido será abierto. Si ya existe un paquete con el mismo nombre, será reemplazado. Esta característica aparece en la versión 0.9.29.

Compilar un paquete mediante make

   El IDE puede crear un sencillo Makefile para un paquete a través de la opción Crear Makefile del menú Más de la ventana de edición de paquetes. El IDE crea el archivo Makefile.fpc y llama a fpcmake, que crea el Makefile. Desde la versión 0.9.29 el IDE también crea el archivo Makefile.compiled. Si usas un sistema de control de versiones como svn o git, agrega estos tres archivos al repositorio:

 Makefile
 Makefile.fpc
 Makefile.compiled

   Ahora puedes ejecutar make (v.g. abriendo una consola, yendo (cd) al direcorio del paquete dode está el archivo Makefile) para compilar el paquete.

Notas:

  • Makefile utiliza rutas fijas, por lo que no se adaptará automáticamente a los cambios en el IDE o lazbuild.
  • Makefile no contiene la lógica de construcción condicional ni macros, contiene la configuración en el momento de la creación.
  • Las macros $(TargetOS), $(TargetCPU) y $(LCLWidgetType) son reemplazadas por %TargetOS%, %TargetCPU% y %LCLPlatform%.
  • El archivo Makefile.compiled es copiado por el Makefile después de la compilación con éxito a <PkgOutDir>/<PkgName>compiled y el IDE (y lazbuild) comprueban si un paquete necesita una recompilación. Por ejemplo los binarios de Lazarus se recopilan a través de make y cuando el IDE se inicia y se compila un programa que no se vuelven compilar los paquetes utilizados, a menos que el usuario establezca algunos parámetros adicionales.
  • Si olvidas añadir Makefile.compiled a svn obtendrás el error: /bin/cp: cannot stat `Makefile.compiled': No such file or directory (/bin/cp: no se puede crear 'Makefile.compiled': No existe el fichero o directorio.

Creación de un paquete de fuentes cerradas

   Propósito: Queremos publicar un paquete, pero deseamos mantener el código cerrado.

   Por el momento muchas de las funciones IDE requieren los fuentes y le avisan si no encuentra los fuentes de una unidad. Por lo tanto, hay que publicar la sección de la interfaz de las unidades, y los archivos que el compilador crea (archivos .ppu y .o). Pasos a seguir:

  • Crea una copia del paquete.
  • Configura en el editor de paquetes la opción de /Opciones de Paquete/Integración IDE/Actualizar/Reconstruir en compilación manual (nunca automáticamente).
  • Compila una vez.
  • Elimina las secciones de implementación de todas las unidades (es decir, todo lo que hay después de la palabra clave "implementation" de cada unidad, incluyendo la iniciación y finalización dejando únicamente el "end.")
  • Opcional: Puedes utilizar la herramienta de publicación de paquetes (Editor de Paquetes/Más .../Publicar Paquete) para crear un zip del paquete.
  • No es necesario distribuir los archivos .compiled, .Makefile, .rst ni .lrt.

Links

   Cómo escribir componentes Lazarus - una tutoría sobre cómo crear un nuevo componente.

Contribuciones y comentarios