Каков наилучший способ распространения бинарного приложения для Linux? - PullRequest
27 голосов
/ 06 октября 2009

Я только что закончил перенос приложения из Windows в Linux.
Я должен создать установщик приложения.
Приложение не с открытым исходным кодом => Я должен распространять двоичные файлы приложения (исполняемый файл, пара .so файлов, файлы справки и изображения).

Я нашел несколько способов сделать это:
- RPM и DEB пакеты ;
- установщик в .sh файлах ;
- Автопакет .

Мне не нравится первый метод (пакеты RPM и DEB), потому что я не хочу использовать разные пакеты для разных дистрибутивов Linux.

Каков лучший способ распространять двоичное приложение для Linux?

Ответы [ 8 ]

21 голосов
/ 06 октября 2009

Пару раз пройдя через это с коммерческими продуктами, я думаю, что самый лучший ответ - использовать собственный установщик для каждой поддерживаемой платформы. Все остальное создает неприятные ощущения для конечного пользователя, и на практике вам все равно приходится тестировать на каждой платформе, которую вы хотите поддерживать, так что на самом деле не так уж сложно поддерживать пакеты для каждой. Идея о том, что вы можете создать двоичный файл, который может "просто работать" на любой платформе, включая ту, о которой вы даже не слышали, просто не очень хорошо работает.

Я рекомендую сначала выбрать платформу или две для поддержки (Red Hat и Ubuntu были бы моими советами), а затем позволить пользователю требовать создания дополнительных пакетов установки. Возможно, сообщите, что вы готовы поддержать дополнительные платформы за скромную плату, которая покрывает ваше время и усилия по упаковке и тестированию на этой платформе. Если платформа окажется совсем другой, вам, возможно, придется платить больше за постоянную поддержку.

О, и я не могу переоценить ценность виртуальных машин для подобных сценариев. Вам необходимо создать виртуальные машины для каждой поддерживаемой вами платформы и, возможно, несколько виртуальных машин для каждой платформы, чтобы упростить тестирование различных конфигураций.

3 голосов
/ 06 октября 2009

Вы можете попробовать InstallBuilder . Он кроссплатформенный (работает на Windows, Linux, Mac OS X, Solaris и почти на любой другой платформе Unix). Он используется Intel, Motorola, GitHub, MySQL, Nokia / Trolltech и многими другими компаниями , так что вы будете в хорошей компании :) В дополнение к бинарным установщикам, он также может создавать межпроцессорные RPM и DEB пакеты.

InstallBuilder является коммерческим, но мы предлагаем бесплатные лицензии на программы с открытым исходным кодом и очень значительные скидки для mISV или индивидуальных разработчиков, просто напишите нам.

3 голосов
/ 06 октября 2009

Было много хороших ответов (включая мой :)) здесь . Хотя это больше касается бинарной совместимости (о которой вам нужно беспокоиться).

Для установщика я бы порекомендовал autopackage (мы успешно выпустили несколько версий нашего программного обеспечения с ним), они уже выполнили часть "installer.sh" и многое другое (например, интеграция с рабочим столом).

Вы должны быть осторожны и тестировать свои сценарии обновления и прочее, в зависимости от того, насколько сложна ваша структура пакета, но в целом она довольно аккуратна. Я исправил несколько ошибок с обработкой зависимостей в 1.2.6, так что все должно быть в порядке.

ОБНОВЛЕНИЕ : исходный вопрос был удален, поэтому отправляя полный ответ здесь, игнорируйте все ссылки на autopackage, который был объединен в Listaller , не уверен, что соответствующие части сохранились.

Для стандартных библиотек (таких как crypto ++, pthreads и т. Д.), Которые, вероятно, будут доступны в дистрибутиве, создайте динамическую связь и попросите пользователей получить их из своего репозитория дистрибутивов. Или ссылку статически, если это возможно.

Для странных библиотек, версию которых вы должны контролировать (например, если вы хотите развернуть приложение Qt4 на территории вражеских гномов), скомпилируйте их самостоятельно и установите в закрытое место, о котором знает только ваше приложение.

Никогда не устанавливайте private libs в стандартные места, если вы не уверены, что не мешаете пакетным системам всех поддерживаемых вами дистрибутивов. (и что они тоже не могут вам мешать).

Используйте rpath вместо LD_LIBRARY_PATH и установите его правильно для всех двоичных файлов и всех библиотек, которые ссылаются друг на друга. Вы можете установить rpath в вашем двоичном файле на «$ ORIGIN; $ ORIGIN /../ lib; / opt / my / private / libs» и заставить линкер искать эти места перед любыми стандартными путями. (я думаю, что для работы нужно установить флаг компоновщика). Убедитесь, что на ваших библиотеках также установлен rpath: например, QtGui нужен QtCore, и если пользователь установит стандартный пакет с другой версией, вы абсолютно не хотите, чтобы он был загружен (exe -> ../lib/QtGui.so ( 4.4.3) -> /usr/local/lib/QtCore.so (4.4.2) - верный способ умереть рано).

