#挑战30天在头条写日记#
Turbo 是用于前端开发的下一代工具链,用 Rust 编写。它由 3 个主要部分组成:
Turborepo 是一个针对 JavaScript 和 TypeScript 代码库优化的智能构建系统。
您的代码库的任务(例如lint,build和test)运行得不够快。Turborepo 使用缓存来增强您的本地设置并加速您的 CI。
Turborepo 利用先进的构建系统技术来加速本地计算机和 CI/CD 上的开发。
永远不要做两次同样的工作
Turborepo 会记住您运行的任何任务的输出 - 并且可以跳过已经完成的工作。
最大程度的多任务处理
您运行任务的方式可能没有优化。Turborepo 通过智能调度来加速它们,最大限度地减少空闲 CPU。
Turborepo 可以在任何项目中使用,以加快package.json.
安装后turbo,您将能够package.json从turbo包管理器运行所有任务。
通过正确配置turbo.json,您会注意到缓存如何帮助您的任务运行得更快。
快速开始
如果您还没有,请创建一个新应用程序:
npx create-next-app@latest
turbo全局安装:
pnpm add turbo --global
有关安装的更多详细信息,请参阅安装 Turborepo
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。
要了解这是如何实现的,请查看我们的核心概念文档。
turbo dev
您会注意到您的dev脚本启动了。您可以用来turbo运行package.json.
每个 JavaScript 或 TypeScript 代码库都需要运行package.json脚本,例如build、test和lint。在 Turborepo 中,我们将这些任务称为。
Turborepo 可以缓存任务的结果和日志 - 从而为缓慢的任务带来巨大的加速。
代码库中的每个任务都有输入和输出。
假设您build使用 Turborepo 运行一个任务turbo run build:
Turborepo 在创建哈希时考虑了很多信息:依赖图、它所依赖的任务、源文件、环境变量等等!
假设您再次运行该任务而不更改其任何输入:
从缓存中恢复文件和日志几乎是即时发生的。这可以将构建时间从几分钟或几小时减少到几秒或几毫秒。尽管具体结果会根据代码库依赖关系图的形状和粒度而有所不同,但大多数团队发现,通过 Turborepo 的缓存,他们可以将每月的总体构建时间减少大约 40-85%。
在某些环境中,您不想写入缓存输出。要禁用缓存写入,请附加--no-cache到任何命令。例如,这将在所有工作区中运行dev(以及它的所有任务dependsOn),但它不会缓存输出:
turbo run dev --no-cache
请注意,--no-cache禁用缓存写入但不会禁用缓存读取。如果要禁用缓存读取,请使用该--force标志。
您还可以通过将pipeline.
{ "$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决定给定任务的缓存命中与未命中的构成。好问题!
首先,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 上构建和托管应用程序,一旦您使用,远程缓存将自动代表您设置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 有很多优势,但它们难以扩展。每个工作区都有自己的测试套件、自己的 linting 和自己的构建过程。一个单一的 monorepo 可能有数百个任务要执行。
Turborepo 解决了 monorepo 的扩展问题。我们的远程缓存存储您所有任务的结果,这意味着您的 CI 永远不需要重复执行相同的工作。
在单一存储库中任务调度可能很困难。Imagine需要在所有工作区中yarn build运行。yarn testTurborepo可以在所有可用内核上以最大速度安排您的任务。
Turborepo 可以逐步采用。它使用package.json您已编写的脚本、已声明的依赖项以及单个turbo.json文件。您可以将它与任何包管理器一起使用,例如npm、yarn或pnpm。您只需几分钟即可将其添加到任何单一仓库。
Turborepo不处理软件包安装。npm像或pnpm之类的工具yarn已经做得非常出色了。但它们运行任务的效率很低,这意味着 CI 构建速度很慢。
我们建议Turborepo 运行您的任务,并由您最喜欢的包管理器安装您的包。
https://github.com/vercel/turbo
页面更新:2024-05-18
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号