Configuring monorepo build settings
When you store multiple projects or microservices in a single repository, it is called a monorepo. You can use Amplify Hosting to deploy applications in a monorepo without creating multiple build configurations or branch configurations.
Amplify supports apps in generic monorepos as well as apps in monorepos created using npm workspace, pnpm workspace, Yarn workspace, Nx, and Turborepo. When you deploy your app, Amplify automatically detects the monorepo build tool that you are using. Amplify automatically applies build settings for apps in an npm workspace, Yarn workspace or Nx. Turborepo and pnpm apps require additional configuration. For more information, see Configuring Turborepo and pnpm monorepo apps.
You can save the build settings for a monorepo in the Amplify console or you can
download the amplify.yml
file and add it to the root of your repository.
Amplify applies the settings saved in the console to all of your branches unless it finds an
amplify.yml
file in your repository. When an
amplify.yml
file is present, its settings override any build settings
saved in the Amplify console.
Monorepo build specification YAML syntax reference
The YAML syntax for a monorepo build specification differs from the YAML syntax for a
repo that contains a single application. For a monorepo, you declare each project in a list
of applications. You must provide the following additional appRoot
key for each
application you declare in your monorepo build specification:
- appRoot
-
The root, within the repository, that the application starts in. This key must exist, and have the same value as the
AMPLIFY_MONOREPO_APP_ROOT
environment variable. For instructions on setting this environment variable, see Setting the AMPLIFY_MONOREPO_APP_ROOT environment variable.
The following monorepo build specification example demonstrates how to declare multiple
Amplify applications in the same repo. The two apps, react-app
, and
angular-app
are declared in the applications
list. The
appRoot
key for each app indicates that the app is located in the
apps
root folder in the repo.
The buildpath
attribute is set to /
to run and build the app
from the monorepo project root. The baseDirectory
attribute is the relative
path of buildpath
.
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*
An app using the following example build specification, will be built under the project
root and the build artifacts will be located at
/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
Setting the AMPLIFY_MONOREPO_APP_ROOT environment variable
When you deploy an app stored in a monorepo, the app's
AMPLIFY_MONOREPO_APP_ROOT
environment variable must have the same value as
the path of the app root, relative to the root of your repository. For example, a monorepo
named ExampleMonorepo
with a root folder named apps
, that
contains, app1
, app2
, and app3
has the following
directory structure:
ExampleMonorepo apps app1 app2 app3
In this example, the value of the AMPLIFY_MONOREPO_APP_ROOT
environment
variable for app1
is apps/app1
.
When you deploy a monorepo app using the Amplify console, the console automatically
sets the AMPLIFY_MONOREPO_APP_ROOT
environment variable using the value that
you specify for the path to the app's root. However, if your monorepo app already exists in
Amplify or is deployed using AWS CloudFormation, you must manually set the
AMPLIFY_MONOREPO_APP_ROOT
environment variable in the Environment
variables section in the Amplify console.
Setting the AMPLIFY_MONOREPO_APP_ROOT environment variable automatically during deployment
The following instructions demonstrate how to deploy a monorepo app with the Amplify
console. Amplify automatically sets the AMPLIFY_MONOREPO_APP_ROOT
environment variable using the app's root folder that you specify in the console.
To deploy a monorepo app with the Amplify console
-
Sign in to the AWS Management Console and open the Amplify console
. -
Choose Create new app in the upper right corner.
-
On the Start building with Amplify page, choose your Git provider, then choose Next.
-
On the Add repository branch page, do the following:
-
Choose the name of your repository from the list.
-
Choose the name of the branch to use.
-
Select My app is a monorepo
-
Enter the path to your app in your monorepo, for example,
apps/app1
. -
Choose Next.
-
-
On the App settings page, you can use the default settings or customize the build settings for your app. In the Environment variables section, Amplify sets
AMPLIFY_MONOREPO_APP_ROOT
to the path you specified in step 4d. -
Choose Next.
-
On the Review page, choose Save and deploy.
Setting the AMPLIFY_MONOREPO_APP_ROOT environment variable for an existing app
Use the following instructions to manually set the
AMPLIFY_MONOREPO_APP_ROOT
environment variable for an app that is already
deployed to Amplify, or has been created using CloudFormation.
To set the AMPLIFY_MONOREPO_APP_ROOT environment variable for an existing app
-
Sign in to the AWS Management Console and open the Amplify console
. -
Choose the name of the app to set the environment variable for.
-
In the navigation pane, choose Hosting, and then choose Environment variables.
-
On the Environment variables page, choose Manage variables.
-
In the Manage variables section, do the following:
-
Choose Add new.
-
For Variable, enter the key
AMPLIFY_MONOREPO_APP_ROOT
. -
For Value, enter the path to the app, for example
apps/app1
. -
For Branch, by default Amplify applies the environment variable to all branches.
-
-
Choose Save.
Configuring Turborepo and pnpm monorepo apps
The Turborepo and pnpm workspace monorepo build tools get configuration information from
.npmrc
files. When you deploy a monorepo app created with one of
these tools, you must have an .npmrc
file in your project root
directory.
In the .npmrc
file, set the linker for installing Node packages to
hoisted
. You can copy the following line to your file.
node-linker=hoisted
For more information about .npmrc
files and settings, see pnpm .npmrc
Pnpm is not included in the Amplify default build container. For pnpm workspace and
Turborepo apps, you must add a command to install pnpm in the preBuild
phase of
your app's build settings.
The following example excerpt from a build specification shows a preBuild
phase with a command to install pnpm.
version: 1 applications: - frontend: phases: preBuild: commands: - npm install -g pnpm