Build lifecycle hooks

Edit this page

Learn how to use the EAS Build lifecycle hooks with npm to customize your build process.


EAS Build lifecycle npm hooks allows you to customize your build process by running scripts before or after the build process.

For better understanding, see the Android build process and the iOS build process.

The lifecycle hooks are not executed by the build process in custom builds. They need to be manually extracted and called by the build steps during the process.

EAS Build lifecycle hooks

There are six EAS Build lifecycle npm hooks available. To use, them, you can set them in your package.json.

Build Lifecycle npm hookDescription
eas-build-pre-installExecuted before EAS Build runs npm install.
eas-build-post-installThe behavior depends on the platform and project type.

For Android, runs once after the following commands have all completed: npm install and npx expo prebuild (if needed).

For iOS, runs once after the following commands have all completed: npm install, npx expo prebuild (if needed), and pod install.
eas-build-on-successThis hook is triggered at the end of the build process if the build was successful.
eas-build-on-errorThis hook is triggered at the end of the build process if the build failed.
eas-build-on-completeThis hook is triggered at the end of the build process. You can check the build's status with the EAS_BUILD_STATUS environment variable. It's either finished or errored.
eas-build-on-cancelThis hook is triggered if the build is canceled.

An example of how a package.json can look when using one or more lifecycle hooks:

package.json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "echo 123",
    "eas-build-post-install": "echo 456",
    "eas-build-on-success": "echo 789",
    "eas-build-on-error": "echo 012",
    "eas-build-on-cancel": "echo 345",
    "start": "expo start",
    "test": "jest"
  },
  "dependencies": {
    "expo": "51.0.0"
    %%placeholder-start%%... %%placeholder-end%%
  }
}

Platform-specific hook behavior

To run a script (or some part of a script) only for Android or iOS builds, you can fork the behavior depending on the platform within the script. See the following common examples to do this through a shell script or a Node script.

Examples

package.json and shell script

package.json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "./pre-install",
    "start": "expo start"
    %%placeholder-start%%... %%placeholder-end%%
  },
  "dependencies": {
    %%placeholder-start%%... %%placeholder-end%%
  }
}
pre-install
#!/bin/bash

# This is a file called "pre-install" in the root of the project

if [[ "$EAS_BUILD_PLATFORM" == "android" ]]; then
  echo "Run commands for Android builds here"
elif [[ "$EAS_BUILD_PLATFORM" == "ios" ]]; then
  echo "Run commands for iOS builds here"
fi
Example: Pre-install script that installs git-lfs on macOS workers

The following script installs git-lfs if it is not yet installed. This is useful in some cases where git-lfs is required to install certain CocoaPods.

pre-install
if [[ "$EAS_BUILD_PLATFORM" == "ios" ]]; then
  if brew list git-lfs > /dev/null 2>&1; then
    echo "=====> git-lfs is already installed."
  else
    echo "=====> Installing git-lfs"
    HOMEBREW_NO_AUTO_UPDATE=1 brew install git-lfs
    git lfs install
  fi
fi

package.json and Node script

package.json
{
  "name": "my-app",
  "scripts": {
    "eas-build-pre-install": "node pre-install.js",
    "start": "expo start"
    // ...
  },
  "dependencies": {
    // ...
  }
}
pre-install.js
// Create a file called "pre-install.js" at the root of the project

if (process.env.EAS_BUILD_PLATFORM === 'android') {
  console.log('Run commands for Android builds here');
} else if (process.env.EAS_BUILD_PLATFORM === 'ios') {
  console.log('Run commands for iOS builds here');
}