创建内部包
内部包 是工作区的构建模块,为您提供了一种强大的方式,可以在存储库中共享代码和功能。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
目录相同的结构。- 根据 TypeScript 规范,
include
和exclude
键不会从基本配置继承,因此您已在此处包含它们。
关于 TypeScript 配置还有很多需要学习的地方,但这是一个很好的入门方法。如果您想了解更多信息,请访问 官方 TypeScript 文档或 我们的 TypeScript 指南。
将包添加到应用程序
您已准备好在应用程序中使用您的新包。 让我们将其添加到 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
:一个用于创建和操作图形数据的特定领域库
应用程序包不包含共享代码
当您创建 应用程序包 时,最好避免将共享代码放入这些包中。 相反,您应该为共享代码创建一个单独的包,并让应用程序包依赖于该包。
此外,应用程序包不应安装到其他包中。 相反,它们应被视为您的 包图 的入口点。
须知
这条规则存在 罕见的例外情况。
下一步
有了新的内部包后,您可以开始配置任务。
这有帮助吗?