创建内部包
内部包是你工作区的构建块,为你提供了在仓库中共享代码和功能的强大方式。Turborepo 自动通过 package.json
中的依赖关系了解内部包之间的关系,在后台创建包图以优化你仓库的工作流程。
让我们创建你的第一个内部包,用于在仓库中共享数学工具,遵循包的剖析部分的指导和编译包模式。在以下步骤中,我们假设你已经使用 create-turbo
创建了一个新仓库或者使用了类似结构的仓库。
添加 package.json
接下来,为包创建 package.json
文件。通过添加此文件,你将满足内部包的两个要求,使其对 Turborepo 和工作区其余部分可发现:
让我们逐部分分解这个 package.json
:
scripts
:dev
和build
脚本使用 TypeScript 编译器编译包。dev
脚本将监视源代码的变化并自动重新编译包。devDependencies
:typescript
和@repo/typescript-config
是devDependencies
,这样你就可以在@repo/math
包中使用这些包。在实际包中,你可能会有更多的devDependencies
和dependencies
- 但现在我们可以保持简单。exports
:为包定义多个入口点,以便在其他包中使用(import { add } from '@repo/math'
)。
值得注意的是,这个 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
目录相同的结构。include
和exclude
键不会从基本配置继承,根据 TypeScript 规范,所以你在这里包含了它们。
关于 TypeScript 配置还有很多要学习的内容,但这是一个很好的起点。如果你想了解更多,请访问 官方 TypeScript 文档 或 我们的 TypeScript 指南。
添加带有源代码的 src
目录
现在你可以为你的包编写一些代码。在 src
目录中创建两个文件:
这些文件对应于稍后运行 turbo build
时由 tsc
创建的输出。
将包添加到应用程序
你已经准备好在应用程序中使用你的新包了。让我们将它添加到 web
应用程序中。
你刚刚改变了仓库中的依赖项。确保运行包管理器的安装命令来更新你的锁定文件。
@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
:用于创建和操作图形数据的特定领域库
应用程序包不包含共享代码
当你创建应用程序包时,最好避免在这些包中放置共享代码。相反,你应该为共享代码创建一个单独的包,并让应用程序包依赖于该包。
此外,应用程序包不适合安装到其他包中。相反,它们应该被视为你的包图的入口点。
Good to know:
这个规则有 罕见的例外。
下一步
有了新的内部包,你可以开始配置任务。