我刚刚完成从Windows移植到Linux的应用程序 我必须创建应用程序的安装程序 该应用程序不开源=>我应该分发应用程序的二进制文件(可执行文件,几个.so文件,帮助文件和图像)。
我找到了几种方法:
- RPM and DEB packages;
- installer in .sh files;
- Autopackage。
我不喜欢第一种方法(RPM和DEB包),因为我不想为不同的Linux发行版保留不同的包。
为Linux分发二进制应用程序的最佳方式是什么?
答案 0 :(得分:21)
经过几次商业产品,我认为最好的答案是为每个支持的平台使用本机安装程序。其他任何事情都会给最终用户带来不愉快的体验,实际上你必须在你想要支持的每个平台上进行测试,因此维护每个平台的包装并不是一个很大的负担。您可以创建一个可以在每个平台上“正常工作”的二进制文件的想法,包括一些您从未听说过的平台,只是真的不能很好地工作。
我的建议是你选择一个或两个平台来支持最初(Red Hat和Ubuntu将是我的建议),然后让用户要求驱动创建额外的安装包。也许让人知道您愿意支持其他平台,只需支付适当的费用即可节省您在该平台上打包和测试的时间和精力。如果平台被证明是非常不同的,您可能需要为持续支持收取更多费用。
哦,我不能过分强调虚拟机对于这样的场景的价值。您需要为您支持的每个平台构建VM,并且每个平台可能需要多个VM,以便于测试不同的配置。
答案 1 :(得分:3)
有很多好的答案(包括我的:) :) here。虽然这更多是关于二进制兼容性(你需要担心)。
对于安装程序,我建议使用autopackage(我们成功发布了几个版本的软件),他们已经完成了“installer.sh”部分(例如桌面集成)。
您必须小心并测试您的升级方案和内容,具体取决于您的软件包结构的复杂程度,但整体而言它非常整洁。我在1.2.6中修复了一些带有依赖性处理的错误,所以应该没问题。
更新:原始问题已被删除,因此请在此处重新发布完整答案,忽略所有对自动包装的引用,这些引用已合并到Listaller,不确定相关部分是否存活。
对于可能在发行版中可用的标准库(如crypto ++,pthreads等) - 动态链接并告诉用户从他们的发行版存储库中获取它们。或者如果可行则静态链接。
对于你必须控制版本的奇怪的库(例如,如果你想在敌人的侏儒的领土上部署Qt4应用程序),自己编译它们并安装到只有你的应用知道的私人地点。
永远不要将私有库安装到标准位置,除非您确定不会干扰您支持的所有发行版的软件包系统。 (而且他们也不能干涉你)。
使用rpath而不是LD_LIBRARY_PATH,并为所有二进制文件和所有相互引用的dll正确设置它。您可以将二进制上的rpath设置为“$ ORIGIN; $ ORIGIN /../ lib; / opt / my / private / libs”,并让链接器在任何标准路径之前搜索这些位置。 (我认为必须使用setome链接器标志来工作)。确保在你的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实现充满了bug和怪癖。
对于实际安装,您可以提供各种本机软件包(rpm,deb和更多),或者推出自己的安装程序,或者找到适用于绕过本机软件包管理器的所有发行版的安装程序。我们成功地使用了Autopackage(同样是制造APbuild的人)。
答案 2 :(得分:3)
您可能想尝试InstallBuilder。它是跨平台(在Windows,Linux,Mac OS X,Solaris和几乎任何其他Unix平台上运行)。它被英特尔,摩托罗拉,GitHub,MySQL,诺基亚/奇趣科技和many other companies使用,因此您将成为一个好公司:)除了二进制安装程序,它还可以创建跨发行版RPM和DEB包。
InstallBuilder是商业版,但我们为开源程序提供免费许可,并为mISV或独立开发者提供非常大的折扣,只需给我们留言。
答案 3 :(得分:2)
没有最佳方式(一般来说)。 tar.gz应该有效的二进制文件。
答案 4 :(得分:2)
我告诉你一个额外的可能性,虽然我不知道它的状态:Loki installer。 Loki是一家为Linux提供移植视频游戏的公司。它在2002年下降,但安装程序可用。
InstallShield is also available for linux。虽然不知道现状。
虽然很多人建议你使用tar.gz,但请不要。我假设您希望为用户提供安装过程的愉快体验。 tar.gz是您可以做的最低级别,低质量,低可用性选择之一。它可以在任何地方使用,因为它基本上没有任何东西,如你所知。
freedesktop.org和LSB的人们非常清楚在哪里放东西。你需要的是一个友好的程序来做到这一点。 autopackage imho有数字(我喜欢它),但尽管它的年龄,我还没有看到一个单独的程序作为自动包装分发。
仔细评估它,但不要忽略成为支持它的动力的一部分的机会,因为它不受欢迎。如果它适合您,并且它适用于您的用户,其他一切都无关紧要。
答案 5 :(得分:2)
使用二进制文件创建.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,但命令行可以在任何地方使用。
还要看一些existing feeds的灵感。
答案 6 :(得分:1)
可以在Debian上安装RPM,在RHEL上安装APT。
如果您要静态链接此程序,或仅动态链接您将在程序包中分发的库,那么分发它的方式并不重要。最简单的方法是tar.gz,这样可行。
OTOH如果它与系统库动态链接,特别是如果它依赖于将与客户端的其他应用程序共享的动态库,那么你需要做RPM,APT或两者兼而有之。
答案 7 :(得分:1)
您可能还需要查看AppImage(https://appimage.org/)。其概念是产生一个二进制文件,用户下载,设置可执行文件并直接运行。无需安装,无需安装依赖项(因为应用程序映像通常包括除glibc之类的基本内容以外的所有依赖项)。这带来了非常好的用户体验!
一些缺点:
答案 8 :(得分:1)
今天,我还将研究一些流行发行版中包含的Snapcraft和Flatpak。我explored other options,这才是最适合我的。特别是Flatpak还帮助我了解了要遵循的标准Linux桌面约定。
答案 9 :(得分:0)
我在工作中也研究了这个问题,我不得不同意这里没有“最好的方法”。如果您的应用程序是作为源分发的,那么我将使用tar.gz中打包的make / configure方法。这似乎在Linux世界中相当普遍。
了解如何做的一个好方法是查看更大的组织,看看他们如何分发他们的二进制文件。