Если вы компилируете с любым rpath, вы можете позже изменить его с помощью chrpath, что позволит настроить местоположение установки как часть пост-обработки или сценария установки.

Поддерживать бинарную совместимость. GLIB_C довольно статичен для ваших пользователей, поэтому вам следует ссылаться на достаточно старую версию. 2.3 - безопасная ставка. Вы можете использовать APBuild - оболочку gcc, которая поддерживает версию GLIB_C и выполняет несколько других приемов двоичной совместимости, поэтому вам не нужно компилировать все свои приложения в действительно старом дистрибутиве.

Если вы ссылаетесь на что-либо статически, его, как правило, тоже нужно перестраивать с помощью APBuild, в противном случае оно обязательно будет перетаскивать более новые символы GLIB_C. Все .so, которые вы устанавливаете в частном порядке, естественно, должны быть собраны вместе с ним. Иногда вам приходится исправлять сторонние библиотеки, чтобы использовать более старые символы. (Мне пришлось исправлять ruby, чтобы вернуть реальные разрешения вместо эффективных, поскольку в более старых GLIB_C таких функций нет. До сих пор не уверен, что я что-то сломал:)).

Для интеграции со средами рабочего стола (ассоциации файлов, mime-типы, значки, пункты меню «Пуск» и т. Д.) Используйте xdg-utils. Но будьте осторожны, как и все в Linux, им не нравятся пробелы в именах файлов :). Обязательно проверяйте эти вещи в каждом целевом дистрибутиве - реализации xdg пронизаны ошибками и причудами.

Для фактической установки вы можете либо предоставить множество собственных пакетов (rpm, deb и некоторые другие), либо развернуть свой собственный установщик, либо найти установщик, который работает на всех дистрибутивах в обход собственных менеджеров пакетов. Для этого мы успешно использовали Autopackage (те же люди, которые сделали APbuild).

2 голосов
/ 03 мая 2010

Создайте архив .tar.bz2 с двоичным файлом, а затем опубликуйте для него ленту, например:

<?xml version="1.0" ?>
<interface uri="http://mysite/myprog.xml"
           xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
  <name>MyProgram</name>
  <summary>what it does</summary>
  <description>A longer description goes here.</description>

  <implementation main='bin/myprog'
                  id="sha1new=THEDIGEST"
                  version='1.0'>
    <archive href='http://mysite/myprogram-1.0.tar.bz2'
             size='10000'/>
  </implementation>
</interface>

Подпишите его своим ключом GPG. Вы можете использовать инструменты на 0install.net для расчета дайджеста и добавления подписи GPG для вас в правильном формате.

Затем разместите его на своем веб-сайте по адресу в атрибуте uri . Любой пользователь в большинстве дистрибутивов Linux (например, Ubuntu, Fedora, Debian, Gentoo, ArchLinux и т. Д.) Может затем установить и запустить вашу программу с помощью:

0launch http://mysite/myprog.xml

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

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

2 голосов
/ 06 октября 2009

Я сообщаю вам дополнительную возможность, хотя я не знаю о ее статусе: Loki installer . Loki была компанией, занимающейся портированием видеоигр для Linux. Он вышел из строя в 2002 году, но установщик доступен.

InstallShield также доступен для Linux . Хотя понятия не имею о статусе.

Хотя многие люди предлагают вам воспользоваться tar.gz, не делайте этого. Я предполагаю, что вы хотите предоставить приятный опыт для процедуры установки для ваших пользователей. Tar.gz - это один из самых низкоуровневых, низкокачественных и юзабилити-вариантов, которые вы можете сделать. Это работает везде, потому что, как вы знаете, ничего не делает.

Ребята из freedesktop.org и LSB прекрасно понимают, куда положить вещи. Для этого вам нужна дружественная программа. Автопакет imho имеет цифры (мне это нравится), но, несмотря на его возраст, я не видел ни одной программы, распространяемой в виде автопакета.

Оценивайте это внимательно, но не упускайте шанс стать частью импульса в пользу этого, просто потому, что он не популярен. Если это работает для вас, и это работает для ваших пользователей, все остальное не имеет значения.

2 голосов
/ 06 октября 2009

Нет лучшего способа (универсально говоря). tar.gz бинарные файлы, которые должны работать.

1 голос
/ 06 октября 2009

Возможно установить RPM на Debian и APT на RHEL.

Если вы собираетесь статически связывать эту программу или динамически связывать только с библиотеками, которые вы будете распространять в пакете, то не имеет большого значения, как вы ее распространяете. Самый простой способ - tar.gz, и это сработало бы.

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

0 голосов
/ 06 октября 2009

Я также изучил это на работе, и я должен согласиться, что на самом деле нет "лучшего способа". Если ваше приложение распространяется как источник, я бы использовал методы make / configure, упакованные в tar.gz. Это кажется довольно универсальным в мире Linux.

Хороший способ получить представление о том, что делать, - взглянуть на более крупные органы и посмотреть, как они распределяют свои двоичные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...