Homebrew 创始人如何使用 tea 和 Deno 简化软件分发
这是一篇由 Max Howell 撰写的客座博客,他是 Homebrew 的创建者,也是 tea 的创始人兼首席执行官。
构建开源软件的最大挑战之一是分发——构建和发布流程、支持所有主流平台等。我们正在使用 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
- 捆绑源码/上传
- 发布到各个平台
deno compile
可以将任何 TypeScript 或 JavaScript 文件编译成单个二进制可执行文件,该文件可在 Windows x64、macOS x64、macOS ARM 和 Linux x64 上运行。Deno 的工具链也意味着我们花在评估和配置第三方框架上的时间更少,而将更多时间投入到产品构建上。
可组合、自包含的 Deno 脚本作为构建基础设施
tea 让用户能够轻松地在任何平台访问和下载任何开源软件。将任何包的下载变得如同魔法般轻松,只需一次按键即可完成,这涉及许多挑战,例如获取工件、打标签、打包和压缩包等。我们通过使用可组合、自包含的 Deno 脚本作为构建基础设施,简化了这一复杂过程。
Deno 的 URL 导入系统是现代的、简单的、与网络兼容的,并且不会引入现有包管理系统的冗余。
—— Max Howell
所有这些都发生在我们的构建基础设施仓库 teaxyz/brewkit
中,它是一组 Deno 脚本和 yaml
文件。Deno 的网络兼容(参见 按 URL 导入)和对依赖项的去中心化方法意味着每个脚本不需要单独的依赖清单(例如“package.json”)。它们是自包含和可组合的——每个脚本都可以在任何地方以一致的结果运行,可以独立执行,导入到另一个脚本中,或者在 GitHub Action 过程中按顺序执行等等——这使得它们易于调试、维护和更新。
例如,可以查看 这个为 GNU Privacy Guard 压缩包的脚本,它使用 yaml
frontmatter 来列出依赖项,传递给 deno run
的标志,以及特定的环境变量。
Deno 🤝 tea
我们很高兴使用 Deno 构建 tea。除了本文中提到的观点之外,tea 和 Deno 之间还有许多相似之处,这使得 Deno 成为一个出色的技术合作伙伴。我们都是现代的、精神上的继承者,挑战现状,旨在重新定义事物的完成方式。