Adds a comprehensive clean script that removes all build artifacts, caches, and dependencies to help reproduce build issues across different development environments. The script cleans: - TypeScript build output (dist/) - iOS plugin artifacts (Pods, Podfile.lock, build dirs) - Android plugin artifacts (build dirs, optional .gradle cache) - Test app artifacts (node_modules, dist/, iOS/Android builds) - Optional: Xcode DerivedData, Gradle cache, node_modules reinstall Usage: ./scripts/clean-build.sh # Basic clean ./scripts/clean-build.sh --all # Full clean with reinstall This is particularly useful when troubleshooting build failures that may be environment-specific (different Xcode, CocoaPods, macOS, or Node versions).
272 lines
8.4 KiB
Bash
Executable File
272 lines
8.4 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Exit on error
|
||
set -e
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Logging functions
|
||
log_info() {
|
||
echo -e "${GREEN}[INFO]${NC} $1"
|
||
}
|
||
|
||
log_warn() {
|
||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1"
|
||
}
|
||
|
||
log_step() {
|
||
echo -e "${BLUE}[STEP]${NC} $1"
|
||
}
|
||
|
||
# Parse command line arguments
|
||
REINSTALL_NODE_MODULES=false
|
||
CLEAN_GRADLE_CACHE=false
|
||
CLEAN_DERIVED_DATA=false
|
||
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
--reinstall-node)
|
||
REINSTALL_NODE_MODULES=true
|
||
shift
|
||
;;
|
||
--clean-gradle-cache)
|
||
CLEAN_GRADLE_CACHE=true
|
||
shift
|
||
;;
|
||
--clean-derived-data)
|
||
CLEAN_DERIVED_DATA=true
|
||
shift
|
||
;;
|
||
--all)
|
||
REINSTALL_NODE_MODULES=true
|
||
CLEAN_GRADLE_CACHE=true
|
||
CLEAN_DERIVED_DATA=true
|
||
shift
|
||
;;
|
||
*)
|
||
log_error "Unknown option: $1"
|
||
echo "Usage: $0 [--reinstall-node] [--clean-gradle-cache] [--clean-derived-data] [--all]"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
log_info "Starting clean build process..."
|
||
log_warn "This will remove all build artifacts and caches"
|
||
|
||
# Step 1: Clean TypeScript build output
|
||
log_step "1. Cleaning TypeScript build output..."
|
||
npm run clean 2>/dev/null || log_warn "npm run clean failed (may not exist)"
|
||
rm -rf dist/
|
||
log_info "✓ TypeScript build output cleaned"
|
||
|
||
# Step 2: Clean iOS plugin build artifacts
|
||
log_step "2. Cleaning iOS plugin build artifacts..."
|
||
if [ -d "ios" ]; then
|
||
cd ios
|
||
|
||
# Remove Pods and Podfile.lock
|
||
if [ -d "Pods" ]; then
|
||
rm -rf Pods/
|
||
log_info " ✓ Removed Pods/"
|
||
fi
|
||
if [ -f "Podfile.lock" ]; then
|
||
rm -f Podfile.lock
|
||
log_info " ✓ Removed Podfile.lock"
|
||
fi
|
||
|
||
# Remove Xcode build artifacts
|
||
if [ -d "DailyNotificationPlugin.xcworkspace/xcuserdata" ]; then
|
||
rm -rf DailyNotificationPlugin.xcworkspace/xcuserdata/
|
||
log_info " ✓ Removed workspace user data"
|
||
fi
|
||
if [ -d "DailyNotificationPlugin.xcodeproj/xcuserdata" ]; then
|
||
rm -rf DailyNotificationPlugin.xcodeproj/xcuserdata/
|
||
log_info " ✓ Removed project user data"
|
||
fi
|
||
|
||
# Remove build directories
|
||
find . -type d -name "build" -exec rm -rf {} + 2>/dev/null || true
|
||
find . -type d -name "DerivedData" -exec rm -rf {} + 2>/dev/null || true
|
||
|
||
cd ..
|
||
log_info "✓ iOS plugin cleaned"
|
||
fi
|
||
|
||
# Step 3: Clean Android plugin build artifacts
|
||
log_step "3. Cleaning Android plugin build artifacts..."
|
||
if [ -d "android" ]; then
|
||
cd android
|
||
|
||
# Remove build directories
|
||
if [ -d "build" ]; then
|
||
rm -rf build/
|
||
log_info " ✓ Removed build/"
|
||
fi
|
||
if [ -d "app/build" ]; then
|
||
rm -rf app/build/
|
||
log_info " ✓ Removed app/build/"
|
||
fi
|
||
if [ -d ".gradle" ]; then
|
||
if [ "$CLEAN_GRADLE_CACHE" = true ]; then
|
||
rm -rf .gradle/
|
||
log_info " ✓ Removed .gradle/ (cache cleaned)"
|
||
else
|
||
log_info " ℹ .gradle/ preserved (use --clean-gradle-cache to remove)"
|
||
fi
|
||
fi
|
||
|
||
cd ..
|
||
log_info "✓ Android plugin cleaned"
|
||
fi
|
||
|
||
# Step 4: Clean test app build artifacts
|
||
log_step "4. Cleaning test app build artifacts..."
|
||
if [ -d "test-apps/daily-notification-test" ]; then
|
||
cd test-apps/daily-notification-test
|
||
|
||
# Remove symlink
|
||
if [ -L "node_modules/@timesafari/daily-notification-plugin" ]; then
|
||
rm -f node_modules/@timesafari/daily-notification-plugin
|
||
log_info " ✓ Removed plugin symlink"
|
||
fi
|
||
|
||
# Remove node_modules (if requested)
|
||
if [ "$REINSTALL_NODE_MODULES" = true ]; then
|
||
if [ -d "node_modules" ]; then
|
||
# Use find to handle permission issues on macOS
|
||
find node_modules -delete 2>/dev/null || rm -rf node_modules/ 2>/dev/null || {
|
||
log_warn " ⚠ Some files in node_modules/ could not be deleted (permission issues)"
|
||
log_warn " ℹ You may need to manually remove node_modules/ or use sudo"
|
||
}
|
||
log_info " ✓ Removed node_modules/ (will reinstall)"
|
||
fi
|
||
fi
|
||
|
||
# Remove build output
|
||
if [ -d "dist" ]; then
|
||
rm -rf dist/
|
||
log_info " ✓ Removed dist/"
|
||
fi
|
||
|
||
# Clean iOS test app
|
||
if [ -d "ios" ]; then
|
||
cd ios/App
|
||
|
||
# Remove Pods and Podfile.lock
|
||
if [ -d "Pods" ]; then
|
||
rm -rf Pods/
|
||
log_info " ✓ Removed iOS test app Pods/"
|
||
fi
|
||
if [ -f "Podfile.lock" ]; then
|
||
rm -f Podfile.lock
|
||
log_info " ✓ Removed iOS test app Podfile.lock"
|
||
fi
|
||
|
||
# Remove Xcode build artifacts
|
||
if [ -d "App.xcworkspace/xcuserdata" ]; then
|
||
rm -rf App.xcworkspace/xcuserdata/
|
||
fi
|
||
if [ -d "App.xcodeproj/xcuserdata" ]; then
|
||
rm -rf App.xcodeproj/xcuserdata/
|
||
fi
|
||
|
||
# Remove build directories
|
||
find . -type d -name "build" -exec rm -rf {} + 2>/dev/null || true
|
||
|
||
cd ../..
|
||
fi
|
||
|
||
# Clean Android test app
|
||
if [ -d "android" ]; then
|
||
cd android
|
||
|
||
# Remove build directories
|
||
if [ -d "build" ]; then
|
||
rm -rf build/
|
||
log_info " ✓ Removed Android test app build/"
|
||
fi
|
||
if [ -d "app/build" ]; then
|
||
rm -rf app/build/
|
||
log_info " ✓ Removed Android test app app/build/"
|
||
fi
|
||
if [ -d "capacitor-cordova-android-plugins/build" ]; then
|
||
rm -rf capacitor-cordova-android-plugins/build/
|
||
log_info " ✓ Removed Android test app plugin build/"
|
||
fi
|
||
if [ -d ".gradle" ] && [ "$CLEAN_GRADLE_CACHE" = true ]; then
|
||
rm -rf .gradle/
|
||
log_info " ✓ Removed Android test app .gradle/ (cache cleaned)"
|
||
fi
|
||
|
||
cd ..
|
||
fi
|
||
|
||
cd ../..
|
||
log_info "✓ Test app cleaned"
|
||
fi
|
||
|
||
# Step 5: Clean Xcode DerivedData (if requested)
|
||
if [ "$CLEAN_DERIVED_DATA" = true ]; then
|
||
log_step "5. Cleaning Xcode DerivedData..."
|
||
DERIVED_DATA_DIR="$HOME/Library/Developer/Xcode/DerivedData"
|
||
if [ -d "$DERIVED_DATA_DIR" ]; then
|
||
# Find and remove project-specific DerivedData
|
||
find "$DERIVED_DATA_DIR" -maxdepth 1 -type d \( -name "*DailyNotification*" -o -name "*daily-notification*" \) -exec rm -rf {} + 2>/dev/null || true
|
||
log_info "✓ Xcode DerivedData cleaned (project-specific)"
|
||
log_warn " ℹ To clean all DerivedData, manually delete: $DERIVED_DATA_DIR"
|
||
else
|
||
log_warn " ℹ DerivedData directory not found: $DERIVED_DATA_DIR"
|
||
fi
|
||
fi
|
||
|
||
# Step 6: Reinstall node_modules (if requested)
|
||
if [ "$REINSTALL_NODE_MODULES" = true ]; then
|
||
log_step "6. Reinstalling node_modules..."
|
||
|
||
# Root node_modules
|
||
if [ -d "node_modules" ]; then
|
||
find node_modules -delete 2>/dev/null || rm -rf node_modules/ 2>/dev/null || {
|
||
log_warn " ⚠ Some files in root node_modules/ could not be deleted (permission issues)"
|
||
log_warn " ℹ You may need to manually remove node_modules/ or use sudo"
|
||
}
|
||
fi
|
||
log_info " Installing root dependencies..."
|
||
npm install
|
||
|
||
# Test app node_modules
|
||
if [ -d "test-apps/daily-notification-test" ]; then
|
||
cd test-apps/daily-notification-test
|
||
log_info " Installing test app dependencies..."
|
||
npm install
|
||
cd ../..
|
||
fi
|
||
|
||
log_info "✓ Dependencies reinstalled"
|
||
fi
|
||
|
||
log_info ""
|
||
log_info "════════════════════════════════════════════════════════════"
|
||
log_info "Clean build complete! 🎉"
|
||
log_info "════════════════════════════════════════════════════════════"
|
||
log_info ""
|
||
log_info "Next steps:"
|
||
log_info " 1. Run: ./scripts/build-native.sh --platform all"
|
||
log_info " 2. Or run: ./scripts/build-native.sh --platform ios"
|
||
log_info " 3. Or run: ./scripts/build-native.sh --platform android"
|
||
log_info ""
|
||
log_info "Options used:"
|
||
[ "$REINSTALL_NODE_MODULES" = true ] && log_info " ✓ Reinstalled node_modules"
|
||
[ "$CLEAN_GRADLE_CACHE" = true ] && log_info " ✓ Cleaned Gradle cache"
|
||
[ "$CLEAN_DERIVED_DATA" = true ] && log_info " ✓ Cleaned Xcode DerivedData"
|
||
log_info ""
|