如何在Linux系统上分发二进制应用程序是最佳方式?

40

我刚完成了一个从Windows移植到Linux的应用程序。
我需要创建该应用程序的安装程序。
该应用程序不是开源的,所以我应该分发该应用程序的二进制文件(可执行文件、几个.so文件、帮助文件和图像)。

我找到了几种方法来做到这一点:
- RPM和DEB包
- .sh文件中的安装程序
- Autopackage

我不喜欢第一种方法(RPM和DEB包),因为我不想为不同的Linux发行版维护不同的软件包。

什么是在Linux上分发二进制应用程序的最佳方法

10个回答

30

我已经和商业产品一起做过这个事情几次了,我认为最好的解决方法是使用每个支持平台的本地安装程序。其他任何方式都会给最终用户带来不愉快的体验,在实践中,您必须在要支持的每个平台上进行测试,因此对于每个平台来维护软件包并不是一个重大负担。那种可以“只需工作”在每个平台上(包括您从未听说过的平台)的二进制文件的想法并不奏效。

我的建议是,您最初选择一到两个平台进行支持(我的建议是Red Hat和Ubuntu),然后让用户需求推动创建更多的安装包。也许可以公布您愿意为额外的平台提供支持,以涵盖打包和测试的时间和精力的适当费用。如果某个平台被证明非常不同,则您可能需要为持续支持收取更高的费用。

哦,我无法过度强调虚拟机在这种情况下的价值。您需要为每个支持的平台构建虚拟机,并且可能需要为每个平台构建多个虚拟机来方便测试不同的配置。


6

这里有很多好的答案(包括我的:))这里。虽然它更多地涉及二进制兼容性(这确实需要您担心)。

对于安装程序,我建议使用autopackage(我们已经成功发布了几个版本的软件),他们已经完成了“installer.sh”部分,还有更多功能(例如桌面集成)。

您必须小心并测试升级方案等内容,具体取决于您的打包结构的复杂程度,但总体上还是相当不错的。我在1.2.6中修复了一些依赖关系处理错误,所以应该没问题。

更新:原始问题已被删除,因此在此重新发布完整答案,请忽略所有有关autopackage的引用,它已合并到Listaller中,不确定相关部分是否幸存。

对于标准库(如crypto ++,pthreads等),这些库可能可用于发行版-动态链接并告诉用户从其发行版存储库获取它们。如果可行,也可以进行静态链接。

对于您必须控制版本的奇怪库(例如,如果要在敌对地区的gnome上部署Qt4应用),请自行编译它们并将其安装到只有您的应用程序知道的私有位置。

除非您确定不会干扰您支持的所有发行版的软件包系统(并且它们也无法干扰您),否则不要将私有库安装到标准位置。

使用rpath而不是LD_LIBRARY_PATH,并为所有二进制文件和相互引用的所有dll正确设置它。您可以在二进制文件上设置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-一个强制执行GLIB_C版本并执行其他二进制兼容性技巧的gcc包装器,因此您不必在真正古老的发行版上编译所有应用程序。

如果您链接到任何静态内容,通常也必须使用APBuild重新构建它,否则它将绑定新的GLIB_C符号。您私有安装的所有.so文件也必须使用它进行构建。有时您必须修补第三方库以使用旧符号。(我不得不修补ruby以返回真实权限而不是有效权限,因为旧的GLIB_C中没有这样的函数。仍然不确定我是否破坏了什么 :))。
对于与桌面环境的集成(文件关联、mime类型、图标、开始菜单条目等),请使用xdg-utils。但要注意,像Linux上的所有东西一样,它们并不真正喜欢文件名中有空格 :)。确保在每个目标发行版上测试这些内容——xdg实现中充满了错误和怪癖。
对于实际安装,您可以提供各种本地软件包(rpm、deb等),或者自己制作安装程序,或者找到可在所有发行版上工作的安装程序,绕过本地软件包管理器。我们成功地使用Autopackage(与APbuild相同的人)进行了安装。

问题因过于宽泛而被删除,我将答案复制粘贴给了@OrestesKappa。 - Eugene

4
创建一个.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

他们的系统还会定期检查更新。不同桌面环境有各种GUI,但命令行在任何地方都可用。

还可以查看一些现有的提要以获取灵感。


4

在Debian操作系统中安装RPM包,在RHEL操作系统中安装APT包是可能的。

如果您将要静态链接这个程序,或者只与您将在软件包中分发的库动态链接,那么您如何分发它并不重要。最简单的方法是使用tar.gz文件,这样就可以工作。

然而,如果它是与系统库动态链接的,特别是如果它对客户端其他应用程序共享的动态库有依赖关系,则需要进行RPM、APT或两者兼备。


一个 .deb 文件,而不是“APT”(代表软件包工具) - Pascal Thivent
好的。维基百科的词条肯定是错误的。 "高级包装工具" 是官方但从未使用过的名称吗?http://en.wikipedia.org/wiki/Advanced_Packaging_Tool - DigitalRoss
我的错误,实际上是“高级打包工具”(应该检查一下)。尽管如此,APT 不是一种打包格式,而是与Debian的.deb软件包一起使用的软件包管理系统。 - Pascal Thivent

4

您可能想尝试InstallBuilder。它是跨平台的(可以在Windows、Linux、Mac OS X、Solaris和几乎任何其他Unix平台上运行)。它被Intel、Motorola、GitHub、MySQL、Nokia/Trolltech以及许多其他公司使用,所以您将处于良好的公司 :) 除了二进制安装程序之外,它还可以创建跨发行版的RPM和DEB软件包。

InstallBuilder是商业软件,但我们为开源程序提供免费许可证,并为mISV或独立开发人员提供非常优惠的折扣,请给我们写信联系。


4
今天,我也会看一下一些受到流行发行版支持的SnapcraftFlatpak。我探索了其他选项,最终发现这是最适合我的选择。特别是Flatpak帮助我学习了要遵循的标准Linux桌面惯例。

3
我告诉你另一个可能性,尽管我不知道它的状态:Loki安装程序。Loki是一家为Linux制作游戏移植的公司。它在2002年倒闭了,但该安装程序仍可用。 InstallShield也可用于Linux。不过我不知道它的状态。
虽然许多人建议你使用tar.gz,但请不要这样做。我想你希望为用户提供愉快的安装体验。tar.gz是你可以选择的最低级别、质量和可用性最差的选择之一。它之所以能够在任何地方运行,是因为它基本上什么都不做,正如你所知道的那样。
freedesktop.org和LSB的人员非常清楚应该把东西放在哪里。你需要的是一个友好的程序来完成这项工作。我认为Autopackage有这个实力(我很喜欢它),但尽管它的年龄比较长,我还没有看到一个单独的程序被分发为Autopackage。
认真评估它,但不要因为它不流行而错过成为其势头一部分的机会。如果它适合你和你的用户,并且能够发挥作用,其他一切都不重要。

InstallBuilder是一个现代化的替代方案,可用于取代InstallAnywhere。http://installbuilder.bitrock.com - Daniel Lopez

2
您可能还想看一下AppImage(https://appimage.org/)。它的概念是生成一个单独的二进制文件,用户下载后设置为可执行文件并直接运行;无需安装,无需安装依赖项(因为应用程序映像通常包括除glibc等基本内容以外的所有依赖项)。这使得用户体验非常好!
一些缺点:
- 映像可能很大,因为它可能包含应用程序所依赖的所有文件/库/...。 - 作为映像创建者,您需要负责对您添加到映像中的任何库进行安全更新。 - 对于一个与系统上其他任何东西都相当隔离的用户运行应用程序来说,AppImage非常棒(即daemons、系统配置等),但如果您的应用程序依赖于udev集成、桌面文件安装、dbus注册等,则这不容易,因为应用程序文件在应用程序未运行时不可用(使udev规则变得困难),而且根据定义没有运行的安装程序(使桌面文件安装变得困难)。

2

没有一种普遍而言的最佳方式。 将二进制文件打成tar.gz格式,应该可以正常运行。


创建应用程序可执行文件的快捷方式怎么样? - Dmitriy
这也要看使用哪个桌面环境?(虽然freedesktop.org的人应该有一个标准) - Stefano Borini
“创建应用程序可执行文件的快捷方式怎么样?”最好先询问用户。我不喜欢程序未经邀请就擅自操作我的设备。 - dmckee --- ex-moderator kitten

1

我在工作中也研究过这个问题,我必须同意没有一个“最好的方法”。如果您的应用程序以源代码形式分发,则我会选择使用打包成tar.gz的make/configure方法。在Linux世界中,这似乎是相当普遍的。

了解如何处理此问题的好方法是查看较大组织如何分发其二进制文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接