Build Issues Diagnostics
Systematic debugging for SPM resolution, "No such module", and dependency conflicts. 80% of persistent build failures are dependency resolution issues, not code bugs.
Diagnostic Decision Table
| Error | Likely Cause | First Check |
|---|---|---|
| "No such module" after adding package | SPM cache stale | Clear package caches |
| "Multiple commands produce" | Duplicate file in targets | Check target membership |
| Build works locally, fails on CI | Environment/cache difference | Compare Podfile.lock |
| SPM resolution hangs | Package cache corruption | Delete .build and DerivedData |
| Framework version conflicts | Transitive dependency issue | Check Package.resolved |
Mandatory First Checks
# 1. Check Derived Data size (>10GB = stale)
du -sh ~/Library/Developer/Xcode/DerivedData
# 2. Check for zombie xcodebuild processes
ps aux | grep xcodebuild | grep -v grep
# 3. List available schemes
xcodebuild -listDecision Tree
Build failing?
|-- "No such module XYZ"?
| |-- After adding SPM package? -> Clean + reset package caches
| |-- After pod install? -> Check Podfile.lock conflicts
| |-- Framework not found? -> Check FRAMEWORK_SEARCH_PATHS
|
|-- "Multiple commands produce"?
| |-- Duplicate files in target membership -> Check File Inspector
|
|-- SPM resolution hangs?
| |-- Clear package caches + Derived Data
|
|-- Version conflicts?
|-- Use dependency resolution strategies belowQuick Fixes
SPM Package Not Found
# Nuclear clean
rm -rf ~/Library/Developer/Xcode/DerivedData
rm -rf ~/Library/Caches/org.swift.swiftpm
# Reset packages in project
xcodebuild -resolvePackageDependencies
# Clean build
xcodebuild clean build -scheme YourSchemeCocoaPods Conflicts
# Check what versions were installed
cat Podfile.lock | grep -A 2 "PODS:"
# Clean reinstall
rm -rf Pods/
rm Podfile.lock
pod install
# Always open workspace (not project)
open YourApp.xcworkspaceMultiple Commands Produce Error
- Open Xcode
- Select file in navigator
- File Inspector > Target Membership
- Uncheck duplicate targets
- Or: Build Phases > Copy Bundle Resources > remove duplicates
Framework Search Paths
# Show all build settings
xcodebuild -showBuildSettings -scheme YourScheme | grep FRAMEWORK_SEARCH_PATHSFix in Xcode:
- Target > Build Settings
- Search "Framework Search Paths"
- Add:
$(PROJECT_DIR)/Frameworks(recursive)
Dependency Resolution Strategies
Strategy 1: Lock to Specific Versions
# Podfile - exact versions
pod 'Alamofire', '5.8.0'
pod 'SwiftyJSON', '~> 5.0.0' # Any 5.0.x// Package.swift - exact versions
.package(url: "...", exact: "1.2.3")Strategy 2: Use Version Ranges
// Package.swift
.package(url: "...", from: "1.2.0") // 1.2.0 and higher
.package(url: "...", .upToNextMajor(from: "1.0.0")) // 1.x.x but not 2.0Strategy 3: Reset SPM Resolution
# Clear package caches
rm -rf .build
rm Package.resolved
# Re-resolve
swift package resolveDebug vs Release Differences
# Compare configurations
xcodebuild -showBuildSettings -configuration Debug > debug.txt
xcodebuild -showBuildSettings -configuration Release > release.txt
diff debug.txt release.txtCommon culprits:
- SWIFT_OPTIMIZATION_LEVEL (-Onone vs -O)
- ENABLE_TESTABILITY (YES in Debug, NO in Release)
- DEBUG preprocessor flag
Command Reference
# CocoaPods
pod install # Install dependencies
pod update # Update to latest versions
pod outdated # Check for updates
pod deintegrate # Remove CocoaPods from project
# Swift Package Manager
swift package resolve # Resolve dependencies
swift package update # Update dependencies
swift package show-dependencies # Show dependency tree
xcodebuild -resolvePackageDependencies # Xcode's SPM resolve
# Xcode Build
xcodebuild clean # Clean build folder
xcodebuild -list # List schemes and targets
xcodebuild -showBuildSettings # Show all build settingsCommon Mistakes
Not Committing Lockfiles
# BAD: .gitignore includes lockfiles
Podfile.lock
Package.resolved
# These should be committed for reproducible buildsUsing "Latest" Version
# BAD: No version specified
pod 'Alamofire' # Breaking changes when updated
# GOOD: Explicit version
pod 'Alamofire', '~> 5.8'Opening Project Instead of Workspace
# BAD (with CocoaPods)
open YourApp.xcodeproj
# GOOD
open YourApp.xcworkspaceVerification Checklist
After applying fix:
- Build succeeds with clean Derived Data
- All dependencies resolve to expected versions
- Both Debug and Release configurations build
- CI builds match local builds
- Lockfiles committed to source control