# XcodeGen Complete Reference ## Full project.yml Structure ```yaml name: ProjectName options: bundleIdPrefix: com.company deploymentTarget: iOS: "16.0" macOS: "13.0" xcodeVersion: "16.0" generateEmptyDirectories: true createIntermediateGroups: true settings: base: SWIFT_VERSION: "6.0" MARKETING_VERSION: "1.0.0" CURRENT_PROJECT_VERSION: "1" packages: # Basic package PackageName: url: https://github.com/org/repo from: "1.0.0" # Exact version ExactPackage: url: https://github.com/org/repo exactVersion: "2.0.0" # Branch BranchPackage: url: https://github.com/org/repo branch: main # Local package LocalPackage: path: ../LocalPackage targets: MainApp: type: application platform: iOS sources: - path: Sources excludes: - "**/.DS_Store" - "**/Tests/**" - path: Resources type: folder settings: base: INFOPLIST_FILE: Sources/Info.plist PRODUCT_BUNDLE_IDENTIFIER: com.company.app ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME: AccentColor LD_RUNPATH_SEARCH_PATHS: "$(inherited) @executable_path/Frameworks" ENABLE_BITCODE: NO CODE_SIGN_STYLE: Automatic DEVELOPMENT_TEAM: TEAM_ID configs: Debug: SWIFT_OPTIMIZATION_LEVEL: -Onone Release: SWIFT_OPTIMIZATION_LEVEL: -O dependencies: # SPM package - package: PackageName # SPM package with explicit product - package: Firebase product: FirebaseAnalytics # Another target - target: Framework # System framework - framework: UIKit.framework # SDK - sdk: CoreLocation.framework preBuildScripts: - name: "Run Script" script: | echo "Pre-build script" runOnlyWhenInstalling: false postBuildScripts: - name: "Post Build" script: | echo "Post-build script" Tests: type: bundle.unit-test platform: iOS sources: - path: Tests dependencies: - target: MainApp settings: base: TEST_HOST: "$(BUILT_PRODUCTS_DIR)/MainApp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/MainApp" BUNDLE_LOADER: "$(TEST_HOST)" ``` ## Target Types | Type | Description | |------|-------------| | `application` | iOS/macOS app | | `framework` | Dynamic framework | | `staticFramework` | Static framework | | `bundle.unit-test` | Unit test bundle | | `bundle.ui-testing` | UI test bundle | | `app-extension` | App extension | | `watch2-app` | watchOS app | | `widget-extension` | Widget extension | ## Build Settings Reference ### Common Settings ```yaml settings: base: # Versioning MARKETING_VERSION: "1.0.0" CURRENT_PROJECT_VERSION: "1" # Swift SWIFT_VERSION: "6.0" SWIFT_STRICT_CONCURRENCY: complete # Signing CODE_SIGN_STYLE: Automatic DEVELOPMENT_TEAM: TEAM_ID CODE_SIGN_IDENTITY: "Apple Development" # Deployment IPHONEOS_DEPLOYMENT_TARGET: "16.0" TARGETED_DEVICE_FAMILY: "1,2" # 1=iPhone, 2=iPad # Build ENABLE_BITCODE: NO DEBUG_INFORMATION_FORMAT: dwarf-with-dsym # Paths LD_RUNPATH_SEARCH_PATHS: "$(inherited) @executable_path/Frameworks" ``` ### Per-Configuration Settings ```yaml settings: configs: Debug: SWIFT_OPTIMIZATION_LEVEL: -Onone SWIFT_ACTIVE_COMPILATION_CONDITIONS: DEBUG MTL_ENABLE_DEBUG_INFO: INCLUDE_SOURCE Release: SWIFT_OPTIMIZATION_LEVEL: -O SWIFT_COMPILATION_MODE: wholemodule VALIDATE_PRODUCT: YES ``` ## Info.plist Keys Common keys to add: ```xml NSCameraUsageDescription Camera access description NSMicrophoneUsageDescription Microphone access description NSPhotoLibraryUsageDescription Photo library access description UIBackgroundModes audio location UISupportedInterfaceOrientations UIInterfaceOrientationPortrait ```