Упаковка проприетарного ПО для Linux

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

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

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

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

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

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

  • библиотеки
  • foo.sh

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

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

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

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

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

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

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


person eomer    schedule 23.08.2010    source источник


Ответы (2)


Общие проблемы

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

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

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

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

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

Упаковка

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

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

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

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

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

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

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

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

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

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

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

person P Shved    schedule 23.08.2010
comment
Средство проверки приложений Linux выглядит действительно круто, спасибо! Также спасибо за ваши другие комментарии, имеет большой смысл. Я почему-то предполагал, что есть один верный способ (TM) для упаковки проприетарных приложений в Linux, но сценарий оболочки на самом деле довольно удобен. Я храню его в том же проекте VCS, что и исходный код, поэтому проверять исходники через скрипт не имеет особого смысла. Я мог бы разобрать версию таким образом, проанализировав --version или что-то в этом роде. Плохо ли хранить пакеты/установщики вместе с кодом? - person eomer; 23.08.2010
comment
@eomer, если вы храните его в той же системе контроля версий. затем вам следует обновить все номера версий, встречающиеся в вашем репозитории, как в исходных текстах, так и в сценариях упаковки. Это автоматически решает эту проблему. Хранить все вместе - неплохая практика, ИМХО, это хорошая практика. Но когда вы упаковываете стороннее программное обеспечение (как это делают сопровождающие дистрибутивы), это просто неизбежно. - person P Shved; 23.08.2010
comment
Я все еще должен заставить это работать. LAC великолепен, но моя текущая проблема заключается в том, что для некоторых моих библиотек требуются современные версии libc и libstdc++, поэтому они не будут работать в Debian lenny. Однако, если я скомпилирую его на Debian lenny, мне придется использовать более старые версии моих библиотек. Что бы вы предложили здесь? Используете старые библиотеки? Самостоятельно компилируете текущие версии библиотек? (не знаю, как сказать CMake) или есть другой способ? Кроме того, мне интересно, действительно ли размещение сценария пакета в VCS является хорошей идеей, потому что он чрезвычайно зависит от дистрибутива. - person eomer; 24.08.2010
comment
@eomer Предлагаю компилировать современные версии библиотек самостоятельно. Поскольку таких библиотек не так много (?), то это сработает. (На самом деле я бы предложил скомпилировать все библиотеки, которые вы используете, поскольку вы также поставляете их, но это может потребовать ненужных затрат). Я никогда не использовал CMake, но я уверен, что можно указать ему связать только что скомпилированные библиотеки (я видел, как это делает Amarok2, и он использует CMake). Что касается VCS, на мой взгляд, лучше хранить скрипт, зависящий от дистрибутива, чем ничего не хранить. - person P Shved; 24.08.2010
comment
Еще раз спасибо! У меня не так много зависимостей, несколько библиотек boost и SDL. Если я сам скомпилирую библиотеки, сценарий будет намного меньше зависеть от дистрибутива (я мог бы даже добавить общие библиотеки в VCS, или это грех?). Возможно, мне придется использовать более старый дистрибутив для компиляции библиотек, чтобы он работал. t ссылаться на современные версии libc или libstdc++. - person eomer; 24.08.2010
comment
Еще раз спасибо (еще раз), подход сработал отлично. Требуемые версии boost и SDL я скомпилировал сам на Debian lenny, работающем на виртуальной машине. Я использовал make install, чтобы установить их в /usr/local, и CMake смог их найти без проблем. Средство проверки приложений Linux показало, что мое приложение теперь совместимо с версиями всех основных дистрибутивов трехлетней давности! - person eomer; 27.08.2010
comment
@eomer, приятно знать, что это помогло :-) Я уверен, что в дополнение к запуску средства проверки приложений вы также установили пару старых дистрибутивов на виртуальные машины и проверили, не было ли в вашем приложении необнаруженных проблем. Вы? - person P Shved; 28.08.2010
comment
Пока нет, но это планируется :) - person eomer; 30.08.2010

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

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

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

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

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

person MarkR    schedule 23.08.2010
comment
Это потребительское программное обеспечение, поэтому Ubuntu — наша основная целевая платформа. Мы позаботимся о том, чтобы он работал и под Fedora, OpenSUSE и Debian, пока только в 32-битной версии. Но как насчет упаковки? - person eomer; 23.08.2010