

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置 monorepo 构建设置
<a name="monorepo-configuration"></a>

当您在单个存储库中存储多个项目或微服务时，存储库称为单一存储库。您可以使用 Amplify Hosting 在单一存储库中部署应用程序，而无需创建多个构建配置或分支配置。

Amplify 支持通用单一存储库中的应用程序，以及使用 npm 工作空间、pnpm 工作空间、Yarn 工作空间、Nx 和 Turborepo 创建的单一存储库中的应用程序。当部署应用程序时，Amplify 会自动检测您所使用的单一存储库构建工具。Amplify 会自动为 npm 工作空间、Yarn 工作空间或 Nx 中的应用程序应用构建设置。Turborepo 和 pnpm 应用程序需要额外的配置。有关更多信息，请参阅 [配置 Turborepo 和 pnpm 单一存储库应用程序](#turborepo-pnpm-monorepo-configuration)。

您可以在 Amplify 控制台中保存单一存储库的构建设置，也可以下载 `amplify.yml` 文件并将其添加到存储库的根目录中。Amplify 会将保存在控制台中的设置应用于您的所有分支，除非它在您的存储库中找到了 `amplify.yml` 文件。当 `amplify.yml` 文件存在时，其设置会覆盖 Amplify 控制台中保存的所有构建设置。

## Monorepo 构建规范的 YAML 语法参考
<a name="monorepo-yml-syntax"></a>

单一存储库构建规范的 YAML 语法不同于含有单个应用程序的存储库的 YAML 语法。对于单一存储库，您可以在应用程序列表中声明各个项目。您必须为在单一存储库构建规范中声明的各个应用程序提供以下附加 `appRoot` 密钥：

**appRoot**  
应用程序启动所在的存储库中的根目录。此键必须存在，且其值须与 `AMPLIFY_MONOREPO_APP_ROOT` 环境变量相同。有关设置此环境变量的说明，请参阅 [设置 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 环境变量](#setting-monorepo-environment-variable)。

以下单一存储库构建规范示例演示了如何在同一个存储库中声明多个 Amplify 应用程序。`applications` 列表中声明了两个应用程序，即 `react-app` 和 `angular-app`。每个应用程序的 `appRoot` 键表示该应用程序位于存储库的 `apps` 根文件夹中。

`buildpath` 属性已设置为 `/`，以从单一存储库项目根目录运行和构建应用程序。`baseDirectory` 属性是 `buildpath` 的相对路径。

### 单一存储库构建规范的 YAML 语法
<a name="monorepo-build-yaml-syntax"></a>

```
version: 1
applications:
  - appRoot: apps/react-app
    env:
      variables:
        key: value
    backend:
      phases:
        preBuild:
          commands:
            - *enter command*
        build:
          commands:
            - *enter command*
        postBuild:
            commands:
            - *enter command*
    frontend:
      buildPath: / # Run install and build from the monorepo project root
      phases:
        preBuild:
          commands:
            - *enter command*
            - *enter command*
        build:
          commands:
            - *enter command*
      artifacts:
        files:
            - location
            - location
        discard-paths: yes
        baseDirectory: location
      cache:
        paths:
            - path
            - path
    test:
      phases:
        preTest:
          commands:
            - *enter command*
        test:
          commands:
            - *enter command*
        postTest:
          commands:
            - *enter command*
      artifacts:
        files:
            - location
            - location
        configFilePath: *location*
        baseDirectory: *location*
  - appRoot: apps/angular-app
    env:
      variables:
        key: value
    backend:
      phases:
        preBuild:
          commands:
            - *enter command*
        build:
          commands:
            - *enter command*
        postBuild:
            commands:
            - *enter command*
    frontend:
      phases:
        preBuild:
          commands:
            - *enter command*
            - *enter command*
        build:
          commands:
            - *enter command*
      artifacts:
        files:
            - location
            - location
        discard-paths: yes
        baseDirectory: location
      cache:
        paths:
            - path
            - path
    test:
      phases:
        preTest:
          commands:
            - *enter command*
        test:
          commands:
            - *enter command*
        postTest:
          commands:
            - *enter command*
      artifacts:
        files:
            - location
            - location
        configFilePath: *location*
        baseDirectory: *location*
```

使用以下示例构建规范的应用程序将在项目根目录下构建，相关构件将位于 `/packages/nextjs-app/.next` 中。

```
applications:
  - frontend:
      buildPath: '/'  # run install and build from monorepo project root
      phases:
        preBuild:
          commands:
            - npm install
        build:
          commands:
            - npm run build --workspace=nextjs-app
      artifacts:
        baseDirectory: packages/nextjs-app/.next
        files:
          - '**/*'
      cache:
        paths:
          - node_modules/**/*
    appRoot: packages/nextjs-app
```

## 设置 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 环境变量
<a name="setting-monorepo-environment-variable"></a>

部署存储在单一存储库中的应用程序时，该应用程序的 `AMPLIFY_MONOREPO_APP_ROOT` 环境变量必须与应用程序根目录路径（存储库根目录的相对路径）具有相同的值。例如，一个单一存储库 `ExampleMonorepo` 的根文件夹名为 `apps`，其中包含 `app1`、`app2` 和 `app3`，其目录结构如下：

```
ExampleMonorepo
  apps
    app1
    app2
    app3
```

在此示例中，`app1` 的 `AMPLIFY_MONOREPO_APP_ROOT` 环境变量的值为 `apps/app1`。

当您使用 Amplify 控制台部署单一存储库应用程序时，控制台会使用您为应用程序根目录路径指定的值自动设置 `AMPLIFY_MONOREPO_APP_ROOT` 环境变量。但是，如果您的 monorepo 应用程序已存在于 Amplify 中或者是使用部署的 AWS CloudFormation，则必须在 Amplify 控制台的 “`AMPLIFY_MONOREPO_APP_ROOT`环境变量” 部分中手动设置**环境变量**。

### 在部署期间自动设置 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 环境变量
<a name="setting-monorepo-environmnet-variable-automatically"></a>

以下说明演示了如何使用 Amplify 控制台部署单一存储库应用程序。Amplify 使用您在控制台中指定的应用程序根文件夹自动设置 `AMPLIFY_MONOREPO_APP_ROOT` 环境变量。

**使用 Amplify 控制台部署单一存储库应用程序**

1. 登录 AWS 管理控制台 并打开 [Amplify](https://console.aws.amazon.com/amplify/) 控制台。

1. 在右上角选择**创建新应用程序**。

1. 在**开始使用 Amplify 进行构建**页面中选择您的 Git 提供商，然后选择**下一步**。

1. 在**添加存储库分支**页面上，执行以下操作：

   1. 从列表中选择您的存储库名称。

   1. 选择要使用的分支名称。

   1. 选择**我的应用程序是 monorepo**

   1. 在单一存储库中输入您应用程序的路径，例如 **apps/app1**。

   1. 选择**下一步**。

1. 在**应用程序设置**页面上，您可以使用默认设置，也可以自定义应用程序的构建设置。在**环境变量**部分中，Amplify 会将 `AMPLIFY_MONOREPO_APP_ROOT` 设置为您在步骤 4d 中指定的路径。

1. 选择**下一步**。

1. 在**查看**页面上，选择**保存并部署**。

### 为现有应用程序设置 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 环境变量
<a name="setting-monorepo-environment-variable-manually"></a>

按照以下说明为已部署到 Amplify 或使用创建的应用程序手动设置`AMPLIFY_MONOREPO_APP_ROOT`环境变量。 CloudFormation

**为现有应用程序设置 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 环境变量**

1. 登录 AWS 管理控制台 并打开 [Amplify](https://console.aws.amazon.com/amplify/) 控制台。

1. 选择要为其设置环境变量的应用程序的名称。

1. 在导航窗格中，依次选择**托管**和**环境变量**。

1. 在**环境变量**页面，选择**管理变量**。

1. 在**变量管理器**部分，执行以下操作：

   1. 选择**新增**。

   1. 对于**变量**，请输入密钥 `AMPLIFY_MONOREPO_APP_ROOT`。

   1. 对于**值**，请输入应用程序的路径，例如 **apps/app1**。

   1. 对于**分支**，默认情况下 Amplify 会将环境变量应用于所有分支。

1. 选择**保存**。

## 配置 Turborepo 和 pnpm 单一存储库应用程序
<a name="turborepo-pnpm-monorepo-configuration"></a>

Turborepo 和 pnpm 工作空间单一存储库构建工具从 `.npmrc` 文件中获取配置信息。部署使用这些工具之一创建的单一存储库应用程序时，您的项目根目录中必须有一个 `.npmrc` 文件。

在 `.npmrc` 文件中，将用于安装 Node 软件包的链接器设置为 `hoisted`。您可以将以下一行复制到您的文件。

```
node-linker=hoisted
```

有关 `.npmrc` 文件和设置的更多信息，请参阅 *pnpm 文档*中的 [pnpm.npmrc](https://pnpm.io/next/npmrc)。

Pnpm 不包含在 Amplify 的默认构建容器中。对于 pnpm 工作空间和 Turborepo 应用程序，必须在应用程序构建设置的 `preBuild` 阶段添加一条安装 pnpm 的命令。

以下示例摘自构建规范，其中显示了一个包含 pnpm 安装命令的 `preBuild` 阶段。

```
version: 1
applications:
  - frontend:
      phases:
        preBuild:
          commands:
            - npm install -g pnpm
```