Turbo:用于前端开发的下一代工具链,用 Rust 编写

#挑战30天在头条写日记#

Make Ship Happen

Turbo 是用于前端开发的下一代工具链,用 Rust 编写。它由 3 个主要部分组成:


Turborepo 快速入门

Turborepo 是一个针对 JavaScript 和 TypeScript 代码库优化的智能构建系统。

您的代码库的任务(例如lint,build和test)运行得不够快。Turborepo 使用缓存来增强您的本地设置并加速您的 CI。

特征

Turborepo 利用先进的构建系统技术来加速本地计算机和 CI/CD 上的开发。

永远不要做两次同样的工作

Turborepo 会记住您运行的任何任务的输出 - 并且可以跳过已经完成的工作。

最大程度的多任务处理

您运行任务的方式可能没有优化。Turborepo 通过智能调度来加速它们,最大限度地减少空闲 CPU。

将 Turborepo 添加到您现有的项目中

Turborepo 可以在任何项目中使用,以加快package.json.

安装后turbo,您将能够package.json从turbo包管理器运行所有任务。

通过正确配置turbo.json,您会注意到缓存如何帮助您的任务运行得更快。

快速开始

如果您还没有,请创建一个新应用程序:

npx create-next-app@latest

turbo全局安装:

pnpm add turbo --global

有关安装的更多详细信息,请参阅安装 Turborepo

turbo.json在新存储库的底部添加一个文件:

有关配置 的更多信息turbo.json,请参阅配置选项文档。

turbo.json

{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"outputs": [".next/**", "!.next/cache/**"]
},
"lint": {}
}
}

编辑.gitignore

添加.turbo到您的.gitignore文件。CLI 使用这些文件夹来保存日志和某些任务输出。

+ .turbo

尝试运行build并lint使用turbo:

turbo build lint

这同时build运行。lint

在不对代码进行任何更改的情况下,尝试build再次运行lint:

turbo build lint

您应该看到如下终端输出:

Tasks: 2 successful, 2 total
Cached: 2 cached, 2 total
Time: 185ms >>> FULL TURBO

恭喜 -您刚刚在 200 毫秒内完成了构建和 lint。

要了解这是如何实现的,请查看我们的核心概念文档。

尝试dev运行turbo:

turbo dev

您会注意到您的dev脚本启动了。您可以用来turbo运行package.json.

缓存任务

每个 JavaScript 或 TypeScript 代码库都需要运行package.json脚本,例如build、test和lint。在 Turborepo 中,我们将这些任务称为。

Turborepo 可以缓存任务的结果和日志 - 从而为缓慢的任务带来巨大的加速。

缺少缓存

代码库中的每个任务都有输入和输出。

假设您build使用 Turborepo 运行一个任务turbo run build:

  1. Turborepo 将评估您任务的输入并将其转换为散列(例如78awdk123)。
  2. 检查本地文件系统缓存是否有匹配的缓存工件(例如./node_modules/.cache/turbo/78awdk123.tar.zst)。
  3. 如果 Turborepo 没有找到计算出的哈希值的任何匹配工件,Turborepo 将执行该任务。
  4. 任务成功完成后,Turborepo会将所有指定的输出(包括文件和日志)保存到新的缓存工件中,并通过哈希进行寻址。

Turborepo 在创建哈希时考虑了很多信息:依赖图、它所依赖的任务、源文件、环境变量等等!

命中缓存

假设您再次运行该任务而不更改其任何输入:

  1. 散列将是相同的,因为输入没有改变(例如78awdk123)
  2. Turborepo 将找到具有匹配哈希值的缓存工件(例如./node_modules/.cache/turbo/78awdk123.tar.zst)
  3. Turborepo不会运行任务,而是重放输出- 将保存的日志打印到stdout并将保存的输出文件恢复到文件系统中各自的位置。

从缓存中恢复文件和日志几乎是即时发生的。这可以将构建时间从几分钟或几小时减少到几秒或几毫秒。尽管具体结果会根据代码库依赖关系图的形状和粒度而有所不同,但大多数团队发现,通过 Turborepo 的缓存,他们可以将每月的总体构建时间减少大约 40-85%。

关闭缓存

在某些环境中,您不想写入缓存输出。要禁用缓存写入,请附加--no-cache到任何命令。例如,这将在所有工作区中运行dev(以及它的所有任务dependsOn),但它不会缓存输出:

turbo run dev --no-cache

请注意,--no-cache禁用缓存写入但不会禁用缓存读取。如果要禁用缓存读取,请使用该--force标志。

您还可以通过将pipeline..cache配置设置为来配置特定任务以跳过写入缓存false:

{  "$schema": "https://turbo.build/schema.json",  "pipeline": {    "dev": {      "cache": false,      "persistent": true    }  }}

强制覆盖缓存

相反,如果您想禁用读取缓存并强制turbo重新执行之前缓存的任务,请添加以下--force标志:

# Run `build` npm script in all workspaces ignoring the cache.turbo run build --force

请注意,--force禁用缓存读取但不会禁用缓存写入。如果要禁用缓存写入,请使用该--no-cache标志。

日志

不仅turbo缓存任务的输出,它还将终端输出(即组合的stdout和stderr)记录到 ( /.turbo/run-.log)。当turbo遇到缓存的任务时,它将重放输出,就像再次发生一样,但会立即重放,包名称会稍微变暗。

