我刚完成了一个从Windows移植到Linux的应用程序。
我需要创建该应用程序的安装程序。
该应用程序不是开源的,所以我应该分发该应用程序的二进制文件(可执行文件、几个.so文件、帮助文件和图像)。
我找到了几种方法来做到这一点:
- RPM和DEB包;
- .sh文件中的安装程序;
- Autopackage。
我不喜欢第一种方法(RPM和DEB包),因为我不想为不同的Linux发行版维护不同的软件包。
什么是在Linux上分发二进制应用程序的最佳方法?
我刚完成了一个从Windows移植到Linux的应用程序。
我需要创建该应用程序的安装程序。
该应用程序不是开源的,所以我应该分发该应用程序的二进制文件(可执行文件、几个.so文件、帮助文件和图像)。
我找到了几种方法来做到这一点:
- RPM和DEB包;
- .sh文件中的安装程序;
- Autopackage。
我不喜欢第一种方法(RPM和DEB包),因为我不想为不同的Linux发行版维护不同的软件包。
什么是在Linux上分发二进制应用程序的最佳方法?
我已经和商业产品一起做过这个事情几次了,我认为最好的解决方法是使用每个支持平台的本地安装程序。其他任何方式都会给最终用户带来不愉快的体验,在实践中,您必须在要支持的每个平台上进行测试,因此对于每个平台来维护软件包并不是一个重大负担。那种可以“只需工作”在每个平台上(包括您从未听说过的平台)的二进制文件的想法并不奏效。
我的建议是,您最初选择一到两个平台进行支持(我的建议是Red Hat和Ubuntu),然后让用户需求推动创建更多的安装包。也许可以公布您愿意为额外的平台提供支持,以涵盖打包和测试的时间和精力的适当费用。如果某个平台被证明非常不同,则您可能需要为持续支持收取更高的费用。
哦,我无法过度强调虚拟机在这种情况下的价值。您需要为每个支持的平台构建虚拟机,并且可能需要为每个平台构建多个虚拟机来方便测试不同的配置。
这里有很多好的答案(包括我的:))这里。虽然它更多地涉及二进制兼容性(这确实需要您担心)。
对于安装程序,我建议使用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中没有这样的函数。仍然不确定我是否破坏了什么 :))。<?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,但命令行在任何地方都可用。
还可以查看一些现有的提要以获取灵感。
在Debian操作系统中安装RPM包,在RHEL操作系统中安装APT包是可能的。
如果您将要静态链接这个程序,或者只与您将在软件包中分发的库动态链接,那么您如何分发它并不重要。最简单的方法是使用tar.gz文件,这样就可以工作。
然而,如果它是与系统库动态链接的,特别是如果它对客户端其他应用程序共享的动态库有依赖关系,则需要进行RPM、APT或两者兼备。
.deb
软件包一起使用的软件包管理系统。 - Pascal Thivent您可能想尝试InstallBuilder。它是跨平台的(可以在Windows、Linux、Mac OS X、Solaris和几乎任何其他Unix平台上运行)。它被Intel、Motorola、GitHub、MySQL、Nokia/Trolltech以及许多其他公司使用,所以您将处于良好的公司 :) 除了二进制安装程序之外,它还可以创建跨发行版的RPM和DEB软件包。
InstallBuilder是商业软件,但我们为开源程序提供免费许可证,并为mISV或独立开发人员提供非常优惠的折扣,请给我们写信联系。
没有一种普遍而言的最佳方式。 将二进制文件打成tar.gz格式,应该可以正常运行。
我在工作中也研究过这个问题,我必须同意没有一个“最好的方法”。如果您的应用程序以源代码形式分发,则我会选择使用打包成tar.gz的make/configure方法。在Linux世界中,这似乎是相当普遍的。
了解如何处理此问题的好方法是查看较大组织如何分发其二进制文件。