Что лучший способ состоит в том, чтобы распределить двоичное приложение для Linux?

Попробуйте класс HashSet:

var enumA = new[] { 1, 2, 3, 4 };
var enumB = new[] { 4, 3, 1, 2 };

var hashSet = new HashSet<int>(enumA);
hashSet.SymmetricExceptWith(enumB);
Console.WriteLine(hashSet.Count == 0); //true => equal

, Но это действительно только работает правильно, если значения отличны.

, Например

var enumA = new[] { 1, 1, 1, 2 };
var enumB = new[] { 1, 2, 2, 2 };

также рассматриваются как "равный" с упомянутым методом.

27
задан Community 23 May 2017 в 11:46
поделиться

8 ответов

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

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

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

21
ответ дан 28 November 2019 в 05:36
поделиться

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

2
ответ дан 28 November 2019 в 05:36
поделиться

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

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

3
ответ дан 28 November 2019 в 05:36
поделиться

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

InstallShield также доступен для Linux . Тем не менее, ничего не знаю о статусе.

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

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

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

2
ответ дан 28 November 2019 в 05:36
поделиться

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

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

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

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

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

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

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

Используйте rpath вместо LD_LIBRARY_PATH и установите его правильно для всех ваших двоичных файлов и всех dll, которые ссылаются друг на друга. Вы можете установить rpath для двоичного файла на "$ ORIGIN; $ ORIGIN /../ lib; / opt / my / private / libs" и пусть линкер будет искать эти места до любых стандартных путей. (я думаю, нужно установить какой-то флаг компоновщика для работы origin). Не забудьте также установить 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).

3
ответ дан 28 November 2019 в 05:36
поделиться

Можно установить RPM на Debian и APT на RHEL.

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

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

1
ответ дан 28 November 2019 в 05:36
поделиться

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

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

0
ответ дан 28 November 2019 в 05:36
поделиться

Создайте архив .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
ответ дан 28 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: