将 Turborepo 添加到您的现有 Monorepo
配置工作区
turbo
是建立在工作区之上的,工作区是一种从单个 Monorepo 包中管理多个包的方式。Turborepo 与所有包管理器的 workspace 实现兼容。有关管理 Turborepo 工作区的更多信息,请参阅 工作区 文档。
您可以根据需要配置工作区,但常见的文件夹结构示例是将应用程序保存在 /apps
文件夹中,将包保存在 /packages
文件夹中。这些文件夹的配置对于每个包管理器来说是不同的。
在您的 Monorepo 的根目录 package.json
文件中指定您的 workspaces
{
"workspaces": ["packages/*", "apps/*"]
}
配置完工作区后,重新运行包管理器的 install
命令。
安装 turbo
全局安装 turbo
。
npm install turbo --global
有关安装的更多详细信息,请参阅 安装 Turborepo
创建 turbo.json
在您的 Monorepo 的根目录中,创建一个名为 turbo.json
的空文件。它将保存 Turborepo 的配置。
{
"$schema": "https://turbo.rust-lang.net.cn/schema.json"
}
创建 pipeline
要定义您的 Monorepo 的任务依赖图,请使用 pipeline
键,该键位于 Monorepo 根目录的 turbo.json
配置文件中。 turbo
会解释此配置,以最佳方式调度、执行和缓存您工作区中定义的每个 package.json
脚本的输出。
在 pipeline
对象中的每个键都是一个 package.json
脚本的名称,可以通过 turbo run
执行。您也可以使用 dependsOn
键在其中指定其依赖项,以及一些与 缓存 相关的其他选项。有关配置管道的信息,请参阅 Pipelines
文档。
在 package.json
的 scripts
列表中未定义指定脚本的工作区将被 turbo
忽略。
{
"$schema": "https://turbo.rust-lang.net.cn/schema.json",
"pipeline": {
"build": {
// A package's `build` script depends on that package's
// dependencies and devDependencies
// `build` tasks being completed first
// (the `^` symbol signifies `upstream`).
"dependsOn": ["^build"],
// note: output globs are relative to each package's `package.json`
// (and not the monorepo root)
"outputs": [".next/**", "!.next/cache/**"]
},
"deploy": {
// A package's `deploy` script depends on the `build`,
// `test`, and `lint` scripts of the same package
// being completed. It also has no filesystem outputs.
"dependsOn": ["build", "test", "lint"]
},
"test": {
// A package's `test` script depends on that package's
// own `build` script being completed first.
"dependsOn": ["build"],
// A package's `test` script should only be rerun when
// either a `.tsx` or `.ts` file has changed in `src` or `test` folders.
"inputs": ["src/**/*.tsx", "src/**/*.ts", "test/**/*.ts", "test/**/*.tsx"]
},
// A package's `lint` script has no dependencies and
// can be run whenever. It also has no filesystem outputs.
"lint": {},
"dev": {
"cache": false,
"persistent": true
}
}
}
给定包的粗略执行顺序基于 dependsOn
键
build
在其上游依赖项运行其build
命令后执行test
在其自身build
命令完成后且包内没有文件系统输出(只有日志)时执行lint
按任意顺序运行,因为它没有上游依赖项deploy
在其自身build
、test
和lint
命令完成后执行。
执行后,整个管道可以运行
npx turbo run deploy
turbo
然后会安排每个任务的执行,以优化机器资源的使用。
编辑 .gitignore
将 .turbo
添加到您的 .gitignore
文件中。CLI 使用这些文件夹来存储日志和某些任务输出。
+ .turbo
确保您的任务工件(您要缓存的文件和文件夹)也包含在您的 .gitignore
中。
+ build/**
+ dist/**
+ .next/**
重新运行您的 npm 客户端的 install
命令以检查您的配置。
构建您的 monorepo
turbo build
根据您的 monorepo 设置,某些工件可能已经正确缓存。在接下来的部分中,我们将展示 turbo
的工作原理,scope
的工作原理,以及如何在此之后使缓存正常工作。
配置远程缓存
Turborepo 速度的关键🔑在于它既懒惰又高效——它尽可能少地工作,并且尽量避免重复之前已经完成的工作。
目前,Turborepo 将您的任务缓存到本地文件系统(即“单人模式”)。但是,如果有一种方法可以利用您的队友或 CI 完成的计算工作(即“合作多人模式”)呢?如果有一种方法可以跨机器传送和共享单个缓存呢?几乎就像您的 Turborepo 缓存的“Dropbox”。
远程缓存已加入聊天。
Turborepo 可以使用一种称为远程缓存的技术来跨机器共享缓存工件,以获得额外的速度提升。
远程缓存是 Turborepo 的一项强大功能,但权力越大,责任越大。请确保您首先正确缓存,并仔细检查环境变量的处理。请记住,Turborepo 将日志视为工件,因此请注意您在控制台中打印的内容。
在本地开发中使用远程缓存
Turborepo 使用 Vercel (opens in a new tab) 作为其默认的远程缓存提供商。如果您想将本地 turborepo 链接到远程缓存,您可以将 Turborepo CLI 与您的 Vercel 帐户进行身份验证
turbo login
然后,将您的 turborepo 链接到您的远程缓存
turbo link
启用后,对您当前正在缓存的包或应用程序进行一些更改,并使用 turbo run
对其运行任务。您的缓存工件现在将存储在本地和远程缓存中。要验证此操作是否成功,请删除本地 Turborepo 缓存
rm -rf ./node_modules/.cache/turbo
再次运行相同的构建。如果一切正常,turbo
不应该在本地执行任务,而是从远程缓存中下载日志和工件,并将它们回放给您。
注意:连接到启用 SSO 的 Vercel 团队时,您必须将团队的 slug 作为参数提供给 npx turbo login
。
turbo login --sso-team=<team-slug>
下一步
您现在已经开始使用 Turborepo,但还有几件事要做