Проприетарные программы для Linux нередко распространяются в виде исполняемых установщиков. Таким способом их авторы избегают необходимости собирать более чем один формат пакета. Программы на платформенно независимых языках вроде Java также могут использовать один графический установщик на всех ОС — различается способ его запуска.
РЕКОМЕНДУЕМ:
Как удалить лишние прошивки Linux
Таким способом распространялись пакеты с драйверами NVIDIA, некоторые игры, значительная часть пакетов Sun Microsystems / Oracle (NetBeans, SunStudio и другие). Чаще всего у них было расширение .<wbr />run, иногда просто .<wbr />sh.
Как правило, такой установщик представляет собой самораспаковывающийся архив. На Windows монолитные установщики и самораспаковывающиеся архивы обычно содержали двоичный код программы для распаковки архива. UNIX-подобные ОС всегда включают в себя как минимум tar и gzip, как требует стандарт POSIX, поэтому можно обойтись скриптом на стандартном же Bourne shell.
Самораспаковывающиеся архивы Makeself
Я долго думал, что инструменты для создания этих установщиков тоже проприетарные. Так бы я и думал, если бы не наткнулся на свободные проекты с такими же установщиками. Создателем этих пакетов оказался один и тот же инструмент с открытым исходным кодом — makeself.io.
Makeself представляет собой сравнительно небольшой скрипт. Как ни странно, авторы до сих пор его не забросили, и в последних версиях Makeself поддерживает сжатие с помощью xz и контрольные суммы SHA-256 вместо традиционных gzip и MD5.
Можно даже не устанавливать его, а просто скопировать файлы makeself.<wbr />sh и makeself-header.<wbr />sh в каталог проекта. Продемонстрирую на простом примере. Нам потребуется целевой файл (условно test.<wbr />sh) и скрипт установки, который будет выполняться после распаковки во временный каталог.
1 2 3 4 5 6 |
├── makeself-header.sh ├── makeself.sh └── my-package ├── setup.sh └── test.sh |
Процесс установки полностью на совести пользователя. Для простоты ограничимся копированием в /<wbr />tmp. Скрипт выполняется в каталоге с распакованными файлами, поэтому все пути будут относительными.
1 2 |
#!/bin/sh cp test.sh /tmp/ |
Теперь создадим наш установщик. Синтаксис команды — makeself.<wbr />sh <<wbr />каталог <wbr />с <wbr />файлами> <<wbr />имя <wbr />выходного <wbr />файла> <<wbr />название <wbr />проекта> <<wbr />команда <wbr />для <wbr />выполнения <wbr />после <wbr />распаковки>.
Путь к команде для выполнения после распаковки тоже пишется относительно каталога с распакованными файлами. Это единственный тонкий момент в работе с Makeself. Именно поэтому мы поместили скрипт setup.<wbr />sh в каталог с файлами для упаковки — Makeself воспринимает этот аргумент именно как команду, а не встраивает скрипт в заголовок установщика.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ./makeself.sh ./my-package/ my-package.run "My Package" "./setup.sh" Header is 678 lines long About to compress 12 KB of data... Adding files to archive named "my-package.run"... ./setup.sh ./test.sh CRC: 2448166092 MD5: f46655bb0b96ea7bee4d1f6f112eebe4 Self-extractable archive "my-package.run" successfully created. $ ./my-package.run Verifying archive integrity... 100% MD5 checksums are OK. All good. Uncompressing My Package 100% $ file /tmp/test.sh /tmp/test.sh: POSIX shell script, ASCII text executable |
Заключение
Есть ли смысл использовать Makeself во времена snap, Flatpak и AppImage? Я вижу два варианта, когда Makeself все еще актуален. Первый — распространение самоустанавливающихся хотфиксов в особых случаях, когда нормальный пакет собрать невозможно или нерационально. Второй — поддержка проприетарных ОС. Скрипты Makeself с опциями по умолчанию будут работать на любой POSIX-совместимой системе, поэтому, если от тебя требуют установщик для Solaris или HP-UX, это самый простой способ их создать.