Упаковка проприетарного программного обеспечения для Linux - PullRequest
7 голосов
/ 23 августа 2010

Я занимаюсь кроссплатформенной разработкой и хочу создать красивый, автономный (!) Пакет для Linux. Я знаю, что обычно это не так, но приложению требуются все данные в одном месте, поэтому я устанавливаю их в / opt, как и многие другие проприетарные программные пакеты. В конечном итоге я предоставлю пакеты deb и rpm, но пока это будет только .tar.gz. Пользователь должен где-то извлечь его, и он должен работать. Я бы предпочел не иметь установщика.

Сначала мои вопросы, затем подробности:

  1. Как другие люди упаковывают проприетарное программное обеспечение для Linux?
  2. Существуют ли инструменты для упаковки программного обеспечения, включая общие библиотеки?

Теперь для некоторых деталей: Это макет моего проекта (я называю это foo для этой цели):

  • foo (двоичный код)
  • config.ini
  • данные

Теперь в пакете появятся два дополнительных элемента:

  • ЛИЭС
  • foo.sh

libs будет содержать все общие библиотеки, необходимые для проекта, а foo.sh - это скрипт, который устанавливает в LD_LIBRARY_PATH включение libs . Поэтому пользователь выполнит foo.sh и программа должна запуститься.

У меня есть сценарий оболочки, который упаковывает программное обеспечение в следующие шаги:

  1. Создать пустой каталог и скопировать в него foo.sh
  2. Запустите процесс сборки и сделайте установку в новый каталог
  3. Копирование общих библиотек из файловой системы
  4. Упакуйте все как .tar.gz

Что вы думаете об этом? Есть некоторые проблемы с этим подходом:

  • Мне нужно жестко кодировать все зависимости дважды (один раз в CMake, один раз в скрипте упаковки)
  • Я должен определить номер версии дважды (один раз в исходном коде, один раз в скрипте упаковки)

Как ты это делаешь?

Edit: Еще один вопрос, который только что возник: как вы определяете, от каких библиотек зависит ваше программное обеспечение? Я сделал ldd foo , но это очень много. Я посмотрел на то, как выглядят пакеты WorldOfGoo, и они поставляют очень мало библиотек. Как я могу предположить, какая библиотека будет присутствовать в системе пользователя, а какая нет? Просто установите все целевые дистрибутивы в виртуальный утренник и посмотрите, что требуется?

Ответы [ 2 ]

5 голосов
/ 23 августа 2010

Общие вопросы

Ваш способ упаковать свои вещи (с зависимыми библиотеками) в /opt - это то, как упаковывается проприетарное (и даже с открытым исходным кодом) программное обеспечение. Рекомендуемая практика Linux Foundation (см. мой ответ на другой вопрос для ссылок).

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

Обратите внимание, что нет необходимости включать некоторые действительно низкоуровневые библиотеки (такие как glibc, Xorg) в ваш пакет. Их лучше оставить системным вендорам для настройки, и вы можете просто предположить, что они существуют. Более того, существует Стандартная база Linux , которая документирует наиболее важные библиотеки; эти библиотеки существуют почти везде, и им можно доверять.

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

Я только что рассказал о некоторых общих вещах, но я считаю, что Веб-сайт Linux Developers Network содержит больше информации об упаковке и переносимости.

Упаковка

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

Tar.gz, или, конечно, также может работать, но, например, создание RPM не достаточно сложно, чтобы упустить такую ​​возможность, чтобы сделать жизнь ваших пользователей намного проще.

Отвечая на ваши вопросы,

  • Да, вам придется дважды жестко кодировать зависимости.

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

    Между именами пакетов и общими библиотеками и заголовками нет взаимного распределения. Это зависит от распределения. Поэтому его следует указывать дважды.

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

  • Да, вы должны указать свою версию дважды.

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

Анализ зависимостей

Для анализа зависимостей вашего программного обеспечения вы можете использовать наш бесплатный Linux Application Checker инструмент с открытым исходным кодом. Он сообщит список библиотек, от которых он зависит, покажет дистрибутивы, с которыми совместимо ваше программное обеспечение, и поможет вашему приложению быть более переносимым между дистрибутивами. Оказывается, что иногда можно добиться большей совместимости между дистрибутивами без особых усилий, и вам не нужно ограничиваться поддержкой только нескольких выбранных дистрибутивов.

0 голосов
/ 23 августа 2010

Подумайте долго и усердно (или спросите в своем отделе разработки продукта), какие дистрибутивы / архитектуры вам необходимо поддерживать.

Убедитесь, что они полностью понимают смысл тестирования.

Я ожидаю, что вы получите очень короткий список поддерживаемых дистрибутивов и архитектур.

Это действительно зависит от того, какие клиенты платят за поддержку Linux. Большинство людей используют Redhat Enterprise (на серверах) или Centos (что неразличимо с технической точки зрения).

Если вам нужна только поддержка Redhat, вам нужна только RPM, работа хорошая.

...