![]() |
1
21
对于商业产品,我已经经历了几次这种情况,我认为最好的答案是为每个支持的平台使用本机安装程序。任何其他东西都会给最终用户带来不愉快的体验,实际上,无论如何,您都必须在希望支持的每个平台上进行测试,因此维护每个平台的包并不是一个真正的负担。你可以创建一个二进制文件,它可以在外面的每一个平台上“正常工作”,包括一些你从未听说过的平台,但这种想法并不能很好地工作。 我的建议是,首先选择一两个平台来支持(Red Hat和Ubuntu是我的建议),然后让用户需求驱动额外安装包的创建。也许你会知道,你愿意支持更多的平台,只需支付少量的费用,就可以在这个平台上打包和测试所花费的时间和精力。如果一个平台被证明是非常不同的,您可能需要为持续的支持收取更多的费用。 哦,对于这样的场景,我不能过分强调虚拟机的价值。您需要为所支持的每个平台构建虚拟机,并且可能需要为每个平台构建多个虚拟机,以便于测试不同的配置。 |
![]() |
2
3
你可能想试试 InstallBuilder .它是跨平台(运行在Windows、Linux、Mac OS X、Solaris和几乎所有其他的UNIX平台上)。它被Intel、摩托罗拉、Github、MySQL、Nokia/Trolltech和 many other companies 因此,您将处于良好的公司中:)除了二进制安装程序外,它还可以创建跨发行版RPMS和DEB包。 InstallBuilder是商业的,但是我们为开源程序提供免费的许可证,为MISV或Solo开发者提供非常大的折扣,只需给我们一条线。 |
![]() |
3
3
有很多好的答案(包括我的) here . 尽管这更多的是关于二进制兼容性(您确实需要担心)。 对于安装程序,我建议使用自动打包(我们成功地发布了几个版本的软件),他们已经完成了“installer.sh”部分以及更多(例如桌面集成)。 根据包结构的复杂程度,您必须谨慎地测试升级场景和内容,但总体上来说,它是非常整洁的。我在1.2.6中修复了一些依赖处理的bug,所以应该没问题。 更新 :原始问题已被删除,因此在此处重新放置完整答案,忽略合并到 Listaller ,不确定相关零件是否存在。 对于可能在发行版中可用的标准库(如Crypto++、pthreads等),动态链接并告诉用户从他们的发行版存储库中获取它们。如果可行,可以静态链接。 对于您必须控制版本的奇怪库(例如,如果您想在敌人地精的领土上部署qt4应用程序),您可以自己编译它们并将其安装到只有您的应用程序知道的私有位置。 除非您确定不会干扰您支持的所有发行版的包系统,否则不要将私有libs安装到标准位置。(他们也不能干涉你)。 使用rpath而不是ld_library_path,并为所有二进制文件和相互引用的所有dll正确设置它。您可以将二进制文件的rpath设置为“$origin;$origin/../lib;/opt/my/private/libs”,并让链接器在任何标准路径之前搜索这些位置。(我想必须设置一些链接器标志才能使源站正常工作)。请确保在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符号。所有。所以,你安装的私人将自然也必须与它一起建造。有时您必须修补第三方libs才能使用旧的符号。(我不得不修补Ruby以返回真正的权限,而不是有效的权限,因为在旧的glib_C中没有这样的函数。仍然不确定我是否破坏了任何东西:)。 要与桌面环境(文件关联、mime类型、图标、开始菜单项等)集成,请使用xdg utils。但是要小心,就像Linux上的所有东西一样,他们不喜欢文件名中的空格:)。确保在每个目标发行版上测试这些东西——XDG实现中充满了错误和怪癖。 对于实际安装,您可以提供各种本机软件包(RPM、DEB和其他一些软件包),也可以部署自己的安装程序,或者找到可以绕过本机软件包管理器在所有发行版上工作的安装程序。我们成功地使用了autopackage(与apbuild的用户相同)。 |
![]() |
4
2
我告诉你一个额外的可能性,尽管我不知道它的地位:在 Loki installer . Loki是一家为Linux做视频游戏移植的公司。它在2002年就坏了,但安装程序是可用的。 InstallShield is also available for linux . 但不知道情况如何。 虽然很多人建议您使用tar.gz,但请不要这样做。我想您希望为您的用户提供一个愉快的安装过程体验。gz是你能做的最低级、低质量、低可用性的选择之一。它在任何地方都能工作,因为它基本上什么都不做,如你所知。 FreeDesktop.org和LSB的人非常清楚该把东西放在哪里。你需要的是一个友好的程序。自动打包imho有数字(我喜欢它),但尽管它的年龄,我还没有看到一个程序作为自动打包分发。 仔细评估它,但不要因为它不受欢迎而错过成为有利于它的动力的一部分的机会。如果它适用于您,并且适用于您的用户,那么其他一切都无关紧要。 |
![]() |
5
2
没有 最佳方法 (一般来说)。 gz二进制文件,应该可以工作。 |
![]() |
6
2
用二进制文件创建一个.tar.bz2存档,然后发布一个提要,如下所示:
用你的GPG密钥签名。你可以在 0install.net 计算摘要并以正确的格式为您添加GPG签名。 然后,把它放在你的网站上的地址 尿嘧啶尿路感染 属性。大多数Linux发行版(如Ubuntu、Fedora、Debian、Gentoo、ArchLinux等)上的任何用户都可以通过以下方式安装和运行程序:
他们的系统还将定期检查更新。对于不同的桌面环境,有各种各样的GUI,但是命令行可以在任何地方工作。 还可以看看 existing feeds 为了灵感。 |
![]() |
7
1
可以在Debian上安装一个RPM,在Rhel上安装一个APT。 如果您打算静态地链接这个程序,或者只动态地链接您将在包中分发的库,那么您如何分发它并不重要。最简单的方法是tar.gz,这是可行的。 o如果它与系统库动态链接,特别是如果它依赖于将与客户机的其他应用程序共享的动态库,那么您需要执行RPM、APT或两者兼而有之。 |
![]() |
8
0
我在工作中也研究过这个问题,我不得不承认,实际上没有“最佳方法”。如果您的应用程序是作为源代码分发的,那么我将使用打包在tar.gz中的make/configure方法。这在Linux世界中似乎相当普遍。 了解该怎么做的一个好方法是看更大的高潮,看看它们是如何分布双星的。 |
![]() |
DaveP · sklearn包找不到模块 6 年前 |
![]() |
Greg. O Hajdu · Java多文件和文件夹层次结构 6 年前 |
![]() |
yearntolearn · R包命名空间 6 年前 |
|
gfmio · TypeScript NPM包的目标体系结构 6 年前 |
![]() |
Qaswed · R指在R CMD检查期间不存在的文件 7 年前 |
![]() |
Fiorelo Odobashi · COTson linux安装 7 年前 |