散列

到目前为止,您可能想知道如何turbo决定给定任务的缓存命中与未命中的构成。好问题!

首先,turbo构造代码库当前全局状态的哈希值。这包括:

然后它添加更多与给定工作区任务相关的因素:

一旦turbo在执行中遇到给定工作区的任务,它就会检查缓存(本地和远程)是否有匹配的哈希值。如果匹配,它将跳过执行该任务,将缓存的输出移动或下载到位,并立即重播之前记录的日志。如果缓存(本地或远程)中没有任何内容与计算出的哈希值相匹配,turbo则将在本地执行任务,然后缓存指定的outputs.

给定任务的散列可在执行时作为环境变量供任务使用TURBO_HASH。该值可用于标记输出或标记 Dockerfile 等。


远程缓存

Turborepo 的任务缓存不会重复执行相同的工作,从而节省大量时间。

但有一个问题 -缓存位于您的计算机本地。当您使用 CI 时,这可能会导致大量重复工作:

由于 Turborepo 默认情况下仅缓存到本地文件系统,因此即使所有任务输入都必须turbo run build在每台机器上(由您、您的队友、您的 CI、您的 PaaS 等)重新执行相同的任务 ( )是相同的——这会浪费时间和资源。

单个共享缓存

如果您可以在整个团队(甚至您的 CI)中共享一个 Turborepo 缓存会怎么样?

通过与Vercel等提供商合作,Turborepo 可以安全地与远程缓存(存储任务结果的云服务器)进行通信。

这可以防止整个组织内的重复工作,从而节省大量时间。

远程缓存是 Turborepo 的一项强大功能,但能力越大,责任越大。首先确保正确缓存,并仔细检查环境变量的处理。另请记住,Turborepo 将日志视为工件,因此请注意打印到控制台的内容。

韦尔塞尔

为了当地发展

如果您想将本地 Turborepo 链接到远程缓存,请首先使用您的 Vercel 帐户对 Turborepo CLI 进行身份验证:

turbo login

如果您的远程缓存配置为使用单点登录,您将需要运行 npx turbo login --sso-team=TEAMNAME才能获取具有正确权限的缓存令牌。

接下来,将 Turborepo 链接到远程缓存:

turbo link

启用后,对当前缓存的工作区进行一些更改,并使用turbo run. 您的缓存工件现在将存储在本地和远程缓存中。

要进行验证,请使用以下命令删除本地 Turborepo 缓存:

UNIX赢

rm -rf ./node_modules/.cache/turbo

然后再次运行相同的构建。如果一切正常,turbo不应在本地执行任务,而是从远程缓存下载日志和工件并将其重播给您。

Vercel 构建上的远程缓存

如果您在 Vercel 上构建和托管应用程序,一旦您使用,远程缓存将自动代表您设置turbo。您需要更新构建设置(在新选项卡中打开)构建与turbo.

请参阅Vercel 文档(在新选项卡中打开)了解更多信息。

工件完整性和真实性验证

您可以启用 Turborepo 在将工件上传到远程缓存之前使用密钥对其进行签名。Turborepo 使用HMAC-SHA256您提供的密钥对工件进行签名。Turborepo 将在下载远程缓存工件时验证其完整性和真实性。任何未能验证的工件都将被 Turborepo 忽略并视为缓存未命中。

要启用此功能,请将配置remoteCache上的选项设置turbo.json为包含signature: true. 然后通过声明环境变量来指定您的密钥TURBO_REMOTE_CACHE_SIGNATURE_KEY。

{  "$schema": "https://turbo.build/schema.json",  "remoteCache": {    // Indicates if signature verification is enabled.    "signature": true  }}

自定义远程缓存

您可以自行托管自己的远程缓存或使用其他远程缓存服务提供商,只要它们符合 Turborepo 的远程缓存服务器 API。

您可以通过指定--api和--token标志来设置远程缓存域,其中--api是主机名,--token是承载令牌。

turbo run build --api="https://my-server.example.com" --token="xxxxxxxxxxxxxxxxx"

Monorepos 的 Turborepo

问题

Monorepos 有很多优势,但它们难以扩展。每个工作区都有自己的测试套件、自己的 linting 和自己的构建过程。一个单一的 monorepo 可能有数百个任务要执行。

解决方案

Turborepo 解决了 monorepo 的扩展问题。我们的远程缓存存储您所有任务的结果,这意味着您的 CI 永远不需要重复执行相同的工作。

在单一存储库中任务调度可能很困难。Imagine需要在所有工作区中yarn build运行。yarn testTurborepo可以在所有可用内核上以最大速度安排您的任务。

Turborepo 可以逐步采用。它使用package.json您已编写的脚本、已声明的依赖项以及单个turbo.json文件。您可以将它与任何包管理器一起使用,例如npm、yarn或pnpm。您只需几分钟即可将其添加到任何单一仓库。

Turborepo 不是什么

Turborepo不处理软件包安装。npm像或pnpm之类的工具yarn已经做得非常出色了。但它们运行任务的效率很低,这意味着 CI 构建速度很慢。

我们建议Turborepo 运行您的任务,并由您最喜欢的包管理器安装您的包。

项目地址:

https://github.com/vercel/turbo

展开阅读全文

页面更新:2024-05-18

标签:密钥   工件   源文件   缓存   环境变量   代码   文件   时间   工具   工作   日志

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top