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

Dmi*_*riy 27 linux binary software-distribution packages package

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

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

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

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

div*_*eek 21

经过几次商业化产品,我认为最好的答案是为每个支持的平台使用本机安装程序.还有什么产生了最终用户的不愉快的经历,并在实践中你必须测试您无论如何要支持所有的平台上,因此它不是真正维护每个包一个显著的负担.您可以创建一个可以在每个平台上"正常工作"的二进制文件的想法,包括一些您从未听说过的平台,只是真的不能很好地工作.

我的建议是你选择一个或两个平台来支持最初(Red Hat和Ubuntu将是我的建议),然后让用户要求驱动创建额外的安装包.也许让人知道您愿意支持其他平台,只需支付适当的费用即可节省您在该平台上打包和测试的时间和精力.如果平台被证明是非常不同的,您可能需要为持续支持收取更多费用.

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


Eug*_*ene 6

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

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

您必须小心并测试您的升级方案和内容,具体取决于您的包结构的复杂程度,但总体而言非常简洁。我在 1.2.6 中修复了一些依赖处理的错误,所以应该没问题。

更新:原始问题已删除,因此在此处重新发布完整答案,忽略所有对 autopackage 的引用,该引用已合并到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 的人相同)。