创建内部包
内部包 是工作区的构建模块,为您提供了一种强大的方式,可以在存储库中共享代码和功能。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 指南。
添加带有源代码的 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
:一个用于创建和操作图形数据的特定领域库
应用程序包不包含共享代码
当您创建 应用程序包 时,最好避免将共享代码放入这些包中。 相反,您应该为共享代码创建一个单独的包,并让应用程序包依赖于该包。
此外,应用程序包不应安装到其他包中。 相反,它们应被视为您的 包图 的入口点。
须知
这条规则存在 罕见的例外情况。
下一步
有了新的内部包后,您可以开始配置任务。
这有帮助吗?