创建内部包
内部包是工作区的构建块,为你提供了一种强大的方式来在你的仓库中共享代码和功能。Turborepo 利用 package.json 中的依赖关系自动理解内部包之间的关系,并在后台创建一个 包图 来优化你的仓库的工作流。

让我们来创建你的第一个内部包,在你的仓库中使用以下指南来共享数学工具:包的结构 部分和已编译包模式。在下面的步骤中,我们假设你已经使用 create-turbo 创建了一个新仓库,或者正在使用一个类似的结构化仓库。
添加一个 package.json
接下来,为这个包创建 package.json。通过添加这个文件,你将满足内部包的两个要求,使其可被 Turborepo 和你的工作区的其余部分发现。
你的 package.json 中的 name 字段决定了如何在你的工作区中导入你的包。你在这里选择的名称(例如 @repo/math)将是你其他包导入它的方式(例如 import {add} from '@repo/math/add')。
让我们逐一解析这个 package.json
name:这是包可发现性中最关键的字段。值@repo/math成为在整个工作区导入语句中使用的确切标识符。如果你更改此名称,则必须相应地更新所有导入语句。scripts:dev和build脚本使用 TypeScript 编译器来编译包。dev脚本会监视源代码更改并自动重新编译包。devDependencies:typescript和@repo/typescript-config是devDependencies,这样你就可以在@repo/math包中使用这些包。在实际的包中,你可能会有更多的devDependencies和dependencies- 但现在我们可以保持简单。exports:定义了包的多个入口点,以便它可以在其他包中使用(import { add } from '@repo/math/add')。
值得注意的是,此 package.json 将一个内部包 @repo/typescript-config 声明为一个依赖项。Turborepo 将识别 @repo/math 作为 @repo/typescript-config 的依赖项,以便对你的任务进行排序。
添加一个 tsconfig.json
通过在包的根目录添加 tsconfig.json 文件来指定此包的 TypeScript 配置。TypeScript 有一个 extends 键,允许你在整个仓库中使用基础配置,并根据需要用不同的选项覆盖它。
你在这里做了四件重要的事情
- 位于
./packages/typescript-config的@repo/typescript-config/base.json配置包含了你需要的所有配置,因此你可以继承它。 compilerOptions中的outDir键 告诉 TypeScript 将编译后的输出放在哪里。它与package.json中的exports中指定的目录匹配。compilerOptions中的rootDir键 确保outDir中的输出使用与src目录相同的结构。- 根据TypeScript 规范,
include和exclude键不会从基础配置继承,所以你在这里包含了它们。
关于 TypeScript 配置还有很多可以学习的,但目前这是一个很好的起点。如果你想了解更多,请访问官方 TypeScript 文档或我们的 TypeScript 指南。
添加一个 src 目录和源代码
现在你可以为你的包编写一些代码了。在 src 目录中创建两个文件
这些文件映射到稍后运行 turbo build 时 tsc 将创建的输出。
将包添加到应用程序
你已准备好在应用程序中使用你的新包。让我们将其添加到 web 应用程序。
你刚刚更改了仓库中的依赖项。请务必运行你的包管理器的安装命令来更新你的 lockfile。
@repo/math 现在可在 web 应用程序中使用,你可以在代码中使用它
编辑 turbo.json
将新 @repo/math 库的工件添加到 turbo.json 中 build 任务的 outputs 中。这确保了它的构建输出将被 Turborepo 缓存,因此在开始运行构建时可以立即恢复。


运行 turbo build
如果你全局安装了 turbo,请在你的工作区根目录的终端中运行 turbo build。你也可以使用包管理器运行 package.json 中的 build 脚本,它将使用 turbo run build。
@repo/math 包在 web 应用程序构建之前构建,以便 ./packages/math/dist 中的运行时代码在 web 应用程序进行打包时可用。
你可以再次运行 turbo build 来查看你的 web 应用程序在几毫秒内重新构建。我们将在缓存指南中详细讨论这一点。
内部包的最佳实践
每个包只有一个“目的”
在创建内部包时,建议创建具有单一“目的”的包。这不是一门严格的科学或规则,而是根据你的仓库、规模、组织、团队需求等因素而定的最佳实践。这种策略有几个优点:
- 易于理解:随着仓库的扩展,在仓库中工作的开发人员将更容易找到他们需要的代码。
- 减少每个包的依赖项:每个包使用更少的依赖项,可以使 Turborepo 更有效地修剪包图的依赖项。
一些例子包括:
@repo/ui:一个包含所有共享 UI 组件的包@repo/tool-specific-config:一个用于管理特定工具配置的包@repo/graphs:一个用于创建和操作图形数据的特定领域库
应用程序包不包含共享代码
在创建应用程序包时,最好避免在这些包中放置共享代码。相反,你应该为共享代码创建一个单独的包,并让应用程序包依赖于该包。
此外,应用程序包不应安装到其他包中。相反,它们应该被视为你包图的入口点。
须知:
这个规则有罕见的例外。
后续步骤
有了新的内部包,你就可以开始配置任务了。