scripts/pod-install.sh
Rama main · réplica de lectura del repositorio original.
#!/bin/bash
# This script ensures pod installs respect Podfile.lock as the source of truth.
# Specifically, the podspecs for pods listed under the 'EXTERNAL SOURCES' key in the Podfile.lock are cached in the `ios/Pods/Local Podspecs` directory.
# While caching results in significantly faster installs, if a cached podspec doesn't match the version in Podfile.lock, pod install will fail.
# To prevent this, this script will find and delete any mismatched cached podspecs before running pod install
# Exit immediately if any command exits with a non-zero status
set -e
BLUE='\033[1;34m'
NC='\033[0m'
# Go to project root
START_DIR="$(pwd)"
ROOT_DIR="$(dirname "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)")"
cd "$ROOT_DIR" || exit 1
# Cleanup and exit
# param - status code
function cleanupAndExit {
cd "$START_DIR" || exit 1
exit "$1"
}
source scripts/shellUtils.sh
# Check if bundle is installed
if ! bundle --version > /dev/null 2>&1; then
error 'bundle is not installed. Please install bundle and try again'
cleanupAndExit 1
fi
# Check if jq is installed
if ! jq --version > /dev/null 2>&1; then
error 'jq is not installed. Please install jq and try again'
cleanupAndExit 1
fi
# Check if yq is installed
if ! yq --version > /dev/null 2>&1; then
error 'yq is not installed. Please install yq and try again'
cleanupAndExit 1
fi
# See if we're in the HybridApp repo
IS_HYBRID_APP_REPO=$(scripts/is-hybrid-app.sh)
# See if we should force standalone NewDot build
NEW_DOT_FLAG="${STANDALONE_NEW_DOT:-false}"
if [[ "$IS_HYBRID_APP_REPO" == "true" && "$NEW_DOT_FLAG" == "false" ]]; then
echo -e "${BLUE}Executing npm run pod-install for HybridApp...${NC}"
# Navigate to the OldDot repository, and run bundle install and pod install
cd Mobile-Expensify/ios
bundle install
bundle exec pod install
exit 0
fi
echo -e "${BLUE}Executing npm run pod-install for standalone NewDot...${NC}"
CACHED_PODSPEC_DIR='';
if [[ "$IS_HYBRID_APP_REPO" == "true" ]]; then
CACHED_PODSPEC_DIR='Mobile-Expensify/ios/Pods/Local Podspecs'
else
CACHED_PODSPEC_DIR='ios/Pods/Local Podspecs'
fi
readonly CACHED_PODSPEC_DIR
if [ -d "$CACHED_PODSPEC_DIR" ]; then
info "Verifying pods from Podfile.lock match local podspecs..."
# Convert podfile.lock to json since yq is missing some features of jq (namely, if/else)
PODFILE_LOCK_AS_JSON="$(yq -o=json ios/Podfile.lock)"
# Retrieve a list of pods and their versions from Podfile.lock
declare PODS_FROM_LOCKFILE
if ! read_lines_into_array PODS_FROM_LOCKFILE < <(jq -r '.PODS | map (if (.|type) == "object" then keys[0] else . end) | .[]' < <(echo "$PODFILE_LOCK_AS_JSON")); then
error "Error: Could not parse pod versions from Podfile.lock"
cleanupAndExit 1
fi
for CACHED_PODSPEC_PATH in "$CACHED_PODSPEC_DIR"/*; do
if [ -f "$CACHED_PODSPEC_PATH" ]; then
# The next two lines use bash parameter expansion to get just the pod name from the path
# i.e: `ios/Pods/Local Podspecs/hermes-engine.podspec.json` to just `hermes-engine`
# It extracts the part of the string between the last `/` and the first `.`
CACHED_POD_NAME="${CACHED_PODSPEC_PATH##*/}"
CACHED_POD_NAME="${CACHED_POD_NAME%%.*}"
info "🫛 Verifying local pod $CACHED_POD_NAME"
CACHED_POD_VERSION="$(jq -r '.version' < <(cat "$CACHED_PODSPEC_PATH"))"
for POD_FROM_LOCKFILE in "${PODS_FROM_LOCKFILE[@]}"; do
# Extract the pod name and version that was parsed from the lockfile. POD_FROM_LOCKFILE looks like `PodName (version)`
IFS=' ' read -r POD_NAME_FROM_LOCKFILE POD_VERSION_FROM_LOCKFILE <<< "$POD_FROM_LOCKFILE"
if [[ "$CACHED_POD_NAME" == "$POD_NAME_FROM_LOCKFILE" ]]; then
if [[ "$POD_VERSION_FROM_LOCKFILE" != "($CACHED_POD_VERSION)" ]]; then
clear_last_line
info "⚠️ found mismatched pod: $CACHED_POD_NAME, removing local podspec $CACHED_PODSPEC_PATH"
rm "$CACHED_PODSPEC_PATH"
echo -e "\n"
fi
break
fi
done
clear_last_line
fi
done
fi
cd ios || cleanupAndExit 1
bundle exec pod install
# Go back to where we started
cleanupAndExit 0