为多个 Linux 发行版发布纯二进制应用程序的首选方式是什么?
-
19-09-2019 - |
题
我有一个想要分发的闭源 Linux 应用程序。该应用程序使用 wxWidgets/GTK,因此该应用程序依赖于大量共享库(60+)。
发布应用程序并支持最大数量的发行版的首选方式是什么?
是为每个支持的发行版构建应用程序并单独发布吗?这样做的缺点是构建起来很复杂(chroot 和每个发行版的构建)并且仅适用于受支持的发行版。
是在安装程序中添加所有共享库并将它们与 LD_LIBRARY_PATH 环境变量一起使用(如 VMware)吗?这样做的缺点是增加了安装程序的大小。
是构建一个完全静态的应用程序吗?这肯定是不可能的,因为它会破坏一些许可证。
它是该选项的混合还是其他选项?大多数商业供应商如何发布自己的图形(最好是基于GTK)应用程序?
解决方案
你应该看看 Linux 标准库. 。它是专门为帮助处于您职位的人而设计的。它定义了第 3 方应用程序开发人员可以依赖的环境 - 因此有 libc 和其他库的固定版本,并且某些程序和目录位于已知位置。所有主要的 Linux 发行版都支持 LSB。
也就是说,您仍然应该专门针对每个主要发行版打包结果 - 这样您的客户就可以使用他们熟悉的包管理工具来管理您的应用程序。
其他提示
基本上有两种方法。如果您愿意,您可以选择两者。
第一种方式是游戏等常见的方式。创建一个 lib/ 子目录,使用 LD_LIBARY_PATH
并包含您需要的几乎所有共享库。这可以确保用户获得无痛的体验,但确实会使安装程序变得更大,并且内存占用也可能更大。我什至不会尝试重用预先存在的库,因为随着系统升级,它们往往会消失。
第二种方式是提供分发包。这些通常并不难制作,然后会与发行版很好地集成,而且看起来更受您的客户欢迎。2个缺点是:您需要为每个发行版(Debian、Ubuntu、SuSE、redhat 可能是一个好的开始)执行此操作,并且您需要维护它们:随着时间的推移,某些库在特定版本中将不再可用,因此用户将遇到依赖问题。
在安装程序中,检查已安装哪些库,然后下载未安装库的二进制文件。
为了让用户更加舒适,如果没有连接到 Internet,请让安装程序生成一个密钥,您可以在网站上输入该密钥以接收 ZIP 存档,然后将其提供给安装程序。
为了获得最大的舒适度,请检查目标发行版上有哪些库可用,并要求用户使用标准管理工具来安装它们。这样,您就不会因为同一库的不同版本而污染计算机。
那是说:将有价值的代码放入链接库中,然后将其作为源包中的二进制 blob 提供可能会更明智。这样,您的代码就可以像纯二进制文件一样受到保护,并且用户可以在他们喜欢的系统上编译粘合代码,而无需您担心其他事情。
我是说:设置 UI 的代码部分有多少价值?如果有人偷了你会损失多少?