仓库
文档
开发任务

单仓库中的开发任务

绝大多数开发工作流程看起来像这样

  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 任务也独一无二,因为您很少想 缓存 它们,因此我们将 cache 设置为 false。我们还将 persistent 设置为 true,因为 dev 任务是长时间运行的任务,我们希望确保它不会阻止任何其他任务执行。

设置 package.json

您还应该在您的根 package.json 中提供一个 dev 任务

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

这使开发人员能够直接从他们的正常任务运行器中运行该任务。

dev 之前运行任务

在某些工作流程中,您可能希望在运行 dev 任务之前运行一些任务。例如,生成代码或运行 db:migrate 任务。

在这些情况下,使用 dependsOn 来指定任何 codegendb: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/docsdocs 工作区中运行 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": {},
  }
}

了解一下

  • 如果您的任务生成可缓存的工件,请确保将它们包含在 outputs 中的 setup-dev 中。
  • 如果您的任务 **不** 生成可缓存的工件,您可能希望将 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 中,如果您使用它们来构建您的应用程序。