了解你的仓库

Turborepo 包含用于理解存储库结构的工具,可帮助你使用和优化代码库。

¥Turborepo includes tools for understanding your repository structure, that can help you use and optimize your codebase.

turbo ls

要列出你的软件包,你可以运行 turbo ls。这将显示存储库中的软件包及其位置。

¥To list your packages, you can run turbo ls. This will show the packages in your repository and where they're located.

Terminal
> turbo ls
 
  @repo/eslint-config packages/eslint-config
  @repo/typescript-config packages/typescript-config
  @repo/ui packages/ui
  docs apps/docs
  web apps/web

你可以将 应用过滤器 更改为 ls,就像 run 一样:

¥You can apply filters to ls, just like run:

Terminal
> turbo ls --filter ...ui
3 packages (pnpm9)
 
  @repo/ui packages/ui
  docs apps/docs
  web apps/web

turbo run

要确定哪些任务可以在你的 monorepo 中运行,只需调用 turbo run 而不执行任何任务即可。你将获得一个任务列表以及定义这些任务的包:

¥To determine which tasks can be run in your monorepo, simply call turbo run without any tasks. You will get a list of tasks and the packages in which they are defined:

Terminal
> turbo run
No tasks provided, here are some potential ones
 
  lint
    @repo/ui, docs, web
  build
    docs, web
  dev
    docs, web
  start
    docs, web
  generate:component
    @repo/ui

turbo query

如果你想深入了解你的代码库结构,自 2.2.0 以来,Turborepo 通过 turbo query 为你的代码库提供了一个 GraphQL 接口。你可以执行查询,例如查找所有包含 test 任务的包:

¥If you wish to dig into your repository structure, since 2.2.0, Turborepo provides a GraphQL interface into your repository via turbo query. You can execute queries such as finding all packages that have a test task:

Terminal
> turbo query "query { packages(filter: { has: { field: TASK_NAME, value: \"build\"}}) { items { name } } }"
{
  "data": {
    "packages": {
      "items": [
        {
          "name": "//"
        },
        {
          "name": "docs"
        },
        {
          "name": "web"
        }
      ]
    }
  }
}

这有助于诊断包或任务依赖图中的潜在问题。例如,假设你在构建过程中遇到很多缓存未命中。这可能是因为有一个包不断发生变化,并被导入到你的整个代码库中。

¥This can be helpful for diagnosing potential problems in your package or task dependency graph. For instance, let's say you're getting a lot of cache misses in your builds. This could be because there's a package that keeps getting changed and is imported throughout your codebase.

为此,我们可以运行查询来查找 monorepo 中直接导入超过 10 次的包:

¥To do this, we can run a query to find packages that are directly imported more than 10 times in your monorepo:

Terminal
> turbo query "query { packages(filter: { greaterThan: { field: DIRECT_DEPENDENT_COUNT, value: 10 } }) { items { name } } }"
{
  "data": {
    "packages": {
      "items": [
        {
          "name": "utils"
        }
      ]
    }
  }
}

现在我们已经找到了这个包,我们可以尝试将其拆分成更小的包,这样微小的更改就不会使整个依赖图失效。

¥Now that we've found this package, we can try to split it up into smaller packages so that a small change won't invalidate the whole dependency graph.

或者假设你正在使用我们新的 --affected 标志,但仍然运行着超出预期的任务。使用 turbo query,你可以找到所有软件包及其失效的原因:

¥Or let's say you're using our new --affected flag, but you're still running more tasks than you'd like. With turbo query, you can find all the packages and the reason why they were invalidated:

Terminal
> turbo query "query { affectedPackages(base: \"HEAD^\", head: \"HEAD\") { items { reason {  __typename } } } }"
{
  "data": {
    "affectedPackages": {
      "items": [
        {
          "name": "utils",
          "reason": {
            "__typename": "FileChanged"
          }
        },
        {
          "name": "web",
          "reason": {
            "__typename": "DependencyChanged"
          }
        },
        {
          "name": "docs",
          "reason": {
            "__typename": "DependencyChanged"
          }
        },
        {
          "name": "cli",
          "reason": {
            "__typename": "DependencyChanged"
          }
        },
      ]
    }
  }
}