发布Ubuntu版本

6

我已经编写了几个 C++ 软件,想要在 Ubuntu 上发布。有哪些方法可以使用?您能推荐一种吗?是构建 .deb 文件并为其设置 apt repo 最好的方法吗?make install 方式怎么样?这被认为是一种可接受的软件安装方式吗?

对我来说,最简单、对用户来说也可能最透明的方法是只需拥有一个 Github 存储库,在其中运行 make install 即可一次性安装所有程序。

我总是将二进制文件安装到 /usr/bin 中吗?

其中一个程序包含Python 3库代码,应该安装在/usr/lib/python3/dist-packages吗?(我不想创建一个pip软件包,那样会使安装更加困难--也会浪费更多的时间。)该程序还包含Python 3示例/教程,供用户调整和学习,我应该把它们安装在哪里?我要创建一个~/my-prog-tutorial-dir/来放置它们吗?如果是这样:我应该如何命名该目录? 编辑:如果我只是发布静态链接的二进制文件夹,将会出现什么问题?libc?通常在Ubuntu LTS之间会有哪些主要应用程序API发生变化?我只使用pthread、X11和OpenGL,因此我认为静态链接的二进制文件夹可能是一个相当稳定的选择?

并非每个人都有权限安装到 /usr/bin。因此,您的默认位置可能是 /usr/bin,但您应该使其足够可配置以使用其他位置。大多数 C++ 源使用另一层构建工具(autotools),并且软件是通过 ./configure && make && make test && sudo make install 安装的。 - Martin York
1
例如,我将我的软件作为普通的归档可执行文件分发,可以从官方网站下载。 - ForceBru
@ForceBru:这对你有用吗?你的软件通常在LTS上运行吗?你有什么依赖关系?请将其作为答案写出来。 - Jonas Byström
我刚读了你的编辑。当你发布一个二进制文件时,你必须关注ABI以及实现如何与系统的其余部分进行交互,而不是API。在这方面,OpenGL非常稳定,静态链接它没有意义。此外,如果你静态链接它,你会使用什么实现呢?我对X11和pthread的稳定性没有清晰的看法。C++本身可能会有问题,但在你的情况下,静态链接libstdc++应该足够了,除非你提供C++库。 - Giulio Paci
3个回答

2
一般来说,构建二进制软件包可以使用户更轻松地安装和更新您的软件。Python软件包也是如此。通常有工具可以从pip软件包生成apt软件包,因此您可以将您的Python代码列为二进制软件包的依赖项。
您可能认为打包和安装程序是浪费时间,但仅提供源代码分发会浪费用户的时间。用户不想不断检查GitHub以获取新版本,并且他们通常不想安装所有构建依赖项,如果他们只想使用您的软件。如果您的软件面向开发人员,则可能会减少这种问题,但这仍然是用户必须经历的额外工作。
至于示例,一般约定是将其放在 /usr/share/doc/myprogram/samples 或您的Python软件包中的一个samples目录中。

1

最佳的Ubuntu软件发布方式取决于软件本身和其目标受众,正如Miles Budnek已经指出的那样。

您的目标是降低软件使用的障碍。如果您的目标用户是软件开发人员(即,您开发的源文件被其他人编辑),或者您正在开发一段代码以供其他项目使用(例如gnulib),那么最好只提供源代码和文档。

在我目前想到的任何其他情况下(包括当您的目标用户是开发人员时),提供预编译的二进制文件是更好的选择。在这种情况下,最优解是将软件放入Ubuntu中。在这种情况下,如何将我的软件放入Ubuntu?提供了许多有用的信息,正如Mark K所建议的那样。

将软件加入Debian或Ubuntu可能会很困难,需要大量时间(您必须遵守许多可能不知道的策略并找到赞助商),您很快就会了解到一个关键点是为您的软件使用体面且流行的构建系统(例如,autotools,cmake,distutils等),如Debian Upstream Guide中所述。遵守该指南对其他发行版的用户也有益处。
一般而言,我建议按照以下顺序进行:
1. 提供源代码; 2. 使用常见的构建系统(从系统管理员的角度来看,即安装软件的人,在我的经验中,对于Posix系统,autotools效果最佳); 3. 创建二进制包(请记住,您必须维护它,否则您的用户可能会遇到二进制不兼容性); 4. 将软件包添加到私有存储库(我建议使用aptly执行此任务); 5. 尝试将软件包放入所选的发行版中(请记住维护成本)。
另一个选项是提供静态链接版本,但我不建议这样做。这会降低二进制不兼容性的可能性,但增加了修复错误(例如,如果错误在依赖项中)和安全性的成本,如this所述及其后续评论中所解释的那样。避免静态链接的另一个原因是如果存在多个相同ABI的实现,为了利用硬件加速(例如OpenGL),但您也可以混合使用静态和动态链接。
最后,您还可以提供一个容器,例如docker,以运输您的软件及其所有依赖项:您的用户只需使用docker即可非常便携地运行您的应用程序。然而,在大多数情况下,这可能过于复杂,并且它是否是实际解决方案取决于您的应用程序和目标受众。

1

有人要求我在答案中扩展我的评论,所以我这样做了。

我谈论的项目名为Woodpecker hash Bruteforce,我将其作为纯归档可执行文件分发给Mac OS、Windows和Linux。

Woodpecker hash Bruteforce只有两个依赖项需要我关心(用户不需要安装任何东西):OpenSSL和Botan-用于哈希的库。我在我的Mac上有两个虚拟机来构建项目和几个脚本来自动化这个过程。我使用Docker(与VirtualBox合作)和VMware Fusion。

上面我说用户不需要担心任何第三方库,因为一切都与可执行文件静态链接:您只需从官方网站下载适当的文件,解压缩(如果需要),sudo chmod +x可执行文件就可以了!

这适用于包括Ubuntu(这是我进行构建的地方)和Kali Linux在内的任何Linux版本。


这听起来是一个完美简单而整洁的发布方式!我在网上读到过很多次,人们在运行预编译的Linux二进制文件时遇到了麻烦。这是过去的事情了吗?还是大多数适用于动态链接的二进制文件?我假设你只构建32位x86版本?现在大多数人都使用x86_64硬件,但也许对你的应用程序来说这并不重要? - Jonas Byström
@JonasByström,嗯,我从来没有在各种Linux上运行我的程序遇到过任何问题。目前,我只为Linux构建32位二进制文件,因为没有人要求64位的,但是这可以通过我的控制构建过程的脚本中的另一行来完成。 - ForceBru
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Giulio Paci
@GiulioPaci:你和ForceBru的答案以及搜索只揭示了有关动态优势的教条,而由于静态链接非常容易且稳定,这是我的选择。 - Jonas Byström
@ForceBru:我的意思是你不会永远进行维护。但是你也在针对多个发行版,而问题是关于Ubuntu的。如果问题是“发布Linux闭源软件的最佳方式是什么?”,那么你的答案比我的更正确。在Ubuntu的限制下,只有在没有计划维护工作的情况下,构建Debian软件包才不会增加太多工作量,这时你的答案才更正确。此外,如果涉及LGPL库,则使用静态链接遵守许可证会给发布过程增加复杂性,因为你必须授予用户重新链接的可能性。 - Giulio Paci
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接