开发者生态
morning
我讨厌为 Linux 打包我的软件
2026-08-12
1 阅读
约6分钟阅读
_sinelaw_
字号:
我讨厌为 Linux 打包我的软件我想要的只是让 Fresh 易于安装,适合每个人、任何地方 - 这能有多难? Windows 和 macOS 还不错,因为它们相对统一。对于 Windows,我使用 winget - 丑陋,但有效(一旦我克服了最初的头痛)。对于 macOS,我现在使用自制程序,这并不理想,但设置并不难。一旦我花时间正确打包它,我可能会转向更原生的签名 Mac 应用程序。这两种解决方案都适用于现代 Windows 和 macOS 用户。 Linux 则不同。我首先将 Fresh 作为 npm 包发布。这感觉很丑陋,惹恼了 hn 上的一些人,但也存在真正的问题:安全性 - npmjs 存在多次漏洞,我想晚上睡得更好。不通用 - 许多用户没有安装 npm,为什么他们只是为了安装 Fresh 而安装 npm?奇怪的安装程序 - npm 安装流程,它实际上是您从 npmjs 获得的脚本,该脚本会转到 github 并为您的计算机下载正确的二进制工件。每次要更新时都必须执行此操作。因此,我听取了恼怒的人们的反馈,并且(在几位仁慈的贡献者的帮助下)我们继续为“一切”创建包:crates.io 上的 rust 货物(以及 Cargo-binstall)un-distros,如 AppImage 和 Flatpak deb rpm AUR(Arch Linux),两个变体 - 源代码构建和预构建的二进制文件 -bin package nix mise homebrew for linux(wtf?)npm / npx Terra Gentoo GURU Plus 我正在以 tarball 的形式发布预构建的二进制文件。你可以想象这一切是多么脆弱。每次发布后,我想知道我是否会在众多渠道之一中遇到一些问题。这些解决方案中的每一种都适用于某些用户,但没有一个适用于所有用户。它们都有缺点。 “为什么不使用nix?!” 因为很多人没有安装 NIX,也不想只是为了使用我的应用程序而安装它。我支持 nix 作为一种方法,但它并不适合所有人。 “就用 Flatpak 吧!” 我确实发布了 Flatpak,但实际上我正在反对它。它专为独立的沙盒桌面 GUI 应用程序而设计,我将发布一个基于终端的 TUI,允许您在计算机和网络中横冲直撞。我正在传递一些可怕的“不良做法”标志以使其发挥作用。 Flatpak 沙箱不太适合。 “只需使用AppImage!” 我确实发布了一个AppImage,但由于按需安装squashfs FUSE,它的运行速度非常慢,这使得启动时间慢得令人无法接受。我希望我的程序立即启动,在技术上尽可能快。为了使启动时间合理,我的安装程序脚本进行了一次可怕的黑客攻击,将squashfs内容提取到某处并删除AppImage。如果您愿意,您仍然可以只运行 AppImage,但启动速度会非常慢。在这两种情况下都需要安装 FUSE。为什么我的应用程序需要 FUSE?!另外,由于我的二进制文件需要一些最小的 libc 版本,因此它实际上并不是普遍可移植的(因此对于 2-3 年的发行版来说它可能不起作用),因此我不妨使用静态链接并删除 AppImage。出于某种原因,我认为单独使用 AppImage 可以解决这个可移植性问题。最后,由于各种原因,很多人对 AppImage 和 Flatpak(以及 Snap)抱有不好的看法,甚至拒绝使用它们。我输了。 Debian 家族的痛苦 正如在其他 hn 讨论中所解释的,我没有抽出时间将我的 .deb 作为 Debian(和 Ubuntu)官方软件包推送,因为它要求所有(许多)rust 依赖项也是 Debian 软件包。这项政策有很多充分的理由——任何包的完全可复制和独立的构建,减少供应链地狱等等——但还有很多工作要做。我将如何跟上 - 我的每一个直接依赖项都需要在 Debian 上针对每个安全问题等进行重新更新。我没有时间这样做。我不能只将所有 dep 作为源提供到我的 deb 源包中,这违反了政策。另一个有趣的轶事是我确实想支持运行例如较旧的 Ubuntu(我猜是任何较旧的发行版) - 但它们具有较旧的 libc,这意味着我为较新的 ubuntu 构建的版本无法安装在较旧的发行版上,因为它们在二进制加载时因链接错误而失败。因此,我必须构建一个旧的 Ubuntu 容器映像,并将其未修补的软件包继承到我的构建中 - 或者完全删除这些用户。这两种选择都站不住脚。 .deb / .rpm 没有自动更新因为这太令人头痛了,我没有让我的包 .deb (或 .rpm )被官方来源接受。因此,安装这些软件包的人在运行系统的本机软件包更新机制、apt-get Upgrade 或同等机制时不会获得自动更新。如果有一个快速的无服务器解决方案,您只需输入一个 URL 即可查找单个软件包的较新版本,并且 apt 和 dnf 都会记住这一点并更新软件包,那就太好了。我很清楚在这里做的“正确”的事情是拿到我的包
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