Existen numerosas distribuciones de Linux, y empaquetar aplicaciones para diferentes distribuciones de Linux es una tarea difícil y que requiere mucho tiempo. Empaquetar aplicaciones no es tan fácil para todos. Afortunadamente, existe una forma alternativa y más fácil de crear paquetes. Conoce a Fpm (Ef fing p paquete m administración), un programa de línea de comandos que ayuda a crear fácilmente paquetes de Linux.
Usando Fpm, puede convertir fácilmente un paquete a un formato diferente e instalarlo usando el administrador de paquetes predeterminado de la distribución.
Y sí, los Snaps y flatpaks de Ubuntu están creciendo rápidamente y se pueden instalar en la mayoría de las distribuciones de Linux. Pero, en caso de que desee empaquetar una aplicación que aún no está disponible para su distribución, Fpm es una forma de hacerlo.
Y es mucho más fácil que los métodos de envasado tradicionales. Fpm es una herramienta de código abierto completamente gratuita escrita con Ruby lenguaje de programación.
En esta guía, discutiremos cómo construir un paquete usando Fpm en Linux.
Instalar Fpm en Linux
Dado que fpm está escrito con Ruby, primero debe instalar Ruby. Ruby viene preinstalado con algunos sistemas operativos. Si aún no está instalado, ejecute los siguientes comandos según la distribución que utilice.
En Arch Linux y sus variantes:
$ sudo pacman -S ruby
En sistemas Red Hat (Fedora 22 o anterior, CentOS, etc.):
$ sudo yum install ruby-devel gcc make rpm-build
En Fedora 23 o posterior:
$ sudo dnf install ruby-devel gcc make rpm-build
En sistemas derivados de Debian (Debian, Ubuntu, etc.):
$ sudo apt-get install ruby ruby-dev rubygems gcc make rpm
También puede instalar Ruby usando Linuxbrew gerente de empaquetación. Para instalar Linuxbrew en Linux, consulte la siguiente guía.
- Linuxbrew:un administrador de paquetes común para Linux y Mac OS X
Después de instalar Linuxbrew, ejecute este comando para instalar Ruby.
$ brew install ruby
Una vez que haya instalado Ruby, ejecute el siguiente comando para instalar FPM:
$ sudo gem install --no-ri --no-rdoc fpm
Verá una salida similar a la siguiente.
Fetching: cabin-0.9.0.gem (100%) Successfully installed cabin-0.9.0 Fetching: backports-3.6.8.gem (100%) Successfully installed backports-3.6.8 Fetching: arr-pm-0.0.10.gem (100%) Successfully installed arr-pm-0.0.10 Fetching: clamp-1.0.1.gem (100%) Successfully installed clamp-1.0.1 Fetching: ffi-1.9.17.gem (100%) Building native extensions. This could take a while... Successfully installed ffi-1.9.17 Fetching: childprocess-0.6.1.gem (100%) Successfully installed childprocess-0.6.1 Fetching: archive-tar-minitar-0.5.2.gem (100%) Successfully installed archive-tar-minitar-0.5.2 Fetching: io-like-0.3.0.gem (100%) Successfully installed io-like-0.3.0 Fetching: ruby-xz-0.2.3.gem (100%) Successfully installed ruby-xz-0.2.3 Fetching: stud-0.0.22.gem (100%) Successfully installed stud-0.0.22 Fetching: mustache-0.99.8.gem (100%) Successfully installed mustache-0.99.8 Fetching: insist-1.0.0.gem (100%) Successfully installed insist-1.0.0 Fetching: dotenv-2.2.0.gem (100%) Successfully installed dotenv-2.2.0 Fetching: pleaserun-0.0.28.gem (100%) Successfully installed pleaserun-0.0.28 Fetching: fpm-1.8.1.gem (100%) Successfully installed fpm-1.8.1 15 gems installed
Para asegurarse de que Fpm esté instalado correctamente, ejecute el siguiente comando.
$ fpm --version
O,
$ fpm --v
La salida de muestra sería:
1.8.1
Si ve un resultado como el anterior, ¡felicidades! Fpm está listo para usar.
Descargar - Libro electrónico gratuito:"Gestión de parches de Linux®:mantener los sistemas Linux actualizados"Crear paquetes de Linux usando Fpm
El comando típico para usar FPM para construir un paquete se da a continuación:
$ fpm -s <source type> -t <target type> [list of sources]...
Aquí,
- -s
- El tipo del paquete fuente. Sería un directorio (dir), un rubygem (gem), un rpm (rpm), un paquete python (python), un módulo php pear (pear), etc. - -t
- tipo de su paquete de salida, como .rpm, .deb, etc.
Aquí está la lista completa de tipos de archivos de origen y de destino.
Fuentes:
- gema
- módulos de Python
- pera
- directorios
- archivos tar(.gz)
- rpm
- deuda
- paquetes de nodos (npm)
- paquetes pacman (ArchLinux)
Objetivos:
- deuda
- rpm
- solaris
- freebsd
- alquitrán
- directorios
- Archivos .pkg de Mac OS X
- paquetes pacman (ArchLinux)
También puede abrir la sección de ayuda en cualquier momento escribiendo el siguiente comando desde la Terminal.
$ fpm --help
Crear un paquete RPM
Te voy a mostrar algunos ejemplos para que lo entiendas mejor. El siguiente comando descargará la última gema json y conviértalo en un paquete .rpm:
$ fpm -s gem -t rpm json
Salida de muestra:
Created package {:path=>"rubygem-json-2.0.3-1.x86_64.rpm"}
El comando anterior descargará el último rubygem 'json' de rubygems.org y lo convertirá en un .rpm
paquete. Como puede ver en el resultado anterior, este comando ha creado un paquete llamado ‘rubygem-json-VERSION_ARCH.rpm’
con la versión/arco apropiado en su lugar. Bastante fácil, ¿no? ¡Claro que lo es!
Solo tomó un minuto construir este .rpm
paquete. Los paquetes se almacenarán en el directorio de trabajo actual. Ahora, puede instalar este paquete rpm en cualquier distribución basada en rpm como RHEL, CentOS, Fedora, etc., como se muestra a continuación.
$ sudo rpm -ivh rubygem-json-2.0.3-1.x86_64.rpm
Comprueba los detalles del paquete .rpm recién creado como se muestra a continuación.
$ sudo rpm -qip rubygem-json-2.0.3-1.x86_64.rpm
Salida de muestra:
Name : rubygem-json Version : 2.0.3 Release : 1 Architecture: x86_64 Install Date: (not installed) Group : Languages/Development/Ruby Size : 1487109 License : Ruby Signature : (none) Source RPM : rubygem-json-2.0.3-1.src.rpm Build Date : Tue 21 Feb 2017 03:45:50 PM IST Build Host : server1.ostechnix.local Relocations : / Packager : <[email protected]> Vendor : Florian Frank URL : http://flori.github.com/json Summary : This is a JSON implementation as a Ruby extension in C. Description : This is a JSON implementation as a Ruby extension in C.
Como puede ver en el resultado anterior, fpm seleccionó automáticamente el nombre del paquete, la versión, la arquitectura, la fecha de instalación, el mantenedor, la página de inicio y la descripción, todo desde el propio paquete Ruby. No necesita agregar nada manualmente. Fpm se encargará de todo.
Para ver las dependencias, simplemente ejecute:
$ rpm -qRp rubygem-json-2.0.3-1.x86_64.rpm
Salida de muestra
rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Veamos otro ejemplo.
Crear un paquete DEB
En el ejemplo anterior, hemos compilado json gem y conviértalo a un paquete .rpm usando:
$ fpm -s gem -t rpm json
Del mismo modo, para hacer deb un paquete, simplemente reemplace la palabra rpm
con deb
.
$ fpm -s gem -t deb json
Salida de muestra:
Debian packaging tools generally labels all files in /etc as config files, as mandated by policy, so fpm defaults to this behavior for deb packages. You can disable this default behavior with --deb-no-default-config-files flag {:level=>:warn} Debian packaging tools generally labels all files in /etc as config files, as mandated by policy, so fpm defaults to this behavior for deb packages. You can disable this default behavior with --deb-no-default-config-files flag {:level=>:warn} Created package {:path=>"rubygem-json_2.0.3_amd64.deb"}
Para verificar los detalles del paquete recién creado, ejecute:
$ dpkg --info rubygem-json_2.0.3_amd64.deb
Salida de muestra:
new debian package, version 2.0. size 581592 bytes: control archive=4018 bytes. 327 bytes, 12 lines control 11986 bytes, 126 lines md5sums Package: rubygem-json Version: 2.0.3 License: Ruby Vendor: Florian Frank Architecture: amd64 Maintainer: <[email protected]> Installed-Size: 1640 Provides: rubygem-json Section: Languages/Development/Ruby Priority: extra Homepage: http://flori.github.com/json Description: This is a JSON implementation as a Ruby extension in C
Para ver las dependencias del paquete anterior, ejecute:
$ dpkg -c ./rubygem-json_2.0.3_amd64.debDescargar - Libro electrónico gratuito:"La plataforma de desarrollo de Linux"
Crear un paquete de versión específico
Todos los comandos anteriores han creado las últimas versiones estables. En caso de que necesite crear un paquete de versión específico, puede hacerlo usando el comando:
$ fpm -s gem -t deb -v 2.0.0 json
El comando anterior descargará rubyjson versión 2.0.0 y lo convertirá a .deb
paquete.
Salida de muestra:
[...] Created package {:path=>"rubygem-json_2.0.0_amd64.deb"}
Del mismo modo, puede asignar un nombre específico a un paquete como se muestra a continuación.
$ fpm -s gem -t deb -n my_json -v 2.0.0 json
Salida de muestra:
[...] Created package {:path=>"my-json_2.0.0_amd64.deb"}
Como puede ver en el resultado anterior, asigné un nombre personalizado al paquete, es decir, my-json_2.0.0_amd64.deb
.
Convertir paquetes RPM a DEB y viceversa
No tiene que crear paquetes para diferentes plataformas. Simplemente conviértalos de un formato a otro. El siguiente comando convertirá un paquete rpm en un paquete deb.
$ fpm -t deb -s rpm rubygem-json-2.0.3-1.x86_64.rpm
Tenga en cuenta que he cambiado un poco la sintaxis. el tipo de destino (-t) viene primero y el tipo de fuente va después.
Salida de muestra:
[..] Created package {:path=>"rubygem-json_2.0.3-1_amd64.deb"}
Crear paquetes desde un directorio fuente
Estos son los pasos simples para crear un rpm del programa 'hola'.
$ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
$ tar -zxvf hello-2.10.tar.gz
$ cd hello-2.10/
$ ./configure --prefix=/usr
$ make
A continuación, instálelo en un directorio temporal como se muestra a continuación:
$ mkdir /tmp/installdir
$ make install DESTDIR=/tmp/installdir/
Ahora, crea el paquete rpm usando Fpm como se muestra a continuación.
$ fpm -s dir -t rpm -n hello -v 2.10 -C /tmp/installdir
Aquí,
-s
indica el tipo de archivo de origen (directorio),-t
es el tipo de paquete (rpm),-n
indica el nombre del paquete-v
es la versión;-C
es el directorio (por ejemplo,/tmp/installdir
) donde fpm buscará los archivos.
Salida de muestra:
Created package {:path=>"hello-2.10-1.x86_64.rpm"}
Para crear un paquete deb, ejecute el siguiente comando:
$ fpm -s dir -t deb -n hello -v 2.10 -C /tmp/installdir
De manera similar, puede crear cualquier paquete desde un directorio.
Lectura relacionada:
- Cómo compilar paquetes Debian desde el código fuente
- Cómo compilar paquetes desde el origen mediante CheckInstall
- Cómo convertir paquetes de Linux con Alien
Conclusión
Fpm simplifica el proceso de creación de paquetes para múltiples distribuciones sin tener muchos conocimientos de programación. Incluso un usuario intermedio de Linux puede crear fácilmente cualquier paquete para cualquier plataforma en muy poco tiempo.