36

我刚刚将一个应用程序从 Windows 移植到 Linux。
我必须创建应用程序的安装程序。
该应用程序不是开源的 => 我应该分发应用程序的二进制文件(可执行文件、一对 .so 文件、帮助文件和图像)。

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

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

为 Linux 分发二进制应用程序的最佳方式是什么?

4

10 回答 10

26

在商业产品上经历过几次这种情况后,我认为最好的答案是为每个受支持的平台使用本机安装程序。其他任何事情都会给最终用户带来不愉快的体验,并且实际上您必须在您想要支持的每个平台上进行测试,因此为每个平台维护包并不是一个很大的负担。您可以创建一个可以在所有平台上“正常工作”的二进制文件的想法,包括一些您甚至从未听说过的平台,但实际上并没有那么好。

我的建议是,您首先选择一两个平台来支持(我的建议是 Red Hat 和 Ubuntu),然后让用户需求驱动创建额外的安装包。也许让人们知道您愿意以适当的费用支持其他平台,该费用涵盖了您在该平台上进行打包和测试的时间和精力。如果一个平台被证明非常不同,您可能需要为持续支持收取更多费用。

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

于 2009-10-06T17:52:35.877 回答
4

这里有很多很好的答案(包括我的:))。尽管这更多的是关于二进制兼容性(您确实需要担心)。

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

你必须小心并测试你的升级方案和东西,这取决于你的包结构有多复杂,但总体来说它非常整洁。我在 1.2.6 中修复了一些依赖处理的错误,所以应该没问题。

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

对于可能在发行版中可用的标准库(如crypto++、pthreads等)——动态链接并告诉用户从他们的发行版存储库中获取它们。或者如果可行的话,静态链接。

对于你必须控制版本的奇怪库(例如,如果你想在敌方侏儒的领土上部署 Qt4 应用程序),你自己编译它们并安装到只有你的应用程序知道的私有位置。

切勿将私有库安装到标准位置,除非您可以确保不会干扰您支持的所有发行版的软件包系统。(而且他们也不能干涉你)。

使用 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 的人)。

于 2009-10-06T00:42:43.320 回答
3

可以在 Debian 上安装 RPM,在 RHEL 上安装 APT。

如果你打算静态链接这个程序,或者只动态链接你将在包中分发的库,那么你如何分发它并不重要。最简单的方法是 tar.gz 并且可以。

OTOH,如果它与系统库动态链接,特别是如果它依赖于将与客户端的其他应用程序共享的动态库,那么您需要执行 RPM、APT 或两者。

于 2009-10-06T00:57:36.267 回答
3

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

InstallBuilder 是商业的,但我们为开源程序提供免费许可证,并为 mISV 或独立开发者提供非常大的折扣,请给我们留言。

于 2009-10-06T13:38:45.350 回答
3

使用二进制文件创建一个 .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,但命令行可以在任何地方工作。

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

于 2010-05-03T09:53:47.147 回答
2

没有最好的方法(一般来说)。tar.gz 二进制文件,应该可以。

于 2009-10-06T00:01:36.923 回答
2

我告诉你一个额外的可能性,虽然我不知道它的状态:Loki 安装程序。Loki 是一家为 Linux 进行视频游戏移植的公司。它在 2002 年出现故障,但安装程序可用。

InstallShield 也可用于 linux。虽然不知道状态。

尽管很多人建议您使用 tar.gz,但请不要。我假设您想为您的用户提供愉快的安装过程体验。tar.gz 是您可以做的最低级别、低质量、低可用性的选择之一。如您所知,它在任何地方都有效,因为它基本上什么都不做。

freedesktop.org 和 LSB 的工作人员非常清楚将东西放在哪里。你需要的是一个友好的程序来做到这一点。Autopackage imho 有数字(我喜欢它),但尽管它的年代久远,我还没有看到一个作为自动包装分发的程序。

仔细评估它,但不要因为它不受欢迎而跳过成为支持它的动力的一部分的机会。如果它适用于您,并且适用于您的用户,那么其他一切都无关紧要。

于 2009-10-06T01:02:01.183 回答
2

今天,我还会看看一些流行发行版所采用的SnapcraftFlatpak 。探索了其他选择,这最终对我最有效。尤其是 Flatpak 还帮助我了解了要遵循的标准 Linux 桌面约定。

于 2020-05-18T00:28:30.767 回答
1

您可能还想查看 AppImage ( https://appimage.org/ )。这个概念是它生成一个二进制文件,用户下载、设置可执行文件并直接运行;无需安装,无需安装依赖项(因为应用程序映像通常包括所有依赖项,除了 glibc 之类的基本内容)。这带来了非常棒的用户体验!

一些缺点:

  • 图像可能很大,因为它可能包含应用程序所依赖的所有文件/库/...。
  • 作为映像创建者,您负责对添加到映像中的任何库进行安全更新。
  • AppImage 非常适合用户运行的应用程序,该应用程序与系统上的任何其他内容(即守护程序、系统配置等)完全隔离,但如果您的应用程序依赖于 udev 集成、桌面文件安装、dbus 注册等内容。这并不容易,因为应用程序未运行时应用程序文件不可用(使 udev 规则变硬),并且根据定义没有安装程序可以运行(使桌面文件安装变硬)。
于 2020-02-20T18:02:28.933 回答
0

我也在工作中对此进行了研究,我不得不同意确实没有“最佳方式”。如果您的应用程序作为源代码分发,那么我将使用打包在 tar.gz 中的 make/configure 方法。这在 Linux 世界中似乎相当普遍。

了解该做什么的一个好方法是查看更大的组织,看看它们如何分发二进制文件。

于 2009-10-06T00:26:09.837 回答