リポジトリ
ドキュメント
開発タスク

モノレポにおける開発タスク

開発ワークフローの大部分は次のようになります

  1. リポジトリを開く
  2. 開発中にdevタスクを実行する
  3. 一日の終わりに、devタスクを終了し、リポジトリを閉じる。

dev はリポジトリで最も頻繁に実行されるタスクになる可能性が高いため、正しく設定することが重要です。

dev タスクの種類

dev タスクにはさまざまな種類と規模があります

  1. Webアプリのローカル開発サーバーを実行する
  2. コードが変更されるたびにバックエンドプロセスを再実行するために nodemon (新しいタブで開きます) を実行する
  3. --watch モードでテストを実行する

Turborepoでのセットアップ

turbo.json に、dev タスクを次のように指定する必要があります。

{
  "pipeline": {
    "dev": {
      "cache": false,
      "persistent": true
    }
  }
}

dev タスクは出力を生成しないため、outputs は空です。 dev タスクは、めったにキャッシュしたくないという点でも独特であるため、cachefalse に設定します。 また、dev タスクは長時間実行されるタスクであるため、他のタスクの実行をブロックしないようにするために、persistenttrue に設定します。

package.json の設定

ルートの package.json にも dev タスクを提供する必要があります。

{
  "scripts": {
    "dev": "turbo run dev"
  }
}

これにより、開発者は通常のタスクランナーから直接タスクを実行できます。

dev の*前*にタスクを実行する

一部のワークフローでは、dev タスクを実行する*前*にタスクを実行する必要があります。 たとえば、コードの生成や db:migrate タスクの実行などです。

このような場合は、dependsOn を使用して、codegen または db:migrate タスクは dev が実行される*前*に実行する必要があることを指定します。

{
  "pipeline": {
    "dev": {
      "dependsOn": ["codegen", "db:migrate"],
      "cache": false
    },
    "codegen": {
      "outputs": ["./codegen-outputs/**"]
    },
    "db:migrate": {
      "cache": false
    }
  }
}

次に、アプリの package.json

{
  "scripts": {
    // For example, starting the Next.js dev server
    "dev": "next",
    // For example, running a custom code generation task
    "codegen": "node ./my-codegen-script.js",
    // For example, using Prisma
    "db:migrate": "prisma db push"
  }
}

これは、dev タスクのユーザーは*コード生成やデータベースの移行について心配する必要がない*ことを意味します。開発サーバーが起動する前に処理されます。

特定のワークスペースでのみ dev を実行する

<root>/apps/docs にある docs ワークスペースで dev タスクを実行するとします。 turbo はディレクトリからワークスペースを推測できるため、次のコマンドを実行すると

cd <root>/apps/docs
turbo run dev

turbo は自動的に docs ワークスペースにいることを認識し、dev タスクを実行します。

リポジトリ内の他の場所から同じタスクを実行するには、--filter 構文を使用します。 例えば

turbo run dev --filter docs

セットアップタスクの実行

永続的な長時間実行開発タスクを実行する*前*に実行する必要があるタスクがいくつかある場合があります。 セットアップ手順の例としては、次のものがあります。

  • パッケージの事前ビルド
  • Dockerコンテナの設定
  • Nodeまたはパッケージマネージャーのバージョンを確認する

これらのセットアップタスクに dev という名前を付けると、turbo.json の永続タスクと名前が衝突します。 代わりに、これらのセットアップタスクの名前を setup-dev に変更し、dev タスクでこれらの setup-dev タスクに依存させることができます。

{
  "pipeline": {
    "dev": {
      "dependsOn": [
        // Wait for tasks in dependencies
        "^setup-dev"
        // Wait for tasks in same package
        "setup-dev"
        // Wait for `setup-dev` in a specific package
        "my-package#setup-dev"
        ],
    },
    "setup-dev": {},
  }
}

知っておくと良いこと

  • タスクでキャッシュ可能なアーティファクトが生成される場合は、setup-devoutputs キーにそれらを含めてください。
  • タスクでキャッシュ可能なアーティファクトが*生成されない*場合は、cache キーfalse に設定して、常に最初に実行されるようにすることをお勧めします。

環境変数の使用

開発中は、多くの場合、環境変数を使用する必要があります。 これらを使用すると、プログラムの動作をカスタマイズできます。たとえば、開発環境と本番環境で異なる DATABASE_URL を指すことができます。

この問題を解決するために、dotenv-cli (新しいタブで開きます) というライブラリを使用することをお勧めします。

私たちは、すべての開発者が Turbo を快適に使用できるようにしたいと考えています。 以下に記載されているアプローチは、これらの基準を満たして*いません*。

私たちは、この問題に対するファーストクラスのソリューションに取り組んでいます。お待ちの間は、次善のソリューションを以下に示します。

チュートリアル

  1. ルートワークスペースdotenv-cli をインストールします
# Installs dotenv-cli in the root workspace
npm add dotenv-cli
  1. ルートワークスペースに.envファイルを追加します。
  ├── apps/
  ├── packages/
+ ├── .env
  ├── package.json
  └── turbo.json

挿入する必要がある環境変数を追加します。

DATABASE_URL=my-database-url
  1. ルートのpackage.json内に、devスクリプトを追加します。その前にdotenvと引数セパレータである--を付けます。
{
  "scripts": {
    "dev": "dotenv -- turbo run dev"
  }
}

これにより、turbo run devを実行する前に、.envから環境変数が抽出されます。

  1. これで、devスクリプトを実行できます。
npm run dev

環境変数が設定されます! Node.jsでは、これらはprocess.env.DATABASE_URLで使用できます。

アプリのビルドに環境変数を使用している場合は、turbo.json環境変数を追加する必要があります。