跳至主要内容
Deno 2 终于来了 🎉️
了解更多
Deno helps tea distribute software across all platforms.

Homebrew 创建者如何利用茶和 Deno 简化软件分发

  • Max Howell

这是一篇由 Max Howell 撰写的客座博客文章,他是 Homebrew 的创建者,也是 tea 的创始人兼首席执行官。

构建开源软件的最大挑战之一是分发,包括构建和发布流程、能够支持所有主要平台等等。我们正在使用 tea 来解决这个问题。

tea 是 Homebrew 的精神继承者,是一个命令行通用解释器、环境管理器和依赖项管理器,它利用区块链技术来补偿开源软件维护者。自 2022 年 11 月推出以来,tea 已拥有超过 10,000 名用户,并且正在不断增长。

deno compile 使共享软件变得容易

作为 Mac 最流行的软件包管理器之一 Homebrew 的创建者,我明白采用开源软件的最大瓶颈是分发。我选择用 Ruby 编写 Homebrew,因为它与 OS X 捆绑在一起,这意味着所有用户只需要克隆存储库即可。在茶的开发中,我深受 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 强大的内置工具链用于 linting、类型检查、测试和编译,可以节省大量的开销。

—— Max Howell

以下是我们 构建和发布工作流程 的主要步骤:

  • 检查此版本是否已发布
  • 签出存储库
  • 使用 deno test 运行测试
  • 上传覆盖率
  • 使用 deno lint 进行 linting
  • 下载工件并运行 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 前置信息来列出依赖项、传递给 deno run 的标志以及特定的环境变量。

Deno 🤝 tea

我们很高兴使用 Deno 来构建 tea。除了本文中提到的要点之外,tea 和 Deno 之间还有许多相似之处,这使得 Deno 成为一个很棒的技术合作伙伴。我们都是现代的、精神上的继承者,挑战着现状,旨在重新定义事物的完成方式。

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