

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 monorepo 組建設定
Monorepo 建置設定

當您在單一儲存庫中存放多個專案或微服務時，稱為單一儲存庫。您可以使用 Amplify Hosting 在單一儲存庫中部署應用程式，而無需建立多個建置組態或分支組態。

Amplify 支援通用 monorepos 中的應用程式，以及使用 npm 工作區、pnpm 工作區、Yarn 工作區、Nx 和 Turborepo 建立的 monorepo 中的應用程式。部署應用程式時，Amplify 會自動偵測您正在使用的 monorepo 建置工具。Amplify 會自動套用 npm 工作區、Yarn 工作區或 Nx 中應用程式的建置設定。Turborepo 和 pnpm 應用程式需要額外的組態。如需詳細資訊，請參閱[設定 Turborepo 和 pnpm monorepo 應用程式](#turborepo-pnpm-monorepo-configuration)。

您可以在 Amplify 主控台中儲存單一儲存庫的建置設定，也可以下載 `amplify.yml` 檔案並將其新增至儲存庫的根目錄。Amplify 會將主控台中儲存的設定套用至所有分支，除非其在您的儲存庫中找到 `amplify.yml` 檔案。當`amplify.yml`檔案存在時，其設定會覆寫 Amplify 主控台中儲存的任何建置設定。

## Monorepo 建置規格 YAML 語法參考


單一儲存庫建置規格的 YAML 語法與包含單一應用程式的儲存庫的 YAML 語法不同。對於單一儲存庫，您可以在應用程式清單中宣告每個專案。您必須為在 monorepo 建置規格中宣告的每個應用程式提供下列額外`appRoot`金鑰：

**appRoot**  
應用程式啟動所在的儲存庫根目錄。此金鑰必須存在，且具有與`AMPLIFY_MONOREPO_APP_ROOT`環境變數相同的值。如需設定此環境變數的說明，請參閱 [設定 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 環境變數](#setting-monorepo-environment-variable)。

下列單儲存庫建置規格範例示範如何在同一個儲存庫中宣告多個 Amplify 應用程式。這兩個應用程式 `react-app`和 `angular-app`會在`applications`清單中宣告。每個應用程式的`appRoot`金鑰表示應用程式位於儲存庫的`apps`根資料夾中。

`buildpath` 屬性設定為 `/`，以從 monorepo 專案根目錄執行和建置應用程式。`baseDirectory` 屬性是 的相對路徑`buildpath`。

### Monorepo 建置規格 YAML 語法


```
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 環境變數


當您部署存放在單一儲存庫中的應用程式時，應用程式`AMPLIFY_MONOREPO_APP_ROOT`的環境變數必須具有與應用程式根目錄路徑相同的值，相對於儲存庫根目錄。例如，名為 `ExampleMonorepo`且根資料夾名為 的 monorepo`apps`，其中包含 、 `app1` `app2`和 `app3`的目錄結構如下：

```
ExampleMonorepo
  apps
    app1
    app2
    app3
```

在此範例中， `AMPLIFY_MONOREPO_APP_ROOT`的環境變數值`app1`為 `apps/app1`。

當您使用 Amplify 主控台部署 monorepo 應用程式時，主控台會自動使用您為應用程式根目錄路徑指定的值來設定`AMPLIFY_MONOREPO_APP_ROOT`環境變數。不過，如果您的 monorepo 應用程式已存在於 Amplify 中或使用 部署 AWS CloudFormation，您必須在 Amplify 主控台`AMPLIFY_MONOREPO_APP_ROOT`的環境變數區段中手動設定**環境變數**。

### 在部署期間自動設定 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 環境變數


下列指示示範如何使用 Amplify 主控台部署 monorepo 應用程式。Amplify 會使用您在主控台中指定的應用程式根資料夾自動設定`AMPLIFY_MONOREPO_APP_ROOT`環境變數。

**使用 Amplify 主控台部署 monorepo 應用程式**

1. 登入 AWS 管理主控台 並開啟 [Amplify 主控台](https://console.aws.amazon.com/amplify/)。

1. 選擇右上角**的新建應用程式**。

1. 在**開始使用 Amplify 建置**頁面上，選擇您的 Git 供應商，然後選擇**下一步**。

1. 在**新增儲存庫分支**頁面上，執行下列動作：

   1. 從清單中選擇儲存庫的名稱。

   1. 選擇要使用的分支名稱。

   1. 選取 **我的應用程式是單一儲存庫**

   1. 在 monorepo 中輸入應用程式的路徑，例如 **apps/app1**。

   1. 選擇**下一步**。

1. 在**應用程式設定**頁面上，您可以使用預設設定或自訂應用程式的建置設定。在**環境變數**區段中，Amplify `AMPLIFY_MONOREPO_APP_ROOT`會將 設定為您在步驟 4d 中指定的路徑。

1. 選擇**下一步**。

1. 在**檢閱**頁面上，選擇**儲存並部署**。

### 設定現有應用程式的 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 環境變數


使用下列指示，為已部署至 Amplify 或使用 CloudFormation 建立的應用程式手動設定`AMPLIFY_MONOREPO_APP_ROOT`環境變數。

**設定現有應用程式的 AMPLIFY\$1MONOREPO\$1APP\$1ROOT 環境變數**

1. 登入 AWS 管理主控台 並開啟 [Amplify 主控台](https://console.aws.amazon.com/amplify/)。

1. 選擇要為其設定環境變數的應用程式名稱。

1. 在導覽窗格中，選擇**託管**，然後選擇**環境變數**。

1. 在**環境變數**頁面上，選擇**管理變數**。

1. 在**管理變數**區段中，執行下列動作：

   1. 選擇 **Add new (新增)**。

   1. 針對**變數**，輸入金鑰 `AMPLIFY_MONOREPO_APP_ROOT`。

   1. 針對**值**，輸入應用程式的路徑，例如 **apps/app1**。

   1. 對於**分支**，根據預設，Amplify 會將環境變數套用至所有分支。

1. 選擇**儲存**。

## 設定 Turborepo 和 pnpm monorepo 應用程式


Turborepo 和 pnpm 工作區 monorepo 建置工具會從 `.npmrc` 檔案取得組態資訊。當您部署使用其中一個工具建立的 monorepo 應用程式時，您的專案根目錄中必須有 `.npmrc` 檔案。

在 `.npmrc`檔案中，將安裝 Node 套件的連結器設定為 `hoisted`。您可以將以下行複製到您的 檔案。

```
node-linker=hoisted
```

如需`.npmrc`檔案和設定的詳細資訊，請參閱 [pnpm 文件中的 pnpm .](https://pnpm.io/next/npmrc)*npmrc*。

Pnpm 不包含在 Amplify 預設建置容器中。對於 pnpm 工作區和 Turborepo 應用程式，您必須新增命令，才能在應用程式的建置設定`preBuild`階段中安裝 pnpm。

下列範例摘錄自建置規格，顯示具有安裝 pnpm 命令的`preBuild`階段。

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