跳到主要内容
Deno 2.4 已发布,带来 deno bundle、字节/文本导入、OTel 稳定版等新功能
了解更多
Deno helps tea distribute software across all platforms.

Homebrew 创始人如何使用 tea 和 Deno 简化软件分发

  • Max Howell

这是一篇由 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 模块可以提供帮助,例如 pkgnexe,但它们需要额外的配置,特别是对于 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 成为一个出色的技术合作伙伴。我们都是现代的、精神上的继承者,挑战现状,旨在重新定义事物的完成方式。

您是否在生产环境中使用 Deno 或 tea?请在 TwitterDiscord 上告诉我们。