저장소 이해하기

Turborepo에는 코드베이스를 사용하고 최적화하는 데 도움이 되는 저장소 구조를 이해하기 위한 도구가 포함되어 있습니다.

turbo ls

패키지를 나열하려면 turbo ls를 실행할 수 있습니다. 이는 저장소의 패키지와 해당 위치를 보여줍니다.

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

run과 마찬가지로 ls필터를 적용할 수 있습니다:

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

turbo run

모노레포에서 실행할 수 있는 작업을 확인하려면 작업 없이 turbo run을 호출하기만 하면 됩니다. 작업 목록과 해당 작업이 정의된 패키지를 얻을 수 있습니다:

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 작업이 있는 모든 패키지를 찾는 것과 같은 쿼리를 실행할 수 있습니다:

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

이는 패키지 또는 작업 종속성 그래프의 잠재적인 문제를 진단하는 데 도움이 될 수 있습니다. 예를 들어 빌드에서 캐시 미스가 많이 발생한다고 가정해 보겠습니다. 이는 계속 변경되고 코드베이스 전체에서 import되는 패키지가 있기 때문일 수 있습니다.

이를 위해 모노레포에서 10번 이상 직접 import되는 패키지를 찾는 쿼리를 실행할 수 있습니다:

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

이제 이 패키지를 찾았으므로 작은 변경 사항이 전체 종속성 그래프를 무효화하지 않도록 더 작은 패키지로 분할할 수 있습니다.

또는 새로운 --affected 플래그를 사용하고 있지만 여전히 원하는 것보다 더 많은 작업을 실행하고 있다고 가정해 보겠습니다. turbo query를 사용하면 무효화된 모든 패키지와 그 이유를 찾을 수 있습니다:

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"
          }
        },
      ]
    }
  }
}