---
title: Build lifecycle hooks
description: Learn how to use the EAS Build lifecycle hooks with npm to customize your build process.
maxHeadingDepth: 4
---
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](/build-reference/android-builds/) and the [iOS build process](/build-reference/ios-builds/).
> **warning** The lifecycle hooks are not executed by the build process in [custom builds](/custom-builds/get-started/). 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 hook | Description |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `eas-build-pre-install` | Executed before EAS Build runs `npm install`. |
| `eas-build-post-install` | The behavior depends on the platform and project type. <br/> <br/> For Android, runs once after the following commands have all completed: `npm install` and `npx expo prebuild` (if needed).<br/><br/> For iOS, runs once after the following commands have all completed: `npm install`, `npx expo prebuild` (if needed), and `pod install`. |
| `eas-build-on-success` | This hook is triggered at the end of the build process if the build was successful. |
| `eas-build-on-error` | This hook is triggered at the end of the build process if the build failed. |
| `eas-build-on-complete` | This 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-cancel` | This hook is triggered if the build is canceled. |
An example of how a **package.json** can look when using one or more lifecycle hooks:
```json 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"
/* @hide ... */ /* @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
```json package.json
{
"name": "my-app",
"scripts": {
"eas-build-pre-install": "./pre-install",
"start": "expo start"
/* @hide ... */ /* @end */
},
"dependencies": {
/* @hide ... */
/* @end */
}
}
```
```bash 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 <CODE>git-lfs</CODE> on macOS workers</>}>
The following script installs [`git-lfs`](https://git-lfs.com/) if it is not yet installed. This is useful in some cases where `git-lfs` is required to install certain CocoaPods.
```bash 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
```json package.json
{
"name": "my-app",
"scripts": {
"eas-build-pre-install": "node pre-install.js",
"start": "expo start"
// ...
},
"dependencies": {
// ...
}
}
```
```js 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');
}
```