Поиск по сайту:

Как легко создавать пакеты Linux с использованием Fpm для нескольких платформ

Существует множество дистрибутивов Linux, и упаковка приложений для разных дистрибутивов Linux — довольно трудоемкая и сложная задача. Упаковка приложений не для всех так проста. К счастью, есть альтернативный и самый простой способ создания пакетов. Встречайте Fpm (Efing package mmanagement), программу командной строки, которая помогает легко создавать пакеты Linux.

Используя Fpm, вы можете легко преобразовать пакет в другой формат и установить его с помощью менеджера пакетов дистрибутива по умолчанию.

И да, Snaps и Flatpaks Ubuntu быстро растут, и их можно установить в большинство дистрибутивов Linux. Но на тот случай, если вы захотите упаковать приложение, которое еще не доступно для вашего дистрибутива, Fpm — один из способов сделать это.

И это намного проще, чем традиционные методы упаковки. Fpm — это совершенно бесплатный инструмент с открытым исходным кодом, написанный на языке программирования Ruby.

В этом руководстве мы обсудим, как собрать пакет с помощью Fpm в Linux.

Установить FPM в Linux

Поскольку fpm написан с использованием Ruby, сначала необходимо установить Ruby. Ruby предустановлен в некоторых операционных системах. Если он еще не установлен, выполните следующие команды в зависимости от используемого вами дистрибутива.

В Arch Linux и его вариантах:

sudo pacman -S ruby

В системах Red Hat (Fedora 22 или старше, CentOS и т. д.):

sudo yum install ruby-devel gcc make rpm-build

В Fedora 23 или новее:

sudo dnf install ruby-devel gcc make rpm-build

В системах на основе Debian (Debian, Ubuntu и т. д.):

sudo apt-get install ruby ruby-dev rubygems gcc make rpm

Вы также можете установить Ruby с помощью менеджера пакетов Linuxbrew. Чтобы установить Linuxbrew в Linux, обратитесь к следующему руководству.

  • Linuxbrew — общий менеджер пакетов для Linux и Mac OS X

После установки Linuxbrew запустите эту команду, чтобы установить Ruby.

brew install ruby

После установки Ruby выполните следующую команду для установки FPM:

sudo gem install --no-ri --no-rdoc fpm

Вы увидите результат, подобный приведенному ниже.

 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

Чтобы убедиться, что Fpm установлен правильно, выполните следующую команду.

fpm --version

Или,

fpm --v

Пример вывода будет:

1.8.1

Если вы видите результат, подобный приведенному выше, поздравляем! FPM готов к использованию.

Сборка пакетов Linux с использованием Fpm

Типичная команда для использования FPM для сборки пакета приведена ниже:

fpm -s <source type> -t <target type> [list of sources]...

Здесь,

  • -s <тип источника> — тип пакета исходного кода. Это может быть каталог (dir), RubyGem (Gem), RPM (RPM), пакет Python (Python), модуль php Pear (Pear) и т. д.
  • -t — тип вашего выходного пакета, например .rpm, .deb и т. д.

Вот полный список типов исходных и целевых файлов.

Источники:

  • драгоценный камень
  • модули Python
  • груша
  • каталоги
  • tar(.gz) архивы
  • об/мин
  • Деб
  • пакеты узлов (npm)
  • пакеты pacman (ArchLinux)

Цели:

  • Деб
  • об/мин
  • Солярис
  • FreeBSD
  • смола
  • каталоги
  • Файлы .pkg для Mac OS X
  • пакеты pacman (ArchLinux)

Вы также можете вызвать раздел справки в любое время, введя следующую команду в Терминале.

fpm --help

Создайте пакет RPM

Я собираюсь показать вам несколько примеров, чтобы лучше понять. Следующая команда загрузит последнюю версию json gem и преобразует ее в пакет .rpm:

fpm -s gem -t rpm json

Пример вывода:

Created package {:path=>"rubygem-json-2.0.3-1.x86_64.rpm"}

Приведенная выше команда загрузит последнюю версию Rubygem «json» с сайта Rubygems.org и преобразует ее в пакет .rpm. Как вы видите в приведенном выше выводе, эта команда создала пакет с именем 'rubygem-json-VERSION_ARCH.rpm' с соответствующей версией/архией. Довольно легко, не так ли? Конечно, это является!

Сборка этого пакета .rpm заняла всего одну минуту. Пакеты будут храниться в текущем рабочем каталоге. Теперь вы можете установить этот пакет rpm в любые дистрибутивы на основе rpm, такие как RHEL, CentOS, Fedora и т. д., как показано ниже.

sudo rpm -ivh rubygem-json-2.0.3-1.x86_64.rpm

Вы проверяете детали вновь созданного пакета .rpm, как показано ниже.

sudo rpm -qip rubygem-json-2.0.3-1.x86_64.rpm

Пример вывода:

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 : <root@server1.ostechnix.local>
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.

Как вы можете видеть в приведенном выше выводе, fpm автоматически выбрал имя пакета, версию, архитектуру, дату установки, сопровождающего, домашнюю страницу и описание из самого пакета Ruby. Вам не нужно ничего добавлять вручную. FPM обо всем позаботится.

Чтобы просмотреть зависимости, просто запустите:

rpm -qRp rubygem-json-2.0.3-1.x86_64.rpm

Пример вывода

rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1

Давайте посмотрим еще один пример.

Создайте пакет DEB

В приведенном выше примере мы создали json gem и преобразуем его в пакет .rpm, используя:

fpm -s gem -t rpm json

Аналогично, чтобы сделать deb пакетом, просто замените слово rpm на deb.

fpm -s gem -t deb json

Пример вывода:

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"}

Чтобы проверить детали вновь созданного пакета, запустите:

dpkg --info rubygem-json_2.0.3_amd64.deb

Пример вывода:

 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: <sk@ubuntuserver>
 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

Чтобы просмотреть зависимости вышеуказанного пакета, запустите:

dpkg -c ./rubygem-json_2.0.3_amd64.deb

Создайте пакет конкретной версии

Все предыдущие команды создали последние стабильные версии. Если вам нужно собрать пакет определенной версии, вы можете сделать это с помощью команды:

fpm -s gem -t deb -v 2.0.0 json

Приведенная выше команда загрузит Rubyjson версии 2.0.0 и преобразует ее в пакет .deb.

Пример вывода:

[...]
Created package {:path=>"rubygem-json_2.0.0_amd64.deb"}

Аналогичным образом вы можете присвоить пакету определенное имя, как показано ниже.

fpm -s gem -t deb -n my_json -v 2.0.0 json

Пример вывода:

[...]
Created package {:path=>"my-json_2.0.0_amd64.deb"}

Как вы видите в приведенном выше выводе, я присвоил пакету собственное имя, например my-json_2.0.0_amd64.deb.

Конвертируйте пакеты RPM в пакеты DEB и наоборот.

Вам не нужно создавать пакеты для разных платформ. Просто конвертируйте их из одного формата в другой. Следующая команда преобразует пакет rpm в пакет deb.

fpm -t deb -s rpm rubygem-json-2.0.3-1.x86_64.rpm

Обратите внимание, что я немного изменил синтаксис. целевой тип (-t) идет первым, а затем исходный тип.

Пример вывода:

[..]
Created package {:path=>"rubygem-json_2.0.3-1_amd64.deb"}

Сборка пакетов из исходного каталога

Вот простые шаги для создания пакета программы «hello».

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

Затем установите его во временный каталог, как показано ниже:

mkdir /tmp/installdir
make install DESTDIR=/tmp/installdir/

Теперь создайте пакет rpm, используя Fpm, как показано ниже.

fpm -s dir -t rpm -n hello -v 2.10 -C /tmp/installdir

Здесь,

  • -s указывает тип исходного файла (каталог),
  • -t — тип пакета (об/мин),
  • -n указывает имя пакета.
  • -v — версия;
  • -C — это каталог (например, /tmp/installdir), в котором fpm будет искать файлы.

Пример вывода:

Created package {:path=>"hello-2.10-1.x86_64.rpm"}

Чтобы создать пакет deb, выполните следующую команду:

fpm -s dir -t deb -n hello -v 2.10 -C /tmp/installdir

Точно так же вы можете собрать любой пакет из каталога.

Связанное чтение:

  • Как собрать пакеты Debian из исходного кода
  • Как собрать пакеты из исходного кода с помощью CheckInstall
  • Как конвертировать пакеты Linux с помощью Alien

Заключение

Fpm упрощает процесс создания пакетов для нескольких дистрибутивов без особых знаний программирования. Даже опытный пользователь Linux может легко и быстро создать любые пакеты для любой платформы.

Ресурсы:

  • Репозиторий Fpm на GitHub
  • Документация по FPM

Статьи по данной тематике