단일 패키지 워크스페이스

Turborepo는 multi-package workspaces(일반적으로 모노레포라고 함)에서 매우 효과적이지만 single-package workspaces를 더 빠르게 만드는 데도 사용할 수 있습니다.

Turborepo의 가장 중요한 기능은 로컬 및 Remote Caching과 작업 병렬화를 포함하여 단일 패키지 워크스페이스에서 작동합니다. 작동하지 않는 기능은 패키지 작업(app#build)과 같이 단일 패키지의 컨텍스트에서 의미가 없는 기능입니다.

Good to know: 

단일 패키지 워크스페이스의 예로는 npx create-next-app 또는 npm create vite의 출력이 있습니다.

설치

애플리케이션에 turbo를 설치합니다:

Terminal
pnpm add turbo --save-dev

글로벌 turbo를 사용하여 package.json 스크립트 실행(선택 사항)

더 빠른 개발자 워크플로우를 위해 turbo를 전역으로 설치할 수도 있으며 명령줄에서 직접 명령을 실행할 수 있습니다.

설치되면 turbo build를 실행할 수 있으며 Turborepo는 package.json에서 build 스크립트를 실행합니다. turbo build를 다시 실행하면 캐시에 히트합니다.

이 시점에서 turbo는 코드가 변경될 때만 애플리케이션을 다시 빌드할 가능성이 높고 코드가 변경되면 turbo가 캐시를 놓칠 것이기 때문에 많은 가치를 제공하지 않습니다. 두 가지 간단한 단계로 turbo에서 더 많은 것을 얻을 수 있습니다.

하나의 명령으로 여러 스크립트 실행

많은 리포지토리에는 실행해야 할 설정 작업이나 빌드 전 단계가 있습니다. 이러한 작업은 종종 한 번에 하나씩 실행되지만 turbo를 사용하면 쉽게 하나의 스크립트로 전환할 수 있습니다.

예를 들어, 작업을 시작할 때마다 개발 환경을 설정해야 하는 프로젝트가 있다고 가정해 봅시다. 다음이 필요합니다:

  1. 데이터베이스용 Docker 컨테이너를 시작합니다.
  2. 데이터베이스에 데이터베이스 스키마를 푸시합니다.
  3. 데이터베이스에 데이터를 시드합니다.
  4. 개발 서버를 시작합니다.

Turborepo를 사용하여 이러한 작업을 하나의 명령으로 스케줄링할 수 있습니다. 먼저 package.json에 스크립트를 만듭니다:

package.json
{
  "name": "@acme/my-app",
  "version": "0.0.0",
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "check-types": "tsc --noEmit",
    "db:up": "docker-compose up -d",
    "db:push": "your-orm-tool schema-push",
    "db:seed": "node ./db-seed.js"
  }
}

그런 다음 turbo.json에 작업을 만들어 이러한 스크립트를 순서대로 실행합니다:

Turborepo logo
./turbo.json
{
  "$schema": "https://turborepo.com/schema.json",
  "tasks": {
    "dev": {
      "dependsOn": ["db:seed"],
      "cache": false,
      "persistent": true
    },
    "db:seed": {
      "dependsOn": ["db:push"],
      "cache": false
    },
    "db:push": {
      "dependsOn": ["db:up"],
      "cache": false
    },
    "db:up": {
      "cache": false
    }
  }
}

위의 작업에서 dependsOn 배열은 작업의 순차적 순서를 만듭니다. turbo dev를 실행하면 db:up, db:push, db:seed에 대한 스크립트가 먼저 실행됩니다.

작업 병렬화

turbo를 사용하여 작업을 병렬화하면 가능할 때 모든 작업을 한 번에 실행하여 작업 속도를 높일 수 있습니다. 예를 들어, ESLint, TypeScript 및 Prettier 검사를 동시에 실행할 수 있습니다. 다음과 같은 스크립트가 주어지면:

./package.json
{
  "scripts": {
    "lint": "eslint .",
    "format": "prettier .",
    "check-types": "tsc --noEmit"
  }
}

다음과 같은 설정을 만들 수 있습니다:

Turborepo logo
turbo.json
{
  "$schema": "https://turborepo.com/schema.json",
  "tasks": {
    "lint": {},
    "format": {},
    "check-types": {}
  }
}

그런 다음 모든 작업을 동시에 실행하려면:

Terminal
turbo check-types lint format

inputs를 사용한 작업 최적화

Turborepo는 단일 패키지 워크스페이스를 하나의 패키지로 취급하기 때문에 관련 없는 변경 사항이 캐시 미스를 생성하지 않도록 작업에 대한 입력을 최적화하는 데 도움이 될 수 있습니다.

예를 들어, tsc --noEmit을 사용하여 타입을 확인하는 스크립트는 TypeScript 파일만 포함하는 입력으로 설정할 수 있습니다:

Turborepo logo
./turbo.json
{
  "$schema": "https://turborepo.com/schema.json",
  "tasks": {
    "check-types": {
      "inputs": ["**/*.{ts,tsx}"]
    }
  }
}