モノレポにおける開発タスク
開発ワークフローの大部分は次のようになります
- リポジトリを開く
- 開発中に
dev
タスクを実行する - 一日の終わりに、
dev
タスクを終了し、リポジトリを閉じる。
dev
はリポジトリで最も頻繁に実行されるタスクになる可能性が高いため、正しく設定することが重要です。
dev
タスクの種類
dev
タスクにはさまざまな種類と規模があります
- Webアプリのローカル開発サーバーを実行する
- コードが変更されるたびにバックエンドプロセスを再実行するために
nodemon
(新しいタブで開きます) を実行する --watch
モードでテストを実行する
Turborepoでのセットアップ
turbo.json
に、dev
タスクを次のように指定する必要があります。
{
"pipeline": {
"dev": {
"cache": false,
"persistent": true
}
}
}
dev
タスクは出力を生成しないため、outputs
は空です。 dev
タスクは、めったにキャッシュしたくないという点でも独特であるため、cache
を false
に設定します。 また、dev
タスクは長時間実行されるタスクであるため、他のタスクの実行をブロックしないようにするために、persistent
を true
に設定します。
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-dev
のoutputs
キーにそれらを含めてください。 - タスクでキャッシュ可能なアーティファクトが*生成されない*場合は、
cache
キーをfalse
に設定して、常に最初に実行されるようにすることをお勧めします。
環境変数の使用
開発中は、多くの場合、環境変数を使用する必要があります。 これらを使用すると、プログラムの動作をカスタマイズできます。たとえば、開発環境と本番環境で異なる DATABASE_URL
を指すことができます。
この問題を解決するために、dotenv-cli
(新しいタブで開きます) というライブラリを使用することをお勧めします。
私たちは、すべての開発者が Turbo を快適に使用できるようにしたいと考えています。 以下に記載されているアプローチは、これらの基準を満たして*いません*。
私たちは、この問題に対するファーストクラスのソリューションに取り組んでいます。お待ちの間は、次善のソリューションを以下に示します。
チュートリアル
- ルートワークスペースに
dotenv-cli
をインストールします
# Installs dotenv-cli in the root workspace
npm add dotenv-cli
- ルートワークスペースに
.env
ファイルを追加します。
├── apps/
├── packages/
+ ├── .env
├── package.json
└── turbo.json
挿入する必要がある環境変数を追加します。
DATABASE_URL=my-database-url
- ルートの
package.json
内に、dev
スクリプトを追加します。その前にdotenv
と引数セパレータである--
を付けます。
{
"scripts": {
"dev": "dotenv -- turbo run dev"
}
}
これにより、turbo run dev
を実行する前に、.env
から環境変数が抽出されます。
- これで、devスクリプトを実行できます。
npm run dev
環境変数が設定されます! Node.jsでは、これらはprocess.env.DATABASE_URL
で使用できます。
アプリのビルドに環境変数を使用している場合は、turbo.json
に環境変数を追加する必要があります。