Homebrew 的创建者如何使用 tea 和 Deno 简化软件分发
这是一篇由 Max Howell 撰写的客座博客,他是 Homebrew 的创建者以及 tea 的创始人兼 CEO。
构建开源软件的最大挑战之一是分发——构建和发布过程,以及能够支持所有主要平台等等。我们正在使用 tea 解决这个问题。
tea 是 Homebrew 的精神继承者,是一个命令行通用解释器、环境管理器和依赖管理器,它使用区块链技术来补偿开源软件维护者。自 2022 年 11 月推出以来,tea 已拥有超过 10,000 名用户,并且还在增长。
deno compile
让共享软件变得容易
作为 Mac 上最流行的软件包管理器之一 Homebrew 的创建者,我了解到采用开源软件的最大瓶颈是分发。我选择用 Ruby 编写 Homebrew,因为它与 OS X 捆绑在一起,这意味着所有用户只需克隆存储库即可。在开发 tea 时,我深受 Deno 的单二进制方法启发。感谢 deno compile
,我能够用 TypeScript 编写并将其编译为单个二进制文件。
共享 Node 或 TypeScript 应用程序通常很麻烦——用户需要安装 Node,克隆或下载仓库,运行 npm install
等。虽然有一些 npm 模块可以提供帮助,例如 pkg
或 nexe
,但它们需要额外的配置,尤其是对于 TypeScript 项目。
使用 deno compile
,您可以将您的应用程序编译成一个可执行文件,只需一行代码即可在主要平台上运行。
用户可以下载适合其平台的二进制文件,并从他们想要放置的任何位置运行 tea
$ curl -Lo tea https://tea.xyz/$(uname)/$(uname -m)
$ chmod u+x ./tea
$ echo '# tea *really is* a standalone binary' | ./tea --sync glow
installing charm.sh/glow
pantries sync’d ⎷
tea really is a standalone binary
虽然 deno compile
在我们的分发中非常重要,但它仍然是我们更大的构建和发布过程中的一小部分。
使用 Deno 简化构建基础设施
像 GitHub 上的大多数软件一样,我们使用 GitHub Actions 进行构建和发布过程。所有相关的脚本都用 TypeScript 编写并使用 Deno 运行,并通过大量的 GitHub .yaml
文件粘合在一起。
Deno 强大的内置工具链,用于代码检查、类型检查、测试和编译,减少了大量的开销。
— Max Howell
以下是我们的 构建和发布工作流程 的主要步骤:
- 检查此版本是否已发布
- 检出仓库
- 使用
deno test
运行测试 - 上传覆盖率
- 使用
deno lint
进行代码检查 - 下载工件并运行
deno compile
- 捆绑 src/ 上传
- 发布到各种平台
deno compile
可以接受任何 TypeScript 或 JavaScript 文件,并将其编译为可在 Windows x64、macOS x64、macOS ARM 和 Linux x64 上运行的单个二进制可执行文件。Deno 的工具链还意味着我们花更少的时间评估和配置第三方框架,而将更多的时间用于构建产品。
可组合、自包含的 Deno 脚本作为构建基础设施
tea 使户能够轻松访问和下载任何开源软件到任何平台。将下载任何软件包变得像魔法一样只需一个按键,这其中涉及到许多挑战,例如获取工件、标记、打包和压缩软件包等等。我们通过使用可组合、自包含的 Deno 脚本作为构建基础设施,简化了这个复杂的过程。
Deno 的 URL 导入系统是现代的、简单的、Web 兼容的,并且没有引入现有软件包管理系统的累赘。
– Max Howell
所有这些都发生在我们的构建基础设施仓库 teaxyz/brewkit
中,它是一组 Deno 脚本和 yaml
文件。Deno 的 Web 兼容性(请参阅 通过 URL 导入)和去中心化的依赖处理方式意味着每个脚本都不需要单独的依赖清单(例如“package.json”)。它们是自包含和可组合的——每个都可以在任何地方运行并获得一致的结果,可以单独执行,导入到另一个脚本中,或者在 GitHub Action 过程中串行执行等等——这使得它们易于调试、维护和更新。
例如,查看 这个为 GNU Privacy Guard 压缩软件包的脚本,它使用 yaml
frontmatter 列出依赖项、传递给 deno run
的标志以及特定的环境变量。
Deno 🤝 tea
我们很高兴使用 Deno 构建 tea。除了本文中提到的要点外,tea 和 Deno 之间还有许多相似之处,这使得 Deno 成为一个出色的技术合作伙伴。我们都是现代的、精神上的继承者,挑战现状,旨在重新定义事物的完成方式。