Как легко создавать пакеты 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