Showing preview only (1,991K chars total). Download the full file or copy to clipboard to get everything.
Repository: yonaskolb/XcodeGen
Branch: master
Commit: 3e6e5e387859
Files: 412
Total size: 1.8 MB
Directory structure:
gitextract_4pjcqkl7/
├── .gitattributes
├── .github/
│ └── workflows/
│ └── ci.yml
├── .gitignore
├── .swiftformat
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Docs/
│ ├── Examples.md
│ ├── FAQ.md
│ ├── ProjectSpec.md
│ └── Usage.md
├── LICENSE
├── Makefile
├── Package.resolved
├── Package.resources
├── Package.swift
├── README.md
├── RELEASE.md
├── SettingPresets/
│ ├── Configs/
│ │ ├── debug.yml
│ │ └── release.yml
│ ├── Platforms/
│ │ ├── iOS.yml
│ │ ├── macOS.yml
│ │ ├── tvOS.yml
│ │ ├── visionOS.yml
│ │ └── watchOS.yml
│ ├── Product_Platform/
│ │ ├── app-extension_macOS.yml
│ │ ├── application_iOS.yml
│ │ ├── application_macOS.yml
│ │ ├── application_tvOS.yml
│ │ ├── application_visionOS.yml
│ │ ├── application_watchOS.yml
│ │ └── bundle.unit-test_macOS.yml
│ ├── Products/
│ │ ├── app-extension.intents-service.yml
│ │ ├── app-extension.messages.yml
│ │ ├── app-extension.yml
│ │ ├── bundle.ui-testing.yml
│ │ ├── bundle.unit-test.yml
│ │ ├── framework.static.yml
│ │ ├── framework.yml
│ │ ├── library.static.yml
│ │ ├── tv-app-extension.yml
│ │ └── watchkit2-extension.yml
│ ├── SupportedDestinations/
│ │ ├── iOS.yml
│ │ ├── macCatalyst.yml
│ │ ├── macOS.yml
│ │ ├── tvOS.yml
│ │ ├── visionOS.yml
│ │ └── watchOS.yml
│ └── base.yml
├── Sources/
│ ├── ProjectSpec/
│ │ ├── AggregateTarget.swift
│ │ ├── Array+Extension.swift
│ │ ├── Breakpoint.swift
│ │ ├── BuildPhaseSpec.swift
│ │ ├── BuildRule.swift
│ │ ├── BuildScript.swift
│ │ ├── BuildSettingsContainer.swift
│ │ ├── BuildSettingsExtractor.swift
│ │ ├── BuildToolPlugin.swift
│ │ ├── CacheFile.swift
│ │ ├── Config.swift
│ │ ├── Decoding.swift
│ │ ├── Dependency.swift
│ │ ├── DeploymentTarget.swift
│ │ ├── Dictionary+Extension.swift
│ │ ├── Encoding.swift
│ │ ├── FileType.swift
│ │ ├── GroupOrdering.swift
│ │ ├── Linkage.swift
│ │ ├── NSRegularExpressionExtensions.swift
│ │ ├── PathContainer.swift
│ │ ├── Platform.swift
│ │ ├── Plist.swift
│ │ ├── Project.swift
│ │ ├── ProjectReference.swift
│ │ ├── ProjectTarget.swift
│ │ ├── Scheme.swift
│ │ ├── Settings.swift
│ │ ├── SourceType.swift
│ │ ├── SpecFile.swift
│ │ ├── SpecLoader.swift
│ │ ├── SpecOptions.swift
│ │ ├── SpecParsingError.swift
│ │ ├── SpecValidation.swift
│ │ ├── SpecValidationError.swift
│ │ ├── SupportedDestination.swift
│ │ ├── SwiftPackage.swift
│ │ ├── Target.swift
│ │ ├── TargetReference.swift
│ │ ├── TargetScheme.swift
│ │ ├── TargetSource.swift
│ │ ├── Template.swift
│ │ ├── TestPlan.swift
│ │ ├── TestTargeReference.swift
│ │ ├── VersionExtensions.swift
│ │ ├── XCProjExtensions.swift
│ │ └── Yaml.swift
│ ├── TestSupport/
│ │ └── TestHelpers.swift
│ ├── XcodeGen/
│ │ └── main.swift
│ ├── XcodeGenCLI/
│ │ ├── Arguments.swift
│ │ ├── Commands/
│ │ │ ├── CacheCommand.swift
│ │ │ ├── DumpCommand.swift
│ │ │ ├── GenerateCommand.swift
│ │ │ └── ProjectCommand.swift
│ │ ├── GenerationError.swift
│ │ └── XcodeGenCLI.swift
│ ├── XcodeGenCore/
│ │ ├── ArrayExtensions.swift
│ │ ├── Atomic.swift
│ │ ├── Glob.swift
│ │ ├── MD5.swift
│ │ ├── PathExtensions.swift
│ │ └── StringDiff.swift
│ └── XcodeGenKit/
│ ├── BreakpointGenerator.swift
│ ├── CarthageDependencyResolver.swift
│ ├── CarthageVersionLoader.swift
│ ├── FileWriter.swift
│ ├── InfoPlistGenerator.swift
│ ├── PBXProjGenerator.swift
│ ├── ProjectFormat.swift
│ ├── ProjectGenerator.swift
│ ├── SchemeGenerator.swift
│ ├── SettingsBuilder.swift
│ ├── SettingsPresetFile.swift
│ ├── SourceGenerator.swift
│ ├── StringCatalogDecoding.swift
│ ├── Version.swift
│ └── XCProjExtensions.swift
├── Tests/
│ ├── FixtureTests/
│ │ └── FixtureTests.swift
│ ├── Fixtures/
│ │ ├── CarthageProject/
│ │ │ ├── .gitignore
│ │ │ ├── Cartfile
│ │ │ ├── Cartfile.resolved
│ │ │ ├── Carthage/
│ │ │ │ └── Build/
│ │ │ │ ├── .Alamofire.version
│ │ │ │ ├── .CarthageTestFixture.version
│ │ │ │ ├── .ReactiveCocoa.version
│ │ │ │ ├── .ReactiveSwift.version
│ │ │ │ └── .Result.version
│ │ │ ├── Project.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── project.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── project.yml
│ │ ├── SPM/
│ │ │ ├── FooFeature/
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ ├── FooDomain/
│ │ │ │ │ └── FooDomain.swift
│ │ │ │ └── FooUI/
│ │ │ │ └── FooUI.swift
│ │ │ ├── SPM/
│ │ │ │ ├── App.xctestplan
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Info.plist
│ │ │ ├── SPM.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ └── swiftpm/
│ │ │ │ │ └── Package.resolved
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── App.xcscheme
│ │ │ ├── SPMTests/
│ │ │ │ └── SPMTests.swift
│ │ │ ├── StaticLibrary/
│ │ │ │ └── StaticLibrary.swift
│ │ │ └── project.yml
│ │ ├── TestProject/
│ │ │ ├── .gitignore
│ │ │ ├── .lldbinit
│ │ │ ├── AnotherProject/
│ │ │ │ ├── AnotherProject.xcodeproj/
│ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ └── project.xcworkspace/
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ └── project.yml
│ │ │ ├── App_Clip/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Clip.entitlements
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ ├── App_Clip_Tests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectTests.swift
│ │ │ ├── App_Clip_UITests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectUITests.swift
│ │ │ ├── App_iOS/
│ │ │ │ ├── App.entitlements
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── App_iOS.xctestplan
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ ├── Localizable.strings
│ │ │ │ │ ├── Localizable.stringsdict
│ │ │ │ │ ├── LocalizedStoryboard.storyboard
│ │ │ │ │ ├── Main.storyboard
│ │ │ │ │ └── excluded-file
│ │ │ │ ├── Configuration.storekit
│ │ │ │ ├── Documentation.docc/
│ │ │ │ │ └── Documentation.md
│ │ │ │ ├── FolderWithDot2.0/
│ │ │ │ │ └── SwiftFileInDotPath.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Model.xcdatamodeld/
│ │ │ │ │ ├── .xccurrentversion
│ │ │ │ │ ├── Model 2.xcdatamodel/
│ │ │ │ │ │ └── contents
│ │ │ │ │ ├── Model 3.xcdatamodel/
│ │ │ │ │ │ └── contents
│ │ │ │ │ └── Model.xcdatamodel/
│ │ │ │ │ └── contents
│ │ │ │ ├── Model.xcmappingmodel/
│ │ │ │ │ └── xcmapping.xml
│ │ │ │ ├── Resource.abc
│ │ │ │ ├── Resource.abcd/
│ │ │ │ │ └── File.json
│ │ │ │ ├── Settings.bundle/
│ │ │ │ │ ├── Root.plist
│ │ │ │ │ └── en.lproj/
│ │ │ │ │ └── Root.strings
│ │ │ │ ├── TestIcon.icon/
│ │ │ │ │ └── icon.json
│ │ │ │ ├── ViewController.swift
│ │ │ │ ├── en.lproj/
│ │ │ │ │ ├── Localizable.strings
│ │ │ │ │ ├── Localizable.stringsdict
│ │ │ │ │ └── LocalizedStoryboard.strings
│ │ │ │ ├── excluded-file
│ │ │ │ ├── inputList.xcfilelist
│ │ │ │ ├── module.modulemap
│ │ │ │ └── outputList.xcfilelist
│ │ │ ├── App_iOS_Tests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectTests.swift
│ │ │ ├── App_iOS_UITests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectUITests.swift
│ │ │ ├── App_macOS/
│ │ │ │ ├── App-Info.plist
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── Main.storyboard
│ │ │ │ └── ViewController.swift
│ │ │ ├── App_macOS_Tests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectTests.swift
│ │ │ ├── App_supportedDestinations/
│ │ │ │ ├── Info.generated.plist
│ │ │ │ ├── Sources/
│ │ │ │ │ ├── MyAppApp.swift
│ │ │ │ │ ├── iOS/
│ │ │ │ │ │ └── ContentView.swift
│ │ │ │ │ └── tvOS/
│ │ │ │ │ └── ContentView.swift
│ │ │ │ ├── Storyboards/
│ │ │ │ │ └── LaunchScreen.storyboard
│ │ │ │ └── TestResources/
│ │ │ │ ├── File_MACCATALYST.swift
│ │ │ │ ├── File_ios.swift
│ │ │ │ ├── File_macOS.swift
│ │ │ │ ├── File_tvOs.swift
│ │ │ │ ├── TVOS/
│ │ │ │ │ └── File_B.swift
│ │ │ │ ├── iOs/
│ │ │ │ │ └── File_A.swift
│ │ │ │ ├── macCatalyst/
│ │ │ │ │ └── File_D.swift
│ │ │ │ └── macos/
│ │ │ │ └── File_C.swift
│ │ │ ├── App_watchOS/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── Interface.storyboard
│ │ │ │ └── Info.plist
│ │ │ ├── App_watchOS Extension/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── Complication.complicationset/
│ │ │ │ │ ├── Circular.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Extra Large.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Modular.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Utilitarian.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ExtensionDelegate.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── InterfaceController.swift
│ │ │ │ ├── NotificationController.swift
│ │ │ │ └── PushNotificationPayload.apns
│ │ │ ├── Cartfile
│ │ │ ├── Cartfile.resolved
│ │ │ ├── Configs/
│ │ │ │ ├── base.xcconfig
│ │ │ │ └── config.xcconfig
│ │ │ ├── CopyFiles/
│ │ │ │ └── Empty.h
│ │ │ ├── CrossOverlayFramework/
│ │ │ │ ├── CrossOverlayFramework.swiftcrossimport/
│ │ │ │ │ └── Framework.swiftoverlay
│ │ │ │ ├── FrameworkFile.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MyFramework.h
│ │ │ │ └── Project.xcodeproj/
│ │ │ │ └── project.pbxproj
│ │ │ ├── DriverKit Driver/
│ │ │ │ ├── Driver.cpp
│ │ │ │ ├── Driver.entitlements
│ │ │ │ ├── Driver.iig
│ │ │ │ └── Info.plist
│ │ │ ├── EndpointSecurity Extension/
│ │ │ │ ├── EndpointSecurity.entitlements
│ │ │ │ ├── Info.plist
│ │ │ │ └── main.swift
│ │ │ ├── ExtensionKit Extension/
│ │ │ │ ├── EntryPoint.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── Intent.swift
│ │ │ ├── FileGroup/
│ │ │ │ └── UnderFileGroup/
│ │ │ │ └── MoreUnder.swift
│ │ │ ├── Folder/
│ │ │ │ ├── Folder1/
│ │ │ │ │ └── file.file
│ │ │ │ └── Folder2/
│ │ │ │ └── file.file
│ │ │ ├── Framework/
│ │ │ │ ├── FrameworkFile.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MyFramework.h
│ │ │ │ └── Project.xcodeproj/
│ │ │ │ └── project.pbxproj
│ │ │ ├── Group/
│ │ │ │ └── File1.swift
│ │ │ ├── Group2/
│ │ │ │ └── File2.swift
│ │ │ ├── Headers/
│ │ │ │ ├── Folder1/
│ │ │ │ │ └── Header2.h
│ │ │ │ └── Header1.h
│ │ │ ├── Mintfile
│ │ │ ├── NestedFiles/
│ │ │ │ └── Foo/
│ │ │ │ └── Nested.swift
│ │ │ ├── Network Extension/
│ │ │ │ ├── FilterDataProvider.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── NetworkExtension.entitlements
│ │ │ │ └── main.swift
│ │ │ ├── Project.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ └── xcshareddata/
│ │ │ │ ├── xcdebugger/
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes/
│ │ │ │ ├── App_Clip.xcscheme
│ │ │ │ ├── App_Scheme.xcscheme
│ │ │ │ ├── App_iOS Production.xcscheme
│ │ │ │ ├── App_iOS Staging.xcscheme
│ │ │ │ ├── App_iOS Test.xcscheme
│ │ │ │ ├── App_macOS.xcscheme
│ │ │ │ ├── App_watchOS.xcscheme
│ │ │ │ ├── DriverKitDriver.xcscheme
│ │ │ │ ├── EndpointSecuritySystemExtension.xcscheme
│ │ │ │ ├── Framework.xcscheme
│ │ │ │ ├── NetworkSystemExtension.xcscheme
│ │ │ │ ├── Tool.xcscheme
│ │ │ │ ├── iMessageApp.xcscheme
│ │ │ │ └── iMessageExtension.xcscheme
│ │ │ ├── Resources/
│ │ │ │ ├── GoogleService-Info.plist
│ │ │ │ └── MyBundle.bundle/
│ │ │ │ └── file.text
│ │ │ ├── SomeFile
│ │ │ ├── StandaloneFiles/
│ │ │ │ ├── Standalone.swift
│ │ │ │ └── StandaloneAssets.xcassets/
│ │ │ │ └── Contents.json
│ │ │ ├── StaticLibrary_ObjC/
│ │ │ │ ├── Module/
│ │ │ │ │ └── module.modulemap
│ │ │ │ ├── StaticLibrary_ObjC.h
│ │ │ │ └── StaticLibrary_ObjC.m
│ │ │ ├── StaticLibrary_Swift/
│ │ │ │ └── StaticLibrary.swift
│ │ │ ├── String Catalogs/
│ │ │ │ └── LocalizableStrings.xcstrings
│ │ │ ├── SyncedFolder/
│ │ │ │ ├── ExcludedFile.swift
│ │ │ │ ├── FeatureATests/
│ │ │ │ │ └── __Snapshots__/
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── FeatureBTests/
│ │ │ │ │ └── __Snapshots__/
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Resources/
│ │ │ │ │ └── .gitkeep
│ │ │ │ └── SyncedFile.swift
│ │ │ ├── SyncedParent/
│ │ │ │ └── SyncedChild/
│ │ │ │ └── SyncedChildFile.swift
│ │ │ ├── Tool/
│ │ │ │ └── main.swift
│ │ │ ├── Utilities/
│ │ │ │ └── MyPlayground.playground/
│ │ │ │ ├── Contents.swift
│ │ │ │ ├── contents.xcplayground
│ │ │ │ └── playground.xcworkspace/
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ ├── Vendor/
│ │ │ │ └── SomeXPCService.xpc/
│ │ │ │ └── Contents/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MacOS/
│ │ │ │ │ └── XPC Service
│ │ │ │ └── _CodeSignature/
│ │ │ │ └── CodeResources
│ │ │ ├── Workspace.xcworkspace/
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ └── swiftpm/
│ │ │ │ └── Package.resolved
│ │ │ ├── XPC Service/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── XPC_Service.h
│ │ │ │ ├── XPC_Service.m
│ │ │ │ ├── XPC_ServiceProtocol.h
│ │ │ │ └── main.m
│ │ │ ├── build.sh
│ │ │ ├── carthage_dynamic.xcconfig
│ │ │ ├── carthage_static.xcconfig
│ │ │ ├── environments.yml
│ │ │ ├── excluded-file
│ │ │ ├── fixtures.xcconfig
│ │ │ ├── iMessageApp/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Info.plist
│ │ │ ├── iMessageExtension/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── iMessage App Icon.stickersiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── MainInterface.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── MessagesViewController.swift
│ │ │ ├── iMessageStickers/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Info.plist
│ │ │ ├── project.yml
│ │ │ ├── scripts/
│ │ │ │ ├── script.sh
│ │ │ │ └── strip-frameworks.sh
│ │ │ └── xcode12_13_and_14_workaround.xcconfig
│ │ ├── duplicated_include/
│ │ │ ├── different_path/
│ │ │ │ └── duplicated_import_root.yml
│ │ │ ├── duplicated_import_root.yml
│ │ │ ├── duplicated_import_sut.yml
│ │ │ └── duplicated_import_transitive.yml
│ │ ├── include_test.json
│ │ ├── include_test.yml
│ │ ├── included.yml
│ │ ├── included_additional.yml
│ │ ├── invalid_configs/
│ │ │ ├── invalid_configs_value_non_mapping_aggregate_targets.yml
│ │ │ ├── invalid_configs_value_non_mapping_setting_groups.yml
│ │ │ ├── invalid_configs_value_non_mapping_settings.yml
│ │ │ └── invalid_configs_value_non_mapping_targets.yml
│ │ ├── legacy_paths_test/
│ │ │ ├── legacy_included_paths_test.yml
│ │ │ └── recursive_include.yml
│ │ ├── legacy_paths_test.yml
│ │ ├── paths_test/
│ │ │ ├── included_paths_test.yml
│ │ │ ├── recursive_test/
│ │ │ │ └── recursive_test.yml
│ │ │ ├── relative_file_groups/
│ │ │ │ ├── TestFile.md
│ │ │ │ └── inc.yml
│ │ │ ├── relative_local_package/
│ │ │ │ ├── LocalPackage/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Package.swift
│ │ │ │ │ └── Sources/
│ │ │ │ │ └── LocalPackage/
│ │ │ │ │ └── LocalPackage.swift
│ │ │ │ └── inc.yml
│ │ │ └── same_relative_path_test/
│ │ │ ├── parent1/
│ │ │ │ ├── parent1.yml
│ │ │ │ └── same/
│ │ │ │ ├── same.yml
│ │ │ │ └── target1/
│ │ │ │ └── target1.yml
│ │ │ ├── parent2/
│ │ │ │ ├── parent2.yml
│ │ │ │ └── same/
│ │ │ │ ├── same.yml
│ │ │ │ └── target2/
│ │ │ │ └── target2.yml
│ │ │ └── same_relative_path_test.yml
│ │ ├── paths_test.yml
│ │ ├── scheme_test/
│ │ │ ├── TestProject.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ └── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ ├── ExternalTarget.xcscheme
│ │ │ │ └── Shared_TargetScheme.xcscheme
│ │ │ └── test_project.yml
│ │ ├── settings_test.yml
│ │ ├── test.xcconfig
│ │ ├── variables_test.yml
│ │ └── yaml.yml
│ ├── LinuxMain.swift
│ ├── PerformanceTests/
│ │ ├── PerformanceTests.swift
│ │ └── TestProject.swift
│ ├── ProjectSpecTests/
│ │ ├── Dictionary+Extension_Tests.swift
│ │ ├── InvalidConfigsFormatTests.swift
│ │ ├── ProjectSpecTests.swift
│ │ └── SpecLoadingTests.swift
│ ├── XcodeGenCoreTests/
│ │ ├── ArrayExtensionsTests.swift
│ │ ├── AtomicTests.swift
│ │ ├── GlobTests.swift
│ │ └── PathExtensionsTests.swift
│ └── XcodeGenKitTests/
│ ├── BreakpointGeneratorTests.swift
│ ├── CarthageDependencyResolverTests.swift
│ ├── PBXProjGeneratorTests.swift
│ ├── ProjectGeneratorTests.swift
│ ├── SchemeGeneratorTests.swift
│ └── SourceGeneratorTests.swift
├── _config.yml
└── scripts/
├── archive.sh
├── build-fixtures.sh
├── diff-fixtures.sh
├── gen-fixtures.sh
└── install.sh
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
CHANGELOG merge=union
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push: {}
pull_request: {}
jobs:
run:
runs-on: macos-15
name: Xcode ${{ matrix.xcode }}
strategy:
matrix:
xcode: ["16.4", "26.2"]
env:
DEVELOPER_DIR: /Applications/Xcode_${{ matrix.xcode }}.app/Contents/Developer
steps:
- uses: actions/checkout@master
- name: Resolve
run: swift package resolve
- name: Build
run: swift build
- name: Test
run: set -o pipefail && swift test 2>&1 | xcpretty
- name: Gen fixtures
run: scripts/gen-fixtures.sh
- name: Check fixtures
run: scripts/diff-fixtures.sh
- name: Build fixtures
env:
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: scripts/build-fixtures.sh
run-linux:
runs-on: ubuntu-latest
name: Linux
steps:
- uses: actions/checkout@master
- name: Build and run tests
run: swift test --enable-test-discovery
================================================
FILE: .gitignore
================================================
.DS_Store
.swiftpm
/.build
/Packages
xcuserdata
*.xccheckout
*.xcuserstate
XcodeGen.xcodeproj
xcodegen.zip
xcodegen.artifactbundle.zip
.vscode/launch.json
DerivedData
.context
================================================
FILE: .swiftformat
================================================
--exclude .build
--exclude .swiftpm
--swiftversion 5.1
--disable redundantSelf
--disable sortedImports
--disable blankLinesAtStartOfScope
--disable blankLinesAtEndOfScope
--disable unusedArguments
--disable hoistPatternLet
--disable numberFormatting
--disable redundantRawValues
--disable andOperator
--ifdef noindent
--ranges nospace
================================================
FILE: CHANGELOG.md
================================================
# Change Log
## Next Version
## 2.45.3
### Fixed
- Fix folder source PBXFileReference path regression with createIntermediateGroups #1605 @yonaskolb
- Fix synced folders: includes silently ignored + no deduplication across targets #1604 @4brunu
## 2.45.2
### Fixed
- Validate empty source paths to prevent project root inclusion #1601 @yonaskolb
- Fix missing productRefGroup in generated projects #1591 @ruslic19
## 2.45.1
### Added
- Added built in `.icon` folder support for IconComposer #1600 @yonaskolb
## 2.45.0
### Added
- Added ability to specify project format version via `projectFormat` option #1566 @anivaros
- Added `explicitFolders` property to `TargetSource` that is passed through to `PBXFileSystemSynchronizedRootGroup`, to turn entire subfolders into Resources #1596 @macguru
- Allow synced folders to be sorted using `groupOrdering` #1596 @macguru
- Added `excludes` support for `syncedFolder` sources with glob pattern matching #1587 @mirkokg
### Fixed
- Fixed synced folders ignoring `createIntermediateGroups=YES` and always being created at the root level #1596 @macguru
- Fix membership exceptions not working for nested synced folders with intermediate groups enabled #1596 @macguru
- Fix `supportedDestinations` presets being injected when `settingPresets` is `none` #1599 @macguru
- Automatically exclude `Info.plist` from synced folder membership when it's within the synced folder #1587 @mirkokg
- Add empty copy resources build phase for synced folders so resources are copied correctly #1587 @mirkokg
### Internal
- Update to XcodeProj 9.10.1 #1597 @yonaskolb
- Fix CI: add explicit xcodebuild destinations and update Xcode matrix #1594 @yonaskolb
- Update ArtifactBundleGen to 0.0.8 #1570 @georgenavarro
## 2.44.1
### Fixed
- Set the correct object version of 77 for Xcode 16 projects @jakobfelsatdm #1563
- Support major.minor SPM package versions which would otherwise fail to decode to a string in yaml specs #1546 @RomanPodymov
- Fix regression for `parallelizable` in scheme. It now resolves to "Enabled" and not "Swift Testing Only" #1565 @CraigSiemens
## 2.44.0
### Added
- Basic support for Xcode 16's synchronized folders #1541 @yonaskolb
- `TargetSource.type` can now be `syncedFolder`
- `Options.defaultSourceDirectoryType` can be set to `syncedFolder` for the default type in all sources in the project (defaults to `group`)
- Benefits include faster generation and no cache invalidation or need to regenerate when files are added or removed from these folders
- Note that not all TargetSource options like excludes are supported, just a simple path. Please test and see what is missing in your projects
- Added sanitizer options to run and test actions in Scheme #1550 @hi-kumar
### Fixed
- Added validation to ensure that all values in `settings.configs` are mappings. Previously, passing non-mapping values did not raise an error, making it difficult to detect misconfigurations. Now, `SpecParsingError.invalidConfigsMappingFormat` is thrown if misused. #1547 @Ryu0118
- Use `USER` instead of `LOGNAME` for XCUserData #1559 @KostyaSha
## 2.43.0
### Added
- Added `excludeFromProject` from local packages #1512 @maximkrouk
- Added support for `preferredScreenCaptureFormat` in schemes #1450 @vakhidbetrakhmadov
### Changes
- `.appex` files are now copied to plugins directory by default #1531 @iljaiwas
- The `preGenCommand` is now run before validation and caching #1500 #1519 @simonbs @dalemyers
- Improve performance of spec validation #1522 @zewuchen
- The `enableGPUValidationMode` enum is deprecated and is now a boolean #1515 @marcosgriselli @yonaskolb
### Fixed
- **Breaking**: `fileGroups` are now relative paths when in included files, like other paths #1534 @shnhrrsn
- **Breaking**: Local package paths are now relative paths when in included files, like other paths #1498 @juri
- Optional groups are no longer skipped when missing and generating projects from a different directory #1529 @SSheldon
### Internal
- Fix Swift 6.0 warnings #1513 @marcosgriselli
- Update package swift tools to 5.9 #1489 @0111b
- Add Xcode 16 to CI #1439 @giginet
- Fix test project building on CI #1537 @yonaskolb
- Skip failing tests on Linux #1517 @marcosgriselli
- XcodeProj updated to 8.24.3 #1515 @marcosgriselli @yonaskolb
## 2.42.0
### Added
- Better support for local Swift packages in Xcode 15 #1465 @kinnarr
- Added `macroExpansion` to test actions in schemes #1468 @erneestoc
### Changed
- Better default macroExpansion target in schemes #1471 @erneestoc
### Removed
- Removed `xcodegen dump --type graphviz` as graphviz no longer builds in Swift 6 and is no longer maintained. If anyone uses this feature and wishes to keep it, please submit a PR providing a suitable alternative. #1485 @giginet
## 2.41.0
### Added
- Added `xcodegen cache` command that writes the cache. Useful for `post-commit` git hook integration #1476 @yonaskolb
### Changed
- Include folders in file sorting #1466 @jflan-dd
### Fixed
- Fixed `supportedDestinations` validation when it contains watchOS for multiplatform apps. #1470 @tatsuky
## 2.40.1
### Fixed
- Reverted `.xcprivacy` handling. They will now again be treated as resources by default @yonaskolb
## 2.40.0
### Added
- Added support for local Swift packages at the project root by specifying a "" group #1413 @hiltonc
- Added a custom `shell` to a scheme's pre and post actions #1430 @balazs-vimn
### Changed
- `.xcprivacy` files are now not added to any build phases by default #1464 @yonaskolb
## 2.39.1
### Added
- Proper defaults for `.cp` and `.cxx` files #1447 @eschwieb
### Fixed
- Fixed bundle access crash #1448 @freddi-kit
- Pinned XcodeProj version to fix breaking changes when XcodeGen is used as a dependency #1449 @yonaskolb
## 2.39.0
### Added
- Support Artifact Bundle #1388 @freddi-kit
- Added support for `.xcstrings` String Catalogs #1421 @nicolasbosi95
- Added default `LD_RUNPATH_SEARCH_PATHS` for visionOS #1444 @Dahlgren
- Added `watchOS` as a supported cross platform destination #1438 @tatsuky
### Fixed
- Fixed custom local package groups not being created #1416 @JaapManenschijn
- Fixed spec validation error type #1439 @Lutzifer
- Create parent group for local package groups if it does not exist already #1417 @JaapManenschijn
### Internal
- Updated Rainbow version #1424 @nysander
## 2.38.0
### Added
- [Multi-destination targets](https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md#supported-destinations) #1336 @amatig
- Added `supportedDestinations` to target
- Added optional new `platform` value of `auto` when using `supportedDestinations`
- Added `destinationFilters` for sources and dependencies
- Added `inferDestinationFiltersByPath`, a convenience filter for sources
- `.mlpackage` files now default to being a source type #1398 @aaron-foreflight
- Added support for `Build Tool Plug-ins` in `AggregateTarget` #1390 @BarredEwe
### Fixed
- Fixed source file `includes` not working when no paths were found #1337 @shnhrrsn
- Supports specifying multiple package products #1395 @simonbs
## 2.37.0
### Added
- Added support for adding `Build Tool Plug-ins` to targets #1374 @BarredEwe
## 2.36.1
### Fixed
- Revert addition of `ENABLE_MODULE_VERIFIER` build setting for causing issues in tests and some setups #1387 @yonaskolb
## 2.36.0
### Added
- Added `scheme.enableGPUValidationMode` #1294 @LouisLWang
- Added visionOS support #1379 @shiba1014
- Added ability to disable Thread performance checker in Schemes #1380 @piellarda
- Added support for `RuntimeIssue` breakpoints #1384 @yonaskolb
### Changed
- The project object version has been updated for Xcode 14.3 #1368 @leonardorock
- Updated recommended settings for Xcode 14.3 #1385 @yonaskolb
- Dropped support for Xcode 12 and 13, due to XcodeProj update #1384 @yonaskolb
### Fixed
- Fix external dependencies from being removed by Xcode #1354 @OdNairy
- Stop creating orphaned object references when reusing references to external dependencies #1377 @liamnichols
## 2.35.0
### Added
- Added support for shared breakpoints #177 @alexruperez @myihsan
- Added support for `putResourcesBeforeSourcesBuildPhase` in a target #1351 @mat1th
### Fixed
- Fix case where source paths may not be deduplicated correctly resulting in duplicate groups and/or a crash in running Xcodegen #1341 @dalemyers
## 2.34.0
### Changed
- Added support for `swiftcrossimport` folders. #1317 @Iron-Ham
- Added support for [Scheme Management](Docs/ProjectSpec.md##scheme-management) #1142 @wendyliga, @teameh
### Fixed
- Fix includes when the projectRoot is a relative path #1262 @CraigSiemens
- Renamed build phase `Embed App Extensions` to `Embed Foundation Extensions` to fix Xcode 14 warning #1310 @casperriboe
## 2.33.0
### Added
- Added support for `enableGPUFrameCaptureMode` #1251 @bsudekum
- Config setting presets can now also be loaded from the main bundle when bundling XcodeGenKit #1135 @SofteqDG
- Added ability to generate multiple projects in one XcodeGen launch #1270 @skofgar
- Use memoization during recursive SpecFiles creation. This provides a drastic performance boost with lots of recursive includes #1275 @ma-oli
### Fixed
- Fix scheme not being generated for aggregate targets #1250 @CraigSiemens
- Fix recursive include path when relativePath is not set #1275 @ma-oli
- Include projectRoot in include paths #1275 @ma-oli
### Internal
- Updated to Yams 5.0.1 #1297 @s2mr
- Delete ignored `try` keyword #1298 @s2mr
## 2.32.0
### Added
- Add support for `mlmodelc` files #1236 @antonsergeev88
- Add `enable` option for `include` #1242 @freddi-kit
### Fixed
- Fix checking environment variable in `include` #1242 @freddi-kit
- Fix profile action for frameworks in Xcode 14 #1245 @SSheldon
## 2.31.0
### Added
- Added a new CopyFilesBuildPhase, "Embed ExtensionKit Extensions" #1230 @mtj0928
- Added duplicate dependencies validation #1234 @aleksproger
## 2.30.0
### Added
- Added support for new target type `extensionkit-extension` in Xcode 14 #1228 @aleksproger
### Changed
- Speed up generating build settings for large projects #1221 @jpsim
### Fixed
- Fix XcodeGen building as library after breaking XcodeProj update 8.8.0 #1228 @aleksproger
## 2.29.0
Some support for Xcode Test Plans has been added. For now test plans are not generated by XcodeGen and must be created in Xcode and checked in, and then referenced by path. If the test targets are added, removed or renamed, the test plans may need to be updated in Xcode
#### Added
- Schemes and Target Schemes can now reference existing Test Plans under `{scheme}.test.testPlans` and `{target}.scheme.testPlans`, respectively. #716 @yonaskolb @omares
#### Fixed
- Fixed an issue where DocC was not added to source file list #1202 @hiragram
#### Changed
- Updated XcodeProj to 8.7.1 #1213 @yonaskolb
## 2.28.0
#### Added
- Support for specifying custom group locations for SPM packages. #1173 @John-Connolly
### Fixed
- Fix Monterey macOS shell version, shell login flag for environments #1167 @bimawa
- Fixed crash caused by a simultaneous write during a glob processing #1177 @tr1ckyf0x
### Changed
- Run target source pattern matching in parallel #1197 @alvarhansen
## 2.27.0
#### Added
- Support test target for local Swift Package #1074 @freddi-kit
- Added `coverageTargets` for target test schemes. This enables to gather code coverage for specific targets. #1189 @gabriellanata
- Fixed issue where .gyb files could not be added to source file list #1191 @hakkurishian
### Fixed
- Fixed crash caused by a simultaneous write during a glob processing #1177 @tr1ckyf0x
- Skip generating empty compile sources build phases for watch apps #1185 @evandcoleman
## 2.26.0
### Added
- Added the option to specify a `location` in a test target #1150 @KrisRJack
### Changed
- Speed up source inclusion checking for big projects #1122 @PaulTaykalo
## 2.25.0
### Added
- Allow specifying a `copy` setting for each dependency. #1038 @JakubBednar
### Fixed
- Fix broken codesign option for bundle dependency #1104 @kateinoigakukun
- Ensure fileTypes are mapped to JSON value #1112 @namolnad
- Fix platform filter for package dependecies #1123 @raptorxcz
- Fix Xcode 13 build #1130 @raptorxcz @mthole
### Changed
- Update XcodeProj to 8.2.0 #1125 @nnsnodnb
## 2.24.0
### Added
- Added support for DocC Catalogs #1091 @brevansio
- Added support for "driver-extension" and "system-extension" product types #1092 @vgorloff
- Add support for conditionally linking dependencies for specific platforms #1087 @daltonclaybrook
- Add ability to specify UI testing screenshot behavior in test schemes #942 @daltonclaybrook
### Changed
- **Breaking**: Rename the `platform` field on `Dependency` to `platformFilter` #1087 @daltonclaybrook
## 2.23.1
### Changed
- Reverted "Change FRAMEWORK_SEARCH_PATH for xcframeworks (#1015)", introduced in 2.20.0. XCFrameworks need to be
referenced directly in the project for Xcode's build system to extract the appropriate frameworks #1081 @elliottwilliams
## 2.23.0
#### Added
- Added ability to set custom platform for dependency #934 @raptorxcz
#### Fixed
- Added `()` to config variant trimming charater set to fix scheme config variant lookups for some configs like `Debug (Development)` that broke in 2.22.0 #1078 @DavidWoohyunLee
- Fixed Linux builds on Swift 5.4 #1083 @yonaskolb
## 2.22.0
#### Added
- Support `runPostActionsOnFailure` for running build post scripts on failing build #1075 @freddi-kit
#### Changed
- Xcode no longer alerts to project changes after regeneration, due to internal workspace not regenerating if identical #1072 @yonaskolb
#### Fixed
- Fixed no such module `DOT` error when package is used as a dependency #1067 @yanamura
- Fixed scheme config variant lookups for some configs like `ProdDebug` and `Prod-Debug` that broke in 2.21.0 #1070 @yonaskolb
## 2.21.0
#### Added
- Support weak link for Swift Package Dependency #1064 @freddi-kit
#### Changed
- Carthage frameworks are no longer embedded for "order-only" target dependencies. This avoid redundant embeds in situations where a target's sources _import_ a Carthage framework but do not have a binary dependency on it (like a test target which runs in a host app). #1041 @elliottwilliams
#### Fixed
- The `Core` target is renamed to avoid collisions with other packages. #1057 @elliottwilliams
- Lookup scheme config variants by whole words, fixing incorrect assignment in names that contain subtrings of each other (eg PreProd and Prod) #976 @stefanomondino
## 2.20.0
#### Added
- Allow specifying a `github` name like `JohnSundell/Ink` instead of a full `url` for Swift Packages #1029 @yonaskolb
- Added explicit `LastUpgradeCheck` and `LastUpgradeVersion` override support so it's possible to override these properties without using the `project.xcodeVersion`. [1013](https://github.com/yonaskolb/XcodeGen/pull/1013) @Andre113
- Added `macroExpansion` for `run` in `schemes` #1036 @freddi-kit
- Added `askForAppToLaunch` for `profile` in `schemes` #1035 @freddi-kit
- Added support for selectedTests in schemes `Test` configuration. #913 @ooodin
#### Fixed
- Fixed regression on `.storekit` configuration files' default build phase. #1026 @jcolicchio
- Fixed framework search paths when using `.xcframework`s. #1015 @FranzBusch
- Fixed bug where schemes without a build target would crash instead of displaying an error #1040 @dalemyers
- Fixed files with names ending in **Info.plist** (such as **GoogleServices-Info.plist**) from being omitted from the Copy Resources build phase. Now, only the resolved info plist file for each specific target is omitted. #1027 @liamnichols
#### Internal
- Build universal binaries for release. XcodeGen now runs natively on Apple Silicon. #1024 @thii
## 2.19.0
#### Added
- Added support for building and running on Linux platforms. Tested for compatibility with Swift 5.3+ and Ubuntu 18.04. #988 @elliottwilliams
- Added `useBaseInternationalization` to Project Spec Options to opt out of Base Internationalization. #961 @liamnichols
- Added `storeKitConfiguration` to allow specifying StoreKit Configuration in Scheme and TargetScheme, supporting either xcodeproj or xcworkspace via `schemePathPrefix` option. #964 @jcolicchio
- Added more detailed error message with method arguments. #990 @bannzai
- Added `basedOnDependencyAnalysis` to Project Spec Build Script to be able to choose not to skip the script. #992 @myihsan
- Added `BuildRule.runOncePerArchitecture` to allow running build rules once per architecture. #950 @sascha
- Added discovered dependency file for a build script #1012 @polac24 @fggeraissate
#### Changed
- **Breaking**: Info.plists with custom prefixes are no longer added to the Copy Bundle Resources build phase #945 @anivaros
- **Breaking**: `workingDirectory` of included legacy targets is now made relative to including project #981 @jcolicchio
- **Breaking**: Make `simulateLocation` respect `schemePathPrefix` option. #973 @jcolicchio
#### Fixed
- Fixed error message output for `minimumXcodeGenVersion`. #967 @joshwalker
- Remove force-unwrapping causing crash for `LegacyTarget`s #982 @jcolicchio
- Fixed a race condition in an internal JSON decoder, which would occasionally fail with an error like `Parsing project spec failed: Error Domain=Unspecified error Code=0`. #995 @elliottwilliams
- Fixed issue where frameworks with `MACH_O_TYPE: staticlib` were being incorrectly embedded. #1003 @mrabiciu
#### Internal
- Updated to Yams 4.0.0 #984 @swiftty
## 2.18.0
#### Added
- Add `Scheme.Test.TestTarget.skipped` to allow skipping of an entire test target. #916 @codeman9
- Added ability to set custom LLDBInit scripts for launch and test schemes #929 @polac24
- Adds App Clip support. #909 @brentleyjones @dflems
- Application extension schemes now default to `launchAutomaticallySubstyle = 2` and the correct debugger and launcher identifiers #932 @brentleyjones
- Updated SettingsPresets to use new defaults from Xcode 12. #953 @liamnichols
- Enable Base Internationalization by default as per Xcode 12 behavior. #954 @liamnichols
#### Changed
- Change default project version to Xcode 12 #960 @yonaskolb
#### Internal
- Updates CI to run on Xcode 12. #936 @dflems @yonaskolb
#### Fixed
- Select the first runnable build target, if present. #957 @codeman9
- Allow SDK dependencies to be embedded. #922 @k-thorat
- Allow creating intermediary groups outside of the project directory. #892 @segiddins
- Fix appex's Runpath Search Paths under macOS target. #952 @rinsuki
- `onlyCopyFilesOnInstall` is extended for the Embed App Extensions build phase. #948 @RomanPodymov
## 2.17.0
#### Added
- Added `options.fileTypes` which lets you set cross project defaults for certain file extensions #914 @yonaskolb
- Added `onlyCopyFilesOnInstall` option to targets for the Embed Files build phase. #912 @jsorge
#### Fixed
- Treat all directories with known UTI as file wrapper. #896 @KhaosT
- Generated schemes for application extensions now contain `wasCreatedForAppExtension = YES`. #898 @muizidn
- Allow package dependencies to use `link: false` #920 @k-thorat
- Fixed issue computing relative paths. #915 @andrewreach
#### Internal
- Updated to XcodeProj 7.13.0 #908 @brentleyjones
## 2.16.0
#### Added
- Improve speed of metadata parsing and dependency resolution. #803 @michaeleisel
- Improve support for iOS sticker packs and add support for `launchAutomaticallySubstyle` to run schemes. #824 @scelis
- Add --project-root option to generate command. #828 @ileitch
- Add an ability to set an order of groups with `options.groupOrdering` #613 @Beniamiiin
- Add the ability to output a dependency graph in graphviz format #852 @jeffctown
- Adds uncluttering the project manifest dumped to YAML from empty values #858 @paciej00
- Added ability to name the executable target when declaring schemes. #869 @elland
- Added ability to set executable to Ask to Launch. #871 @pinda
#### Fixed
- Fixed issue when linking and embedding static frameworks: they should be linked and NOT embed. #820 @acecilia
- Fixed issue when generating projects for paths with a dot in the folder for swift sources. #826 @asifmohd
- Prefix static library target filenames with 'lib' to match Xcode. #831 @ileitch
- Fixed duplicate addition of carthage static frameworks. #829 @funzin
- Fix handling of SWIFT_INSTALL_OBJC_HEADER when its value is YES/NO. #827 @ileitch
- Set `preActions` and `postActions` on the `build` action of a TargetScheme instead of the other actions. #823 @brentleyjones
- Prevent test targets from being set as a scheme's launch action #835 @brentleyjones
- Implicitly include bundles in the Copy Bundle Resources build phase. #838 @skirchmeier
- Fixed dumping a project manifest which contains an array of project references #840 @paciej00
- Generate correct PBXTargetDependency for external targets. #843 @ileitch
- Fix linking of multiple products from the same Swift Package #830 @toshi0383
- Don't deduplicate files in `include` with different path but same name. #849 @akkyie
- Don't link transitive static carthage libraries. #853 @akkyie
- Optimize simplifying paths for faster project generation. #857 @akkyie
- Fixed issue where wrapper folders may not include correctly in the generated project. #862 @KhaosT
- Compile `xcmappingmodel` files instead of copying bundle resources. #834 @jcolicchio
- Fixed issue where `Complie Sources` build phase is generated for resource bundles even when they have no files to compile #878 @nkukushkin
## 2.15.1
#### Fixed
- Fixed issue which caused watch app schemes to be generated incorrectly, preventing these apps from launching. #798 @daltonclaybrook
- Added build presets for the target type `framework.static`. #819 @acecilia
- Fixed XcodeProj resolution and updated to 7.10.0 #822 @soffes
## 2.15.0
#### Added
- Add support for local Swift Packages in `packages` using `path`. #808 @freddi-kit
- Add `buildImplicitDependencies` as an option on `TargetScheme`. #810 @evandcoleman
#### Fixed
- Fixed resolving path to local Swift Packages #796 @freddi-kit
- Added ability to stop on every main thread checker issue on Run schemes and TargetSchemes #799 @ionutivan
- Avoid copying ObjC interface header when SWIFT_INSTALL_OBJC_HEADER=false. #805 @kateinoigakukun
## 2.14.0
#### Added
- Add ability to embed and code sign Swift package dependencies with dynamic products. #788 @alexruperez
#### Fixed
- Revert "Add Base to known regions even if one doesn't exist" #791 @bryansum
- Set `defaultConfigurationName` for every target which is defined in a project. #787 @ken0nek
- Set `TEST_TARGET_NAME` only when a project has UITest bundle. #792 @ken0nek
- Set xcodeproj path in project.xcworkspace/contents.xcworkspacedata #793 @ken0nek
## 2.13.1
#### Fixed
- Validate scheme test action and test coverage target references before generating. #775 @liamnichols
- Fixed parsing prerelease identifiers in Swift package versions #779 @yonaskolb
- Fixed using legacy targets as dependencies #778 @yonaskolb
#### Internal
- Updated to XcodeProj 7.8.0 #777 @yonaskolb
- Use <https://github.com/mxcl/Version> #779 @yonaskolb
## 2.13.0
#### Added
- Support External Target References via subprojects. #701 @evandcoleman
#### Fixed
- Fixed compilation as library by locking down XcodeProj version #767 @yonaskolb
- Stabilized sorting of groups with duplicate names/paths. #671 @ChristopherRogers
- Moved `Copy Bundle Resources` to after `Link with Libraries` build phase #768 @yonaskolb
#### Internal
- Updated to XcodeProj 7.7.0 #767 @yonaskolb
## 2.12.0
#### Added
- Added pre and post command options. Useful for running `pod install` in combination with `--use-cache` #759 @yonaskolb
- Support for language and region settings on a target basis #728 @FranzBusch
- Added option to generate only Info.plist files with `--only-plists` #739 @namolnad
- Added the option to specify a `simulateLocation` in a scheme #722 @basvankuijck
- Support for On Demand Resources tags #753 @sipao
#### Fixed
- Fixed resolving a relative path for `projectReference.path` #740 @kateinoigakukun
- Don't add framework dependency's directory to `FRAMEWORK_SEARCH_PATHS` if it is implicit #744 @ikesyo @yutailang0119
- Fixed resolving relative path passed to `XcodeProj` #751 @PycKamil
- Prefer configurations named "Debug" or "Release" for default scheme build configurations #752 @john-flanagan
- Added an extra check for package versions. #755 @basvankuijck
#### Internal
- Update to SwiftCLI 6.0 and use the new property wrappers #749 @yonaskolb
## 2.11.0
#### Added
- Add Carthage static framework dependencies support. #688 @giginet
- Added `xcodegen dump` command #710 @yonaskolb
- Added `--no-env` option to disable environment variables expansion #704 @rcari
- Added custom group support for target sources #621 @sroebert @rcari
- Added new dependency type, `bundle`. This allows targets to copy bundles from other projects #616 @bsmith11
#### Fixed
- Improved variable expansion runtime #704 @rcari
- Fixed missing headers for static framework targets #705 @wag-miles
- Using more file types from XcodeProj for PBXFileReferences resulting in less project diffs #715 @yonaskolb
- Fixed localized `*.intentdefinition` not being added to build source phases #720 @giginet
- Fixed `selectedLauncherIdentifier` not being set `Xcode.IDEFoundation.Launcher.PosixSpawn` when `debugEnabled: false` is defined in test action #725 @ken0nek
- Fixed unnecessary dependencies related to SwiftPM #726 @tid-kijyun
#### Changed
- Deprecated `$old_form` variables in favor of `${new_form}` variables #704 @rcari
- Updated XcodeProj to 7.4.0 #709 @yonaskolb
- Updated to Swift 5.1 #714 @yonaskolb
## 2.10.1
#### Fixed
- Add Base to knownRegions even if one doesn't exist #694 @bryansum
- Fixed missing `onlyGenerateCoverageForSpecifiedTargets` issue #700 @kateinoigakukun
- Fixed regression on dependencies `link` flag #703 @rcari
## 2.10.0
#### Added
- Support Target Reference to another project. #655 @kateinoigakukun
- Added `coverageTargets` for test target. This enables to gather code coverage for specific targets. #656 @kateinoigakukun
#### Fixed
- Add base localisation by default even if no base localised files were found. Fixes warning in Xcode 11 #685 @yonaskolb
- Don't generate CFBundleExecutable in default generated Info.plist for `bundle` target types #689 @FranzBusch
- Fixed resolving relative paths with custom project destination #681 @giginet
- Fixed resolving relative paths for Info.plist #683 @giginet
- Fixed macOS unit test target TEST_HOST #696 @mjarvis
#### Internal
- Restructure targets #698 @yonaskolb
## 2.9.0
#### Added
- Added Scheme Templates #672 @bclymer
#### Fixed
- Fixed macOS unit test setting preset #665 @yonaskolb
- Add `rcproject` files to sources build phase instead of resources #669 @Qusic
- Prefer default configuration names for generated schemes #673 @giginet
- Fixed some resource files being placed to "Recovered References" group #679 @nivanchikov
#### Internal
- Updated to SwiftCLI 5.3.2 #667 @giginet
- Fixed tests in case-sensitive file system #670 @Qusic
## 2.8.0
#### Added
- Added support for Swift Package dependencies #624 @yonaskolb
- Added `includes` to `sources` for a Target. This follows the same glob-style as `excludes` but functions as a way to only include files that match a specified pattern. Useful if you only want a certain file type, for example specifying `**/*.swift`. #637 @bclymer
- Support `dylib` SDK. #650 @kateinoigakukun
- Added `language` and `region` options for `run` and `test` scheme #654 @kateinoigakukun
- Added `debugEnabled` option for `run` and `test` scheme #657 @kateinoigakukun
#### Fixed
- Expand template variable in Array of Any #651 @kateinoigakukun
- Significantly improve performance when running with a large number files. #658 @kateinoigakukun
- Removed some more diffs between the generated .pbxproj and when Xcode resaves it #663 @yonaskolb
#### Internal
- Removed needless `Array` initialization. #661 @RomanPodymov
- Updated to XcodeProj 7.1.0 #624 @yonaskolb
## 2.7.0
#### Added
- Added Bash 4 style recursive globbing (`**/*`) in target sources `excludes` #636 @bclymer
- Added ability to disable main thread checker in Schemes #601 @wag-miles
#### Fixed
- Fixed included specs that were referenced multiple times from duplicating content #599 @haritowa
- Fixed `.orig` files being added to the project #627 @keith
#### Changed
- Allow linking of dependencies into static libraries when `link` is set to true #635 @kateinoigakukun
## 2.6.0
#### Added
- Added ability to skip tests #582 @kadarandras
- Added ability to set `attributes` on build files #583 @min
- Allow using environment variables in the form of `${SOME_VARIABLE}`. This might be a **breaking** change when a target template attribute is also defined as an environment variable #594 @tomquist
- Added support for `watchapp2-container` and `framework.static` product types #604 @yonaskolb
#### Fixed
- Fixed `.pch` files being bundled as resources #597 @thii
- Fixed an issue that prevents watchOS Intents Extension from running correctly. #571 @KhaosT
#### Changed
- Updated the default `compatibilityVersion` project setting from `Xcode 9.3` to `Xcode 10.0` #581 @acecilia
- Updated to XcodeProj 7.0.0. Note that the length of generated UUIDs has changed #604 @yonaskolb
#### Internal
- Added ability to encode ProjectSpec #545 @ryohey
## 2.5.0
#### Added
- Added support for `app-extension.intents-service` target type #536 @yonaskolb
- Added support for custom `root` in `sdk` dependency #562 @raptorxcz
#### Changed
- Updated to xcodeproj 6.7.0 including its performance improvements #536 @yonaskolb
- Updated default generated settings for Xcode 10.2 #555 @yonaskolb
- Changed order of file generation so that plists are now generated before the project, so they will be included in the projects files #544 @tomquist
- Updated Yams to 2.0.0 @yonaskolb
#### Fixed
- Fixed groups from sources outside a project spec's directory from being flattened. #550 @sroebert
- Fixed `optional` file sources not being added to the project #557 @yonaskolb
- Fixed Carthage dependencies being incorrectly embedded in WatchKit app bundles instead of a WatchKit app extension #558 @KhaosT
## 2.4.0
#### Fixed
- Fixed installation when building in Swift 5 #549 @yonaskolb
#### Changed
- Updated to Swift 5 and dropped Swift 4.2 #549 @yonaskolb
## 2.3.0
#### Added
- Added ability to automatically find all the frameworks for Carthage dependencies via the global `options.findCarthageFrameworks` or dependency specific `dependency.findFrameworks`. See the [Carthage](Docs/Usage.md#carthage) usage docs for more info #506 @rpassis @yonaskolb
- Added support for nested target templates #534 @tomquist
- Added ability to define `templateAttributes` within a target to be able to parameterize templates. #533 @tomquist
- Added ability to set `link` to false in framework dependencies #532 @dimatosaurus
- Added `missingConfigFiles` to `options.disabledValidations` to optionally skip checking for the existence of config files.
- Added ability to define a per-platform `deploymentTarget` for Multi-Platform targets. #510 @ainopara
#### Changed
- **DEPRECATION**: Placeholders `$target_name` and `$platform` have been deprecated in favour of `${target_name}` and `${platform}`. Support for the old placeholders will be removed in a future version #533 @tomquist
#### Fixed
- Sources outside a project spec's directory will be correctly referenced as relative paths in the project file. #524
- Fixed error when `optional` directory source is missing #527 @yonaskolb
- Fixed excludes within included spec #535 @yonaskolb
- Fixed paths in target templates within included files not being relative #537 @yonaskolb
- Fix multi-platform target templates #541 @yonaskolb
- Fixed sources in an included target not being relative when the sources are mix of string and dictionaries #542 @yonaskolb
## 2.2.0
#### Added
- Added ability to generate empty directories via `options.generateEmptyDirectories` #480 @Beniamiiin
- Added support for the `instrumentsPackage` product type #482 @ksulliva
- Added support for `inputFileLists` and `outputFileLists` within project build scripts #500 @lukewakeford
- Added support for a `$target_name` replacement string within target templates #504 @yonaskolb
- Added `createIntermediateGroups` to individual Target Sources which overrides the top level option #505 @yonaskolb
#### Changed
- **BREAKING**: All the paths within `include` files are now relative to that file and not the root spec. This can be disabled with a `relativePaths: false` on the include. See the [documentation](https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md#include) for more details #489 @ellneal
- Updated the Xcode compatibility version from 3.2 to 9.3 #497 @yonaskolb
- Exact matches to config names in build settings won't partial apply to other configs #503 @yonaskolb
- UUIDs in the project are standard and don't contain any type prefixes anymore
#### Fixed
- Fixed `--project` argument not taking effect #487 @monowerker
- Fixed Sticker Packs from generating an empty Source file phase which caused in error in the new build system #492 @rpassis
- Fixed generated schemes for tool targets not setting the executable #496 @yonaskolb
- Fixed resolving Carthage dependencies for iOS app with watchOS target. [465](https://github.com/yonaskolb/XcodeGen/pull/465) @raptorxcz
## 2.1.0
#### Added
- Added an experiment new caching feature. Pass `--use-cache` to opt in. This will read and write from a cache file to prevent unnecessarily generating the project. Give it a try as it may become the default in a future release #412 @yonaskolb
#### Changed
- Changed spelling of build phases to **preBuildPhase** and **postBuildPhase**. The older names are deprecated but still work [402](https://github.com/yonaskolb/XcodeGen/pull/402) @brentleyjones
- Moved generation to a specific subcommand `xcodegen generate`. Simple `xcodegen` will continue to work for now #437 @yonaskolb
- If `INFOPLIST_FILE` has been set on a target, then an `info` path won't ovewrite it #443 @feischl97
#### Fixed
- Fixed XPC Service package type in generated `Info.plist` #435 @alvarhansen
- Fixed phase ordering for modulemap and static library header Copy File phases. [402](https://github.com/yonaskolb/XcodeGen/pull/402) @brentleyjones
- Fixed intermittent errors when running multiple `xcodegen`s concurrently #450 @bryansum
- Fixed `--project` argument not working #437 @yonaskolb
- Fixed unit tests not hooking up to host applications properly by default. They now generate a `TEST_HOST` and a `TestTargetID` #452 @yonaskolb
- Fixed static libraries not including external frameworks in their search paths #454 @brentleyjones
- Add `.intentdefinition` files to sources build phase instead of resources #442 @yonaskolb
- Add `mlmodel` files to sources build phase instead of resources #457 @dwb357
## 2.0.0
#### Added
- Added `weak` linking setting for dependencies #411 @alvarhansen
- Added `info` to targets for generating an `Info.plist` #415 @yonaskolb
- Added `entitlements` to targets for generating an `.entitlement` file #415 @yonaskolb
- Added `sdk` dependency type for linking system frameworks and libs #430 @yonaskolb
- Added `parallelizable` and `randomExecutionOrder` to `Scheme` test targets in an expanded form #434 @yonaskolb
- Validate incorrect config setting definitions #431 @yonaskolb
- Automatically set project `SDKROOT` if there is only a single platform within the project #433 @yonaskolb
#### Changed
- Performance improvements for large projects #388 @yonaskolb @kastiglione
- Upgraded to xcodeproj 6 #388 @yonaskolb
- Upgraded to Swift 4.2 #388 @yonaskolb
- Remove iOS codesigning sdk restriction in setting preset #414 @yonaskolb
- Changed default project version to Xcode 10.0 and default Swift version to 4.2 #423 @yonaskolb
- Added ability to not link Carthage frameworks #432 @yonaskolb
#### Fixed
- Fixed code signing issues #414 @yonaskolb
- Fixed `TargetSource.headerVisibility` not being set in initializer #419 @jerrymarino
- Fixed crash when using Xcode Legacy targets as dependencies #427 @dflems
## 1.11.2
If XcodeGen is compiled with Swift 4.2, then UUID's in the generated project will not be deterministic. This will be fixed in an upcoming release with an update to xcodeproj 6.0
#### Fixed
- Fixed release builds in Swift 4.2 #404 @pepibumur
- Fixed default settings for macOS unit-tests #387 @frankdilo
- Fixed Copy Headers phase ordering for Xcode 10 #401 @brentleyjones
- Fixed generated schemes on aggregate targets #394 @vgorloff
#### Changed
- Added `en` as default value for knownRegions #390 @Saik0s
- Update `PathKit`, `Spectre`, `Yams` and `xcodeproj` dependencies
## 1.11.1
#### Fixed
- Fixed `FRAMEWORK_SEARCH_PATHS` for `framework` dependency paths with spaces #382 @brentleyjones
- Fixed aggregate targets not being found with `transitivelyLinkDependencies` #383 @brentleyjones
## 1.11.0
#### Added
- Added `showEnvVars` to build scripts to disable printing the environment #351 @keith
- Added `requiresObjCLinking` to `target` #354 @brentleyjones
- Added `targetTemplates` #355 @yonaskolb
- Added `aggregateTargets` #353 @yonaskolb
- Added `options.groupSortPosition` #356 @yonaskolb
- Added ability to specify `copyFiles` build phase for sources #345 @brentleyjones
- Added ability to specify a `minimumXcodeGenVersion` #349 @brentleyjones
- Added `customArchiveName` and `revealArchiveInOrganizer` to `archive` #367 @sxua
#### Fixed
- Sort files using localizedStandardCompare #341 @rohitpal440
- Use the latest `xcdatamodel` when sorted by version #341 @rohitpal440
- Fixed compiler flags being set on non source files in mixed build phase target sources #347 @brentleyjones
- Fixed `options.xcodeVersion` not being parsed #348 @brentleyjones
- Fixed non-application targets using `carthage copy-frameworks` #361 @brentleyjones
- Set `xcdatamodel` based on `xccurrentversion` if available #364 @rpassis
- XPC Services are now correctly copied #368 @brentley
- Fixed `.metal` files being added to resources #380 @vgorloff
#### Changed
- Improved linking for `static.library` targets #352 @brentleyjones
- Changed default group sorting to be after files #356 @yonaskolb
- Moved `Frameworks` and `Products` top level groups to bottom #356 @yonaskolb
- `modulemap` files are automatically copied to the products directory for static library targets #346 @brentleyjones
- Public header files are automatically copied to the products directory for static library targets #365 @brentleyjones
- Swift Objective-C Interface Header files are automatically copied to the products directory for static library targets #366 @brentleyjones
- `FRAMEWORK_SEARCH_PATHS` are adjusted for `framework` dependencies #373 @brentley
- `library.static` targets have `SKIP_INSTALL` set to `YES` #358 @brentley
- Copy files phases have descriptive names #360 @brentley
#### Internal
- Moved brew formula to homebrew core
- Added `CONTRIBUTING.md`
## 1.10.3
#### Fixed
- Fixed Mint installations finding `SettingPresets` #338 @yonaskolb
## 1.10.2
#### Changed
- Set `transitivelyLinkDependencies` to false by default
## 1.10.1
#### Fixed
- Fixed `transitivelyLinkDependencies` typo #332 @brentleyjones
- Fixed framework target dependencies not being code signed by default #332 @yonaskolb
#### Changed
- Code sign all dependencies by default except target executables #332 @yonaskolb
## 1.10.0
#### Added
- Added build rule support #306 @yonaskolb
- Added support for frameworks in sources #308 @keith
- Added ability to automatically embed transient dependencies. Controlled with `transitivelyLinkDependencies` #327 @brentleyjones
#### Changed
- Upgraded to Swift 4.1
- Improved Carthage dependency lookup performance with many targets #298 @keith
- By default don't CodeSignOnCopy `target` dependencies. This can still be controlled with `Dependency.codeSign` #324 @yonaskolb
#### Fixed
- Fixed PBXBuildFile and PBXFileReference being incorrectly generated for Legacy targets #296 @sascha
- Fixed required sources build phase not being generated if there are no sources #307 @yonaskolb
- Fixed install script in binary release #303 @alvarhansen
- Removed `ENABLE_TESTABILITY` from framework setting presets #299 @allu22
- Fixed homebrew installation #297 @vhbit
- `cc` files are now automatically recognized as source files #317 @maicki
- Fixed `commandLineArguments` not parsing when they had dots in them #323 @yonaskolb
- Fixed excluding directories that only have sub directories #326 @brentleyjones
- Made `PBXContainerItemProxy` ID more deterministic
- Fixed generated framework schemes from being executable #328 @brentleyjones
## 1.9.0
#### Added
- Scheme pre and post actions can now be added to `target.scheme` #280 @yonaskolb
- Individual files can now be added to `fileGroups` #293 @yonaskolb
#### Changed
- Updated to `xcproj` 4.3.0 for Xcode 9.3 updates
- Update default Xcode version to 9.3 including new settings #284 @LinusU
- **Breaking for ProjectSpec library users** Changed `ProjectSpec` to `Project` and `ProjectSpec.Options` to `SpecOptions` #281 @jerrymarino
#### Fixed
- Fixed manual build phase of `none` not being applied to folders #288 @yonaskolb
- Quoted values now correctly get parsed as strings #282 @yonaskolb
- Fixed adding a root source folder when `createIntermediateGroups` is on #291 @yonaskolb
- Fixed Homebrew installations issues on some machines #289 @vhbit
- Fixed files that are added as root sources from having invalid parent groups outside the project directory #293 @yonaskolb
## 1.8.0
#### Added
- Added Project `defaultConfig` #269 @keith
- Added Target `attributes` #276 @yonaskolb
- Automatically set `DevelopmentTeam` and `ProvisioningStyle` within `TargetAttributes` if relevant build settings are defined #277 @yonaskolb
#### Fixed
- Fixed default `LD_RUNPATH_SEARCH_PATHS` for app extensions #272 @LinusU
#### Internal
- Make `LegacyTarget` init public #264 @jerrymarino
- Upgrade to _xcproj_ to 4.2.0, _Yams_ to 0.6.0 and _PathKit_ to 0.9.1 @yonaskolb
## 1.7.0
#### Added
- Added support for scheme environment variables #239 @turekj @toshi0383
- Added `carthageExecutablePath` option #244 @akkyie
- Added `parallelizeBuild` and `buildImplicitDependencies` to Schemes #241 @rahul-malik
@yonaskolb
- Added support for Core Data `xcdatamodeld` files #249 @yonaskolb
- Projects are now generated atomically by writing to a temporary directory first #250 @yonaskolb
- Added script for adding precompiled binary to releases #246 @toshi0383
- Added optional `headerVisibilty` to target source. This still defaults to public #252 @yonaskolb
- Releases now include a pre-compiled binary and setting presets, including an install script
#### Fixed
- Fixed Mint installation from reading setting presets #248 @yonaskolb
- Fixed setting `buildPhase` on a `folder` source. This allows for a folder of header files #254 @toshi0383
- Carthage dependencies are not automatically embedded into test targets #256 @yonaskolb
- Carthage dependencies now respect the `embed` property #256 @yonaskolb
- iMessage extensions now have proper setting presets in regards to app icon and runtime search paths #255 @yonaskolb
- Excluded files are not added within .lproj directories #238 @toshi0383
## 1.6.0
#### Added
- Added scheme pre-actions and post-actions #231 @kastiglione
- Added `options.disabledValidations` including `missingConfigs` to disable project validation errors #220 @keith
- Generate UI Test Target Attributes #221 @anreitersimon
#### Fixed
- Filter out duplicate source files #217 @allu22
- Fixed how `lastKnownFileType` and `explicitFileType` were generated across platforms #115 @toshi0383
- Removed a few cases of project diffs when opening the project in Xcode @yonaskolb
- Fixed Swift not being embedded by default in watch apps @yonaskolb
#### Changed
- Change arrays to strings in setting presets #218 @allu22
- Updated to xcproj 4.0 #227
## 1.5.0
#### Added
- added support for `gatherCoverageData` flag in target schemes #170 @alexruperez
- added support for `commandLineOptions` in target schemes #172 @rahul-malik
- added Project spec as a SwiftPM library for reuse in other projects #164 @soffes
- added `implicit` option for framework dependencies #166 @sbarow
- added `--quite` option to CLI #167 @soffes
- can now print version with `-v` in addition to `--version` #174 @kastiglione
- added support for legacy targets #175 @bkase
- added support for indentation options #190 @bkase
- added source excludes #135 @peymankh @
- added `options.xcodeVersion` #197 @yonaskolb @peymankh
- add test targets to Scheme #195 @vhbit
- add option to make a source file optional incase it will be generated later #200 @vhbit
- finalize Scheme spec #201 @yonaskolb
- added `buildPhase` setting to target source for overriding the guessed build phase of files #206 @yonaskolb
- added `deploymentTarget` setting to project and target #205 @yonaskolb
#### Changed
- huge performance improvements when writing the project file due to changes in xcproj
- updated dependencies
- minor logging changes
- updated Project Spec documentation
- scan for `Info.plist` lazely #194 @kastiglione
- change setting presets so that icon settings only get applied to application targets #204 @yonaskolb
- changed scheme build targets format #203 @yonaskolb
- when specifying a `--spec` argument, the default for the `--project` path is now the directory containing the spec #211 @yonaskolb
#### Fixed
- fixed shell scripts escaping quotes twice #186 @allu22
- fixed `createIntermediateGroups` when using a relative spec path #184 @kastiglione
- fixed command line arguments for test and profile from being overridden #199 @vhbit
- fixed files deep within a hierarchy having the path for a name
- fixed source files from being duplicated if referenced with different casing #212 @yonaskolb
- fixed target product name not being written. Fixes integration with R.swift #213 @yonaskolb
## 1.4.0
#### Added
- added `--version` flag #112 @mironal
- added support for adding individual file sources #106 @bkase
- added source compiler flag support #121 @bkase
- added `ProjectSpec.options.createIntermediateGroups` #108 @bkase
- added better json loading support #127 @rahul-malik
- added source `name` for customizing names of source directories and file #146 @yonaskolb
- added folder reference source support via a new `type` property #151 @yonaskolb
- added `ProjectSpec.options.developmentLanguage` #155 @yonaskolb
#### Changed
- updated to xcproj 1.2.0 #113 @yonaskolb
- build settings from presets will be removed if they are provided in `xcconfig` files #77 @toshi0383
- all files and groups are sorted by type and then alphabetically #144 @yonaskolb
- target sources can now have an expanded form #119 @yonaskolb
- empty build phases are now not generated #149 @yonaskolb
- make UUIDs more deterministic #154 @yonaskolb
#### Fixed
- only add headers to frameworks and libraries #118 @ryohey
- fixed localized files with the same name #126 @ryohey
- fix intermediate sources #144 @yonaskolb
- fix cyclical target dependencies not working #147 @yonaskolb
- fix directory bundles not being added properly when referenced directly #148 @yonaskolb
- made `mm`, `c` and `S` file be parsed as source files #120 @bkase @enmiller
- fix the generation of localized variant groups if there is no `Base.lproj` #157 @ryohey
- all localizations found are added to a projects known regions #157 @ryohey
#### Internal
- refactoring
- more tests
- added release scripts
## 1.3.0
#### Added
- generate output files for Carthage copy-frameworks script #84 @mironal
- added options.settingPreset to choose which setting presets get applied #100 @yonaskolb
- added `link` option for target dependencies #109 @keith
#### Changed
- updated to xcproj 0.4.1 #85 @enmiller
- don't copy base settings if config type has been left out #100 @yonaskolb
- generate localised files under a single variant group #70 @ryohey
- don't apply common project settings to configs with no type #100 @yonaskolb
- config references in settings can now be partially matched and are case insensitive #111 @yonaskolb
- other small internal changes @yonaskolb
#### Fixed
- embed Carthage frameworks for macOS #82 @toshi0383
- fixed copying of watchOS app resources #96 @keith
- automatically ignore more file types for a target's sources (entitlements, gpx, apns) #94 @keith
- change make build to a PHONY task #98 @keith
- allow copying of resource files from dependant targets #95 @keith
- fixed library linking #93 @keith
- fixed duplicate carthage file references #107 @yonaskolb
- an error is now shown if you try and generate a target scheme and don't have debug and release builds @yonaskolb
## 1.2.4
#### Fixed
- setting presets only apply `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES: YES` to applications
- don't add carthage dependency to `copy-frameworks` script if `embed: false`
- sort group children on APFS
#### Changed
- update to xcproj 0.3.0
## 1.2.3
#### Fixed
- Fixed wrong carthage directory name reference for macOS #74 @toshi0383
- Removed unnecessary `carthage copy-frameworks` for macOS app target #76 @toshi0383
- Added some missing default settings for framework targets. `SKIP_INSTALL: YES` fixes archiving
- Filter out nulls from setting presets if specifying an empty string
## 1.2.2
#### Added
- automatically set `TEST_TARGET_NAME` on UI test targets if one of the dependencies is an application target
#### Fixed
- set `DYLIB_INSTALL_NAME_BASE` to `@rpath` in framework target presets
- fixed tvOS launch screen setting. `ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME` is now `LaunchImage` not `tvOS LaunchImage`
## 1.2.0
#### Added
- `include` now supports a single string as well as a list
- add support setting xcconfig files on a project with `configFiles` #64
- add `fileGroups` to project spec for adding groups of files that aren't target source files #64
- better output (more info, emoji, colors)
- add `options.bundleIdPrefix` for autogenerating `PRODUCT_BUNDLE_IDENTIFIER` #67
- add `:REPLACE` syntax when merging `include` #68
- add `mint` installation support
#### Fixed
- fixed homebrew installation
- fixed target xcconfig files not working via `configFiles` #64
- look for `INFOPLIST_FILE` setting in project and xcconfig files before adding it automatically. It was just looking in target settings before #64
- exit with error on failure
## 1.1.0
#### Changed
- set project version to Xcode 9 - `LastUpgradeVersion` attribute to `0900`
- set default Swift version to 4.0 - `SWIFT_VERSION` build setting to `4.0`
### 1.0.1
### Fixed
- fixed incorrect default build script shell path
- fixed install scripts
## 1.0.0
#### Added
- Swift 4 support #52
- Support for C and C++ files #48 by @antoniocasero
- Xcode 9 default settings
#### Fixed
- fixed empty string in YAML not being parsed properly #50 by @antoniocasero
#### Changed
- updated to xcodeproj 0.1.2 #56
- **BREAKING**: changed target definitions from list to map #54
## 0.6.1
#### Added
- Ability to set PBXProject attributes #45
#### Changed
- Don't bother linking target frameworks for target dependencies.
- Move code signing default settings from all iOS targets to iOS application targets, via Product + Platform setting preset files #46
## 0.6.0
#### Added
- Allow a project spec to include other project specs #44
#### Changed
- Changed default spec path to `project.yml`
- Changed default project directory to the current directory instead of the spec file's directory
## 0.5.1
#### Fixed
- Fix embedded framework dependencies
- Add `CODE_SIGN_IDENTITY[sdk=iphoneos*]` back to iOS targets
- Fix build scripts with "" generating invalid projects #43
## 0.5.0
#### Added
- Added multi platform targets #35
- Automatically generate platform specific `FRAMEWORK_SEARCH_PATHS` for Carthage dependencies #38
- Automatically find Info.plist and set `INFOPLIST_FILE` build setting if it doesn't exist on a target #40
- Add options for controlling embedding of dependencies #37
#### Fixed
- Fixed localized files not being added to a target's resources
#### Changed
- Renamed Setting Presets to Setting Groups
- Carthage group is now created under top level Frameworks group
## 0.4.0
##### Added
- Homebrew support #16 by @pepibumur
- Added `runOnlyWhenInstalling` to build scripts #32
- Added `carthageBuildPath` option #34
#### Fixed
- Fixed installations of XcodeGen not applying build setting presets for configs, products, and platforms, due to missing resources
#### Changed
- Upgraded to <https://github.com/swift-xcode/xcodeproj> 0.1.1 #33
## 0.3.0 - Extensions and Scheme Tests
#### Added
- Support for app extension dependencies, using the same `target: MyExtension` syntax #19
- Added test targets to generated target schemes via `Target.scheme.testTargets` #21
#### Changed
- Updated xcodeproj to 0.0.9
#### Fixed
- Fixed watch and messages apps not copying carthage dependencies
#### Breaking changes
- Changed `Target.generatedSchemes` to `Target.scheme.configVariants`
## 0.2.0 - Build scripts
#### Added
- Added Target build scripts with `Target.prebuildScripts` and `Target.postbuildScripts` #17
- Support for absolute paths in target sources, run script files, and config files
- Add validation for incorrect `Target.configFiles`
#### Fixed
- Fixed some project objects sometimes having duplicate ids
## 0.1.0
First official release
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to XcodeGen
There are various ways to contribute to XcodeGen, and all are welcome and appreciated!
- [Bug Reports](#bug-reports)
- [Feature Requests](#feature-requests)
- [Answering Questions](#answering-questions)
- [Example Specs](#example-specs)
- [Documentation](#documentation)
- [Code](#code)
## Bug reports
Open issues about problems you may be encountering. When doing so please mention the version you're using `xcodegen --version`.
## Feature Requests
If you have a good idea for a feature or enhancement open an issue.
## Answering Questions
Look through the open issues and answer any questions you can.
## Example specs
Submit your open source xcodegen spec to the [Examples](Docs/Examples.md) page.
## Documentation
Improve the documentation in the [Docs](Docs) directory.
## Code
You can submit your own code. This can be bug fixes or new features. If you're not sure what to work on check out the open [Issues](https://github.com/yonaskolb/XcodeGen/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
### Getting started
Make sure you have at least Xcode 9.2 installed.
First clone the repo:
```shell
git clone https://github.com/yonaskolb/XcodeGen.git
cd XcodeGen
make
```
To make editing easier you can generate the Xcode project using Swift PM:
```shell
swift package generate-xcodeproj
```
### Targets
- `ProjectSpec`: Project spec definitions, loading, parsing and validation
- `XcodeGen`: XcodeGen CLI
- `XcodeGenKit`: All the logic for generation
- `XcodeGenKitTests`: Generation tests
### Tests
Before submitting your PR run the tests to make sure they pass. This can be done either in Xcode or by running `swift test`.
As part of the tests there is a [TestProject](/Tests/Fixtures/TestProject) fixture that will be generated, and if the generated xcode project has any diff in it the test will fail. If the diff is a valid change, commit it as part of your changes.
> Note that sometimes having the `TestProject` open in Xcode will generate it's own diffs, so make sure to have it closed when running the tests.
If your change contains any new features or logic changes please add a unit test of your own to cover it. If it's a new feature, see if it can be integrated into the `TestProject` by adding any required files and then editing the [project spec](/Tests/Fixtures/TestProject/project.yml).
### Submitting your PR
Please give a small summary of what has changed. Also add any github issues links (`Resolves #100`).
Once your PR is created, please add a changelog entry to [CHANGELOG.md](/CHANGELOG.md) along with the PR number.
================================================
FILE: Docs/Examples.md
================================================
# Examples
These are a bunch of real world examples of XcodeGen project specs. Feel free to add your own via PR.
- [toshi0383/Bitrise-iOS](https://github.com/toshi0383/Bitrise-iOS/blob/master/project.yml)
- [johndpope/swift-models](https://github.com/johndpope/swift-models/tree/stable/Inference)
- [atelier-socle/AppRepositoryTemplate](https://github.com/atelier-socle/AppRepositoryTemplate/blob/master/project.yml)
- [atelier-socle/FrameworkRepositoryTemplate](https://github.com/atelier-socle/FrameworkRepositoryTemplate/blob/master/project.yml)
- [scelis/XcodeGen-TestStickers](https://github.com/scelis/XcodeGen-TestStickers/blob/master/project.yml)
- [minvws/nl-covid19-notification-app-ios](https://github.com/minvws/nl-covid19-notification-app-ios/blob/master/project.yml)
- [pvinis/react-native-xcodegen](https://github.com/pvinis/react-native-xcodegen/blob/master/templates)
- [covid19cz/erouska-ios](https://github.com/covid19cz/erouska-ios/blob/develop/project.yml)
- [markst/hotreloading-vscode-ios](https://github.com/markst/hotreloading-vscode-ios)
- [MultiPlatformApp](https://github.com/hgq287/HGSwift/tree/master/Examples/MultiPlatformApp) - A modern **SwiftUI** multi-platform (iOS & macOS) example featuring a modular 3-tier architecture and shared logic.
================================================
FILE: Docs/FAQ.md
================================================
# Frequently asked questions
- [Can I still check in my project](#can-i-still-check-in-my-project)
- [Can I use CocoaPods](#can-i-use-cocoapods)
- [Can I use Crashlytics](#can-i-use-crashlytics)
- [How do I setup code signing](#how-do-i-setup-code-signing)
## Can I still check in my project
Absolutely. You will get the most out of XcodeGen by adding your project to your `.gitignore`, as this way you avoid merge conflicts. But you can also check it in as a halfway step.
>Note that you can run `xcodegen` as a step in your build process on CI.
## What happens when I switch branches
If files were added or removed in the new checkout you will most likely need to run `xcodegen` again so that your project will reference all your files.
It's recommended to set up some [git hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) to automate the process:
- run `xcodegen generate --use-cache` on the following hooks. This will make sure the project is up to date when checking out, merging and rebasing
- `post-checkout`
- `post-rewrite`
- `post-merge`
- run `xcodegen cache` on `pre-commit`. This will make sure that when switching branches the cache will be updated in case you made local changes, or are ammending a commit that added a new file.
## Can I use CocoaPods
Yes, you will just need to run `pod install` after the project is generated to integrate Cocoapods changes.
It's recommended to use a combination of `--use-cache` and the `postGenCommand` option which will only generate the project if required, and then only run `pod install` if the project has been regenerated.
## Can I use Crashlytics
Yes, but you need to use a little trick when using CocoaPods. Add this script in your `Podfile`:
```ruby:Podfile
// Your dependencies
pod 'Firebase/Crashlytics'
script_phase name: 'Run Firebase Crashlytics',
shell_path: '/bin/sh',
script: '"${PODS_ROOT}/FirebaseCrashlytics/run"',
input_files: ['$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)']
```
This script will be added after `[CP] Embed Pods Frameworks.`
## How do I setup code signing
At the moment there are no special options for code signing in XcodeGen, and this must be configured via regular build settings. For code signing to work, you need to tell Xcode which development team to use. This requires setting the `DEVELOPMENT_TEAM` and possibly `CODE_SIGN_STYLE` build settings. See [Configuring build settings](Usage.md#configuring-build-settings) for how to do that
================================================
FILE: Docs/ProjectSpec.md
================================================
# Project Spec
The project spec can be written in either YAML or JSON. All the examples below use YAML.
- [x] required property
- [ ] optional property
Some of the YAML examples below don't show all the required properties. For example not all target examples will have a platform or type, even though they are required.
You can also use environment variables in your configuration file, by using `${SOME_VARIABLE}` in a string.
- [Project](#project)
- [Include](#include)
- [Options](#options)
- [GroupOrdering](#groupordering)
- [FileType](#filetype)
- [Breakpoints](#breakpoints)
- [Breakpoint Action](#breakpoint-action)
- [Configs](#configs)
- [Setting Groups](#setting-groups)
- [Settings](#settings)
- [Target](#target)
- [Product Type](#product-type)
- [Platform](#platform)
- [Supported Destinations](#supported-destinations)
- [Sources](#sources)
- [Target Source](#target-source)
- [Dependency](#dependency)
- [Config Files](#config-files)
- [Plist](#plist)
- [Build Tool Plug-ins](#build-tool-plug-ins)
- [Build Script](#build-script)
- [Build Rule](#build-rule)
- [Target Scheme](#target-scheme)
- [Legacy Target](#legacy-target)
- [Aggregate Target](#aggregate-target)
- [Target Template](#target-template)
- [Scheme](#scheme)
- [Build](#build)
- [Common Build Action options](#common-build-action-options)
- [Execution Action](#execution-action)
- [Run Action](#run-action)
- [Test Action](#test-action)
- [Test Target](#test-target)
- [Other Parameters](#other-parameters)
- [Testable Target Reference](#testable-target-reference)
- [Archive Action](#archive-action)
- [Simulate Location](#simulate-location)
- [Scheme Management](#scheme-management)
- [Environment Variable](#environment-variable)
- [Test Plan](#test-plan)
- [Scheme Template](#scheme-template)
- [Swift Package](#swift-package)
- [Remote Package](#remote-package)
- [Local Package](#local-package)
- [Project Reference](#project-reference)
## Project
- [x] **name**: **String** - Name of the generated project
- [ ] **include**: **[Include](#include)** - One or more paths to other specs
- [ ] **options**: **[Options](#options)** - Various options to override default behaviour
- [ ] **attributes**: **[String: Any]** - The PBXProject attributes. This is for advanced use. If no value is set for `LastUpgradeCheck`, it will be defaulted to ``{"LastUpgradeCheck": "XcodeVersion"}`` with `xcodeVersion` being set by [Options](#options)`.xcodeVersion`
- [ ] **breakpoints**: [Breakpoints](#breakpoints) - Add shared breakpoints to the generated project
- [ ] **configs**: **[Configs](#configs)** - Project build configurations. Defaults to `Debug` and `Release` configs
- [ ] **configFiles**: **[Config Files](#config-files)** - `.xcconfig` files per config
- [ ] **settings**: **[Settings](#settings)** - Project specific settings. Default base and config type settings will be applied first before any settings defined here
- [ ] **settingGroups**: **[Setting Groups](#setting-groups)** - Setting groups mapped by name
- [ ] **targets**: **[String: [Target](#target)]** - The list of targets in the project mapped by name
- [ ] **fileGroups**: **[String]** - A list of paths to add to the root of the project. These aren't files that will be included in your targets, but that you'd like to include in the project hierarchy anyway. For example a folder of xcconfig files that aren't already added by any target sources, or a Readme file.
- [ ] **schemes**: **[Scheme](#scheme)** - A list of schemes by name. This allows more control over what is found in [Target Scheme](#target-scheme)
- [ ] **schemeTemplates**: **[String: [Scheme Template](#scheme-template)]** - a list of schemes that can be used as templates for actual schemes which reference them via a `template` property. They can be used to extract common scheme settings. Works great in combination with `include`.
- [ ] **targetTemplates**: **[String: [Target Template](#target-template)]** - a list of targets that can be used as templates for actual targets which reference them via a `template` property. They can be used to extract common target settings. Works great in combination with `include`.
- [ ] **packages**: **[String: [Swift Package](#swift-package)]** - a map of Swift packages by name.
- [ ] **projectReferences**: **[String: [Project Reference](#project-reference)]** - a map of project references by name
### Include
One or more specs can be included in the project spec. This can be used to split your project spec into multiple files, for easier structuring or sharing between multiple specs. Included specs can also include other specs and so on.
Include can either be a list of includes or a single include. They will be merged in order and then the current spec will be merged on top.
An include can be provided via a string (the path) or an object of the form:
**Include Object**
- [x] **path**: **String** - The path to the included file.
- [ ] **relativePaths**: **Bool** - Dictates whether the included spec specifies paths relative to itself (the default) or the root spec file.
- [ ] **enable**: **Bool** - Dictates whether the specified spec should be included or not. You can also specify it by environment variable.
```yaml
include:
- includedFile.yml
- path: path/to/includedFile.yml
relativePaths: false
enable: ${INCLUDE_ADDITIONAL_YAML}
```
By default specs are merged additively. That is for every value:
- if existing value and new value are both dictionaries merge them and continue down the hierarchy
- if existing value and new value are both an array then add the new value to the end of the array
- otherwise replace the existing value with the new value
This merging behaviour can be overridden on a value basis. If you wish to replace a whole value (set a new dictionary or new array instead of merging them) then just affix `:REPLACE` to the key
```yaml
include:
- base.yml
name: CustomSpec
targets:
MyTarget: # target lives in base.yml
sources:REPLACE:
- my_new_sources
```
Note that target names can also be changed by adding a `name` property to a target.
### Options
- [ ] **minimumXcodeGenVersion**: **String** - The minimum version of XcodeGen required.
- [ ] **carthageBuildPath**: **String** - The path to the carthage build directory. Defaults to `Carthage/Build`. This is used when specifying target carthage dependencies
- [ ] **carthageExecutablePath**: **String** - The path to the carthage executable. Defaults to `carthage`. You can specify when you use custom built or locally installed Carthage using [Mint](https://github.com/yonaskolb/Mint), for example.
- [ ] **createIntermediateGroups**: **Bool** - If this is specified and set to `true`, then intermediate groups will be created for every path component between the folder containing the source and next existing group it finds or the base path. For example, when enabled if a source path is specified as `Vendor/Foo/Hello.swift`, the group `Vendor` will created as a parent of the `Foo` group. This can be overridden in a specific [Target source](#target-source)
- [ ] **bundleIdPrefix**: **String** - If this is specified then any target that doesn't have an `PRODUCT_BUNDLE_IDENTIFIER` (via all levels of build settings) will get an autogenerated one by combining `bundleIdPrefix` and the target name: `bundleIdPrefix.name`. The target name will be stripped of all characters that aren't alphanumerics, hyphens, or periods. Underscores will be replaced with hyphens.
- [ ] **settingPresets**: **String** - This controls the settings that are automatically applied to the project and its targets. These are the same build settings that Xcode would add when creating a new project. Project settings are applied by config type. Target settings are applied by the product type and platform. By default this is set to `all`
- `all`: project and target settings
- `project`: only project settings
- `targets`: only target settings
- `none`: no settings are automatically applied
- [ ] **developmentLanguage**: **String** - Sets the development language of the project. Defaults to `en`
- [ ] **usesTabs**: **Bool** - If this is specified, the Xcode project will override the user's setting determining whether or not tabs or spaces should be used in the project.
- [ ] **indentWidth**: **Int** - If this is specified, the Xcode project will override the user's setting for indent width in number of spaces.
- [ ] **tabWidth**: **Int** - If this is specified, the Xcode project will override the user's setting for indent width in number of spaces.
- [ ] **xcodeVersion**: **String** - The version of Xcode. This defaults to the latest version periodically. You can specify it in the format `0910` or `9.1`
- [ ] **projectFormat**: **String** - The version of Xcode project. By default this is set to `xcode16_0`
- `xcode16_3`: Xcode 16.3
- `xcode16_0`: Xcode 16.0
- `xcode15_3`: Xcode 15.3
- `xcode15_0`: Xcode 15.0
- `xcode14_0`: Xcode 14.0
- [ ] **deploymentTarget**: **[[Platform](#platform): String]** - A project wide deployment target can be specified for each platform otherwise the default SDK version in Xcode will be used. This will be overridden by any custom build settings that set the deployment target eg `IPHONEOS_DEPLOYMENT_TARGET`. Target specific deployment targets can also be set with [Target](#target).deploymentTarget.
- [ ] **disabledValidations**: **[String]** - A list of validations that can be disabled if they're too strict for your use case. By default this is set to an empty array. Currently these are the available options:
- `missingConfigs`: Disable errors for configurations in yaml files that don't exist in the project itself. This can be useful if you include the same yaml file in different projects
- `missingConfigFiles`: Disable checking for the existence of configuration files. This can be useful for generating a project in a context where config files are not available.
- `missingTestPlans`: Disable checking if test plan paths exist. This can be useful if your test plans haven't been created yet.
- [ ] **defaultConfig**: **String** - The default configuration for command line builds from Xcode. If the configuration provided here doesn't match one in your [configs](#configs) key, XcodeGen will fail. If you don't set this, the first configuration alphabetically will be chosen.
- [ ] **groupSortPosition**: **String** - Where groups are sorted in relation to other files. Either:
- `none` - sorted alphabetically with all the other files
- `top` - at the top, before files
- `bottom` (default) - at the bottom, after other files
- [ ] **groupOrdering**: **[[GroupOrdering]](#groupOrdering)** - An order of groups.
- [ ] **transitivelyLinkDependencies**: **Bool** - If this is `true` then targets will link to the dependencies of their target dependencies. If a target should embed its dependencies, such as application and test bundles, it will embed these transitive dependencies as well. Some complex setups might want to set this to `false` and explicitly specify dependencies at every level. Targets can override this with [Target](#target).transitivelyLinkDependencies. Defaults to `false`.
- [ ] **generateEmptyDirectories**: **Bool** - If this is `true` then empty directories will be added to project too else will be missed. Defaults to `false`.
- [ ] **findCarthageFrameworks**: **Bool** - When this is set to `true`, all the individual frameworks for Carthage framework dependencies will automatically be found. This property can be overridden individually for each carthage dependency - for more details see See **findFrameworks** in the [Dependency](#dependency) section. Defaults to `false`.
- [ ] **localPackagesGroup**: **String** - The group name that local packages are put into. This defaults to `Packages`. Use `""` to specify the project root.
- [ ] **fileTypes**: **[String: [FileType](#filetype)]** - A list of default file options for specific file extensions across the project. Values in [Sources](#sources) will overwrite these settings.
- [ ] **preGenCommand**: **String** - A bash command to run before the project has been generated. If the project isn't generated due to no changes when using the cache then this won't run. This is useful for running things like generating resources files before the project is regenerated.
- [ ] **postGenCommand**: **String** - A bash command to run after the project has been generated. If the project isn't generated due to no changes when using the cache then this won't run. This is useful for running things like `pod install` only if the project is actually regenerated.
- [ ] **useBaseInternationalization**: **Bool** If this is `false` and your project does not include resources located in a **Base.lproj** directory then `Base` will not be included in the projects 'known regions'. The default value is `true`.
- [ ] **schemePathPrefix**: **String** - A path prefix for relative paths in schemes, such as StoreKitConfiguration. The default is `"../../"`, which is suitable for non-workspace projects. For use in workspaces, use `"../"`.
- [ ] **defaultSourceDirectoryType**: **String** - When a [Target source](#target-source) doesn't specify a type and is a directory, this is the type that will be used. If nothing is specified for either then `group` will be used.
- `group` (default)
- `folder`
- `syncedFolder`: Can be used starting from **projectFormat** `xcode16_0`
```yaml
options:
deploymentTarget:
watchOS: "2.0"
tvOS: "10.0"
postGenCommand: pod install
```
### GroupOrdering
Describe an order of groups. Available parameters:
- [ ] **pattern**: **String** - A group name pattern. Can be just a single string and also can be a regex pattern. Optional option, if you don't set it, it will pattern for the main group, i.e. the project.
- [ ] **order**: **[String]** - An order of groups.
```yaml
options:
groupOrdering:
- order: [Sources, Resources, Tests, Support files, Configurations]
- pattern: '^.*Screen$'
order: [View, Presenter, Interactor, Entities, Assembly]
```
In this example, we set up the order of two groups. First one is the main group, i.e. the project, note that in this case, we shouldn't set `pattern` option and the second group order is for groups whose names ends with `Screen`.
### FileType
Default settings for file extensions. See [Sources](#sources) for more documentation on properties. If you overwrite an extension that XcodeGen already provides by default, you will need to provide all the settings.
- [ ] **file**: **Bool** - Whether this extension should be treated like a file. Defaults to true.
- [ ] **buildPhase**: **String** - The default build phase.
- [ ] **attributes**: **[String]** - Additional settings attributes that will be applied to any build files.
- [ ] **resourceTags**: **[String]** - On Demand Resource Tags that will be applied to any resources. This also adds to the project attribute's knownAssetTags.
- [ ] **compilerFlags**: **[String]** - A list of compiler flags to add.
### Breakpoints
- [x] **type**: **String** - Breakpoint type
- `File`: file breakpoint
- `Exception`: exception breakpoint
- `SwiftError`: swift error breakpoint
- `OpenGLError`: OpenGL breakpoint
- `Symbolic`: symbolic breakpoint
- `IDEConstraintError`: IDE constraint breakpoint
- `IDETestFailure`: IDE test failure breakpoint
- `RuntimeIssue`: Runtime issue breakpoint
- [ ] **enabled**: **Bool** - Indicates whether it should be active. Default to `true`
- [ ] **ignoreCount**: **Int** - Indicates how many times it should be ignored before stopping, Default to `0`
- [ ] **continueAfterRunningActions**: **Bool** - Indicates if should automatically continue after evaluating actions, Default to `false`
- [ ] **path**: **String** - Breakpoint file path (only required by file breakpoints)
- [ ] **line**: **Int** - Breakpoint line (only required by file breakpoints)
- [ ] **symbol**: **String** - Breakpoint symbol (only used by symbolic breakpoints)
- [ ] **module**: **String** - Breakpoint module (only used by symbolic breakpoints)
- [ ] **scope**: **String** - Breakpoint scope (only used by exception breakpoints)
- `All`
- `Objective-C` (default)
- `C++`
- [ ] **stopOnStyle**: **String** - Indicates if should stop on style (only used by exception breakpoints)
-`throw` (default)
-`catch`
- [ ] **condition**: **String** - Breakpoint condition
- [ ] **actions**: **[[Breakpoint Action](#breakpoint-action)]** - breakpoint actions
```yaml
breakpoints:
- type: ExceptionBreakpoint
enabled: true
ignoreCount: 0
continueAfterRunningActions: false
```
#### Breakpoint Action
- [x] **type**: **String** - Breakpoint action type
- `DebuggerCommand`: execute debugger command
- `Log`: log message
- `ShellCommand`: execute shell command
- `GraphicsTrace`: capture GPU frame
- `AppleScript`: execute AppleScript
- `Sound`: play sound
- [ ] **command**: **String** - Debugger command (only used by debugger command breakpoint action)
- [ ] **message**: **String** - Log message (only used log message breakpoint action)
- [ ] **conveyanceType**: **String** - Conveyance type (only used by log message breakpoint action)
- `console`: log message to console (default)
- `speak`: speak message
- [ ] **path**: **String** - Shell command file path (only used by shell command breakpoint action)
- [ ] **arguments**: **String** - Shell command arguments (only used by shell command breakpoint action)
- [ ] **waitUntilDone**: **Bool** - Indicates whether it should wait until done (only used by shell command breakpoint action). Default to `false`
- [ ] **script**: **String** - AppleScript (only used by AppleScript breakpoint action)
- [ ] **sound**: **String** - Sound name (only used by sound breakpoint action)
- `Basso` (default)
- `Blow`
- `Bottle`
- `Frog`
- `Funk`
- `Glass`
- `Hero`
- `Morse`
- `Ping`
- `Pop`
- `Purr`
- `Sosumi`
- `Submarine`
- `Tink`
```yaml
actions:
- type: Sound
sound: Blow
```
### Configs
Each config maps to a build type of either `debug` or `release` which will then apply default `Build Settings` to the project. Any value other than `debug` or `release` (for example `none`), will mean no default `Build Settings` will be applied to the project.
```yaml
configs:
Debug: debug
Beta: release
AppStore: release
```
If no configs are specified, default `Debug` and `Release` configs will be created automatically.
### Setting Groups
Setting groups are named groups of `Build Settings` that can be reused elsewhere. Each preset is a [Settings](#settings) schema, so can include other `groups` or define settings by `configs`.
```yaml
settingGroups:
preset_generic:
CUSTOM_SETTING: value_custom
preset_debug:
BUILD_SETTING: value_debug
preset_release:
base:
BUILD_SETTING: value_release
preset_all:
groups:
- preset_generic
configs:
debug:
groups:
- preset_debug
release:
groups:
- preset_release
targets:
Application:
settings:
groups:
- preset_all
```
## Settings
Settings correspond to `Build Settings` tab in Xcode. To display Setting Names instead of Setting Titles, select `Editor -> Show Setting Names` in Xcode.
Settings can either be a simple map of `Build Settings` `[String:String]`, or can be more advanced with the following properties:
- [ ] **groups**: **[String]** - List of [Setting Groups](#setting-groups) to include and merge
- [ ] **configs**: **[String:[Settings](#settings)]** - Mapping of config name to a settings spec. These settings will only be applied for that config. Each key will be matched to any configs that contain the key and is case insensitive. So if you had `Staging Debug` and `Staging Release`, you could apply settings to both of them using `staging`. However if a config name is an exact match to a config it won't be applied to any others. eg `Release` will be applied to config `Release` but not `Staging Release`
- [ ] **base**: **[String:String]** - Used to specify default settings that apply to any config
```yaml
settings:
GENERATE_INFOPLIST_FILE: NO
CODE_SIGNING_ALLOWED: NO
WRAPPER_EXTENSION: bundle
```
Don't mix simple maps with `groups`, `base` and `configs`.
If `groups`, `base`, `configs` are used then simple maps is silently ignored.
In this example, `CURRENT_PROJECT_VERSION` will be set, but `MARKETING_VERSION` will be ignored:
```yaml
settings:
MARKETING_VERSION: 100.0.0
base:
CURRENT_PROJECT_VERSION: 100.0
```
```yaml
settings:
base:
PRODUCT_NAME: XcodeGenProduct
configs:
debug:
CODE_SIGN_IDENTITY: iPhone Developer
PRODUCT_BUNDLE_IDENTIFIER: com.tomtom.debug_app
release:
CODE_SIGN_IDENTITY: iPhone Distribution
PRODUCT_BUNDLE_IDENTIFIER: com.tomtom.app
PROVISIONING_PROFILE_SPECIFIER: "Xcodegen Release"
groups:
- my_settings
```
Settings are merged in the following order: `groups`, `base`, `configs` (simple maps are ignored).
## Target
- [x] **type**: **[Product Type](#product-type)** - Product type of the target
- [x] **platform**: **[Platform](#platform)** - Platform of the target
- [ ] **supportedDestinations**: **[[Supported Destinations](#supported-destinations)]** - List of supported platform destinations for the target.
- [ ] **deploymentTarget**: **String** - The deployment target (eg `9.2`). If this is not specified the value from the project set in [Options](#options)`.deploymentTarget.PLATFORM` will be used.
- [ ] **sources**: **[Sources](#sources)** - Source directories of the target
- [ ] **configFiles**: **[Config Files](#config-files)** - `.xcconfig` files per config
- [ ] **settings**: **[Settings](#settings)** - Target specific build settings. Default platform and product type settings will be applied first before any custom settings defined here. Other context dependant settings will be set automatically as well:
- `INFOPLIST_FILE`: If it doesn't exist your sources will be searched for `Info.plist` files and the first one found will be used for this setting
- `FRAMEWORK_SEARCH_PATHS`: If carthage framework dependencies are used, the platform build path will be added to this setting
- `OTHER_LDFLAGS`: See `requiresObjCLinking` below
- `TEST_TARGET_NAME`: for ui tests that target an application
- `TEST_HOST`: for unit tests that target an application
- [ ] **dependencies**: **[[Dependency](#dependency)]** - Dependencies for the target
- [ ] **info**: **[Plist](#plist)** - If defined, this will generate and write an `Info.plist` to the specified path and use it by setting the `INFOPLIST_FILE` build setting for every configuration, unless `INFOPLIST_FILE` is already defined in **settings** for this configuration. The following properties are generated automatically if appropriate, the rest will have to be provided.
- `CFBundleIdentifier`
- `CFBundleInfoDictionaryVersion`
- `CFBundleExecutable` **Not generated for targets of type bundle**
- `CFBundleName`
- `CFBundleDevelopmentRegion`
- `CFBundleShortVersionString`
- `CFBundleVersion`
- `CFBundlePackageType`
- [ ] **entitlements**: **[Plist](#plist)** - If defined this will generate and write a `.entitlements` file, and use it by setting `CODE_SIGN_ENTITLEMENTS` build setting for every configuration. All properties must be provided
- [ ] **templates**: **[String]** - A list of [Target Templates](#target-template) referenced by name that will be merged with the target in order. Any instances of `${target_name}` within these templates will be replaced with the target name.
- [ ] **templateAttributes**: **[String: String]** - A list of attributes where each instance of `${attributeName}` within the templates listed in `templates` will be replaced with the value specified.
- [ ] **transitivelyLinkDependencies**: **Bool** - If this is not specified the value from the project set in [Options](#options)`.transitivelyLinkDependencies` will be used.
- [ ] **directlyEmbedCarthageDependencies**: **Bool** - If this is `true` Carthage framework dependencies will be embedded using an `Embed Frameworks` build phase instead of the `copy-frameworks` script. Defaults to `true` for all targets except iOS/tvOS/watchOS Applications.
- [ ] **requiresObjCLinking**: **Bool** - If this is `true` any targets that link to this target will have `-ObjC` added to their `OTHER_LDFLAGS`. This is required if a static library has any categories or extensions on Objective-C code. See [this guide](https://pewpewthespells.com/blog/objc_linker_flags.html#objc) for more details. Defaults to `true` if `type` is `library.static`. If you are 100% sure you don't have categories or extensions on Objective-C code (pure Swift with no use of Foundation/UIKit) you can set this to `false`, otherwise it's best to leave it alone.
- [ ] **onlyCopyFilesOnInstall**: **Bool** – If this is `true`, the `Embed Frameworks` and `Embed App Extensions` (if available) build phases will have the "Copy only when installing" chekbox checked. Defaults to `false`.
- [ ] **buildToolPlugins**: **[[Build Tool Plug-ins](#build-tool-plug-ins)]** - Commands for the build system that run automatically *during* the build.
- [ ] **preBuildScripts**: **[[Build Script](#build-script)]** - Build scripts that run *before* any other build phases
- [ ] **postCompileScripts**: **[[Build Script](#build-script)]** - Build scripts that run after the Compile Sources phase
- [ ] **postBuildScripts**: **[[Build Script](#build-script)]** - Build scripts that run *after* any other build phases
- [ ] **buildRules**: **[[Build Rule](#build-rule)]** - Custom build rules
- [ ] **scheme**: **[Target Scheme](#target-scheme)** - Generated scheme with tests or config variants
- [ ] **legacy**: **[Legacy Target](#legacy-target)** - When present, opt-in to make an Xcode "External Build System" legacy target instead.
- [ ] **attributes**: **[String: Any]** - This sets values in the project `TargetAttributes`. It is merged with `attributes` from the project and anything automatically added by XcodeGen, with any duplicate values being override by values specified here. This is for advanced use only. Properties that are already set include:
- `DevelopmentTeam`: if all configurations have the same `DEVELOPMENT_TEAM` setting
- `ProvisioningStyle`: if all configurations have the same `CODE_SIGN_STYLE` setting
- `TestTargetID`: if all configurations have the same `TEST_TARGET_NAME` setting
- [ ] **putResourcesBeforeSourcesBuildPhase**: **Bool** - If this is `true` the `Copy Resources` step will be placed before the `Compile Sources` build step.
### Product Type
This will provide default build settings for a certain product type. It can be any of the following:
- `application`
- `application.on-demand-install-capable`
- `application.messages`
- `application.watchapp`
- `application.watchapp2`
- `application.watchapp2-container`
- `app-extension`
- `app-extension.intents-service`
- `app-extension.messages`
- `app-extension.messages-sticker-pack`
- `bundle`
- `bundle.ocunit-test`
- `bundle.ui-testing`
- `bundle.unit-test`
- `extensionkit-extension`
- `framework`
- `instruments-package`
- `library.dynamic`
- `library.static`
- `framework.static`
- `tool`
- `tv-app-extension`
- `watchkit-extension`
- `watchkit2-extension`
- `xcode-extension`
- `driver-extension`
- `system-extension`
- `xpc-service`
- ``""`` (used for legacy targets)
### Platform
This will provide default build settings for a certain platform. It can be any of the following:
- `auto` (available only when we use `supportedDestinations`)
- `iOS`
- `tvOS`
- `macOS`
- `watchOS`
- `visionOS` (`visionOS` doesn't support Carthage usage)
Note that when we use supported destinations with Xcode 14+ we can avoid the definition of platform that fallbacks to the `auto` value.
**Multi Platform targets**
You can also specify an array of platforms. This will generate a target for each platform.
If `deploymentTarget` is specified for a multi platform target, it can have different values per platform similar to how it's defined in [Options](#options). See below for an example.
If you reference the string `${platform}` anywhere within the target spec, that will be replaced with the platform.
The generated targets by default will have a suffix of `_${platform}` applied, you can change this by specifying a `platformSuffix` or `platformPrefix`.
If no `PRODUCT_NAME` build setting is specified for a target, this will be set to the target name, so that this target can be imported under a single name.
```yaml
targets:
MyFramework:
sources: MyFramework
platform: [iOS, tvOS]
deploymentTarget:
iOS: 9.0
tvOS: 10.0
type: framework
settings:
base:
INFOPLIST_FILE: MyApp/Info.plist
PRODUCT_BUNDLE_IDENTIFIER: com.myapp
MY_SETTING: platform ${platform}
groups:
- ${platform}
```
The above will generate 2 targets named `MyFramework_iOS` and `MyFramework_tvOS`, with all the relevant platform build settings. They will both have a `PRODUCT_NAME` of `MyFramework`
### Supported Destinations
This will provide a mix of default build settings for the chosen platform destinations. It can be any of the following:
- `iOS`
- `tvOS`
- `macOS`
- `macCatalyst`
- `visionOS`
- `watchOS`
```yaml
targets:
MyFramework:
type: framework
supportedDestinations: [iOS, tvOS]
deploymentTarget:
iOS: 9.0
tvOS: 10.0
sources:
- path: MySources
inferDestinationFiltersByPath: true
- path: OtherSources
destinationFilters: [iOS]
```
Note that the definition of supported destinations can be applied to almost every type of bundle making everything more easy to manage (app targets, unit tests, UI tests etc). App targets currently do not support the watchOS destination. Create a separate target using `platform` for watchOS apps. See Apple's [Configuring a multiplatform app](https://developer.apple.com/documentation/xcode/configuring-a-multiplatform-app-target) for details.
### Sources
Specifies the source directories for a target. This can either be a single source or a list of sources. Applicable source files, resources, headers, and `.lproj` files will be parsed appropriately.
A source can be provided via a string (the path) or an object of the form:
#### Target Source
- [x] **path**: **String** - The path to the source file or directory.
- [ ] **name**: **String** - Can be used to override the name of the source file or directory. By default the last component of the path is used for the name
- [ ] **group**: **String** - Can be used to override the parent group of the source file or directory. By default a group is created at the root with the name of this source file or directory or intermediate groups are created if `createIntermediateGroups` is set to `true`. Multiple groups can be created by separating each one using a `/`. If multiple target sources share the same `group`, they will be put together in the same parent group.
- [ ] **compilerFlags**: **[String]** or **String** - A list of compilerFlags to add to files under this specific path provided as a list or a space delimited string. Defaults to empty.
- [ ] **excludes**: **[String]** - A list of [global patterns](https://en.wikipedia.org/wiki/Glob_(programming)) representing the files to exclude. These rules are relative to `path` and _not the directory where `project.yml` resides_. XcodeGen uses Bash 4's Glob behaviors where globstar (**) is enabled.
- [ ] **includes**: **[String]** - A list of global patterns in the same format as `excludes` representing the files to include. These rules are relative to `path` and _not the directory where `project.yml` resides_. If **excludes** is present and file conflicts with **includes**, **excludes** will override the **includes** behavior.
- [ ] **explicitFolders**: **[String]** - Only valid for `syncedFolder` type. A list of global patterns in the same format as `excludes` to child folders that Xcode should treat as folder references.
- [ ] **destinationFilters**: **[[Supported Destinations](#supported-destinations)]** - List of supported platform destinations the files should filter to. Defaults to all supported destinations.
- [ ] **inferDestinationFiltersByPath**: **Bool** - This is a convenience filter that helps you to filter the files if their paths match these patterns `**/<supportedDestination>/*` or `*_<supportedDestination>.swift`. Note, if you use `destinationFilters` this flag will be ignored.
- [ ] **createIntermediateGroups**: **Bool** - This overrides the value in [Options](#options).
- [ ] **optional**: **Bool** - Disable missing path check. Defaults to false.
- [ ] **buildPhase**: **String** - This manually sets the build phase this file or files in this directory will be added to, otherwise XcodeGen will guess based on the file extension. Note that `Info.plist` files will never be added to any build phases, no matter what this setting is. Possible values are:
- `sources` - Compile Sources phase
- `resources` - Copy Bundle Resources phase
- `headers` - Headers Phase
- `copyFiles` - Copy Files Phase. Must be specified as an object with the following fields:
- [x] **destination**: **String** - Destination of the Copy Files phase. This can be one of the following values:
- `absolutePath`
- `productsDirectory`
- `wrapper`
- `executables`
- `resources`
- `javaResources`
- `frameworks`
- `sharedFrameworks`
- `sharedSupport`
- `plugins`
- [ ] **subpath**: **String** - The path inside of the destination to copy the files.
- `none` - Will not be added to any build phases
- [ ] **type**: **String**: This can be one of the following values
- `file`: a file reference with a parent group will be created (Default for files or directories with extensions)
- `group`: a group with all it's containing files. (Default for directories without extensions)
- `folder`: a folder reference.
- `syncedFolder`: Xcode 16's synchronized folders, also knows as buildable folders
- [ ] **headerVisibility**: **String** - The visibility of any headers. This defaults to `public`, but can be either:
- `public`
- `private`
- `project`
- [ ] **attributes**: **[String]** - Additional settings attributes that will be applied to any build files.
- [ ] **resourceTags**: **[String]** - On Demand Resource Tags that will be applied to any resources. This also adds to the project attribute's knownAssetTags
```yaml
targets:
MyTarget:
sources: MyTargetSource
MyOtherTarget:
supportedDestinations: [iOS, tvOS]
sources:
- MyOtherTargetSource1
- path: MyOtherTargetSource2
inferDestinationFiltersByPath: true
name: MyNewName
excludes:
- "ios/*.[mh]"
- "configs/server[0-2].json"
- "*-Private.h"
- "**/*.md" # excludes all files with the .md extension
- "ios/**/*Tests.[hm]" # excludes all files with an h or m extension within the ios directory.
compilerFlags:
- "-Werror"
- "-Wextra"
- path: MyOtherTargetSource3
destinationFilters: [iOS]
compilerFlags: "-Werror -Wextra"
- path: ModuleMaps
buildPhase:
copyFiles:
destination: productsDirectory
subpath: include/$(PRODUCT_NAME)
- path: Resources
type: folder
- path: Path/To/File.asset
resourceTags: [tag1, tag2]
```
### Dependency
A dependency can be one of a 6 types:
- `target: name` - links to another target. If you are using project references you can specify a target within another project by using `ProjectName/TargetName` for the name
- `framework: path` - links to a framework or XCFramework
- `carthage: name` - helper for linking to a Carthage framework (not XCFramework)
- `sdk: name` - links to a dependency with the SDK. This can either be a relative path within the sdk root or a single filename that references a framework (.framework) or lib (.tbd)
- `package: name` - links to a Swift Package. The name must match the name of a package defined in the top level `packages`
- `bundle: name` - adds the pre-built bundle for the supplied name to the copy resources build phase. This is useful when a dependency exists on a static library target that has an associated bundle target, both existing in a separate project. Only usable in target types which can copy resources.
**Linking options**:
- [ ] **embed**: **Bool** - Whether to embed the dependency. Defaults to true for application target and false for non application targets.
- [ ] **link**: **Bool** - Whether to link the dependency. Defaults to `true` depending on the type of the dependency and the type of the target (e.g. static libraries will only link to executables by default).
- [ ] **codeSign**: **Bool** - Whether the `codeSignOnCopy` setting is applied when embedding framework. Defaults to true.
- [ ] **removeHeaders**: **Bool** - Whether the `removeHeadersOnCopy` setting is applied when embedding the framework. Defaults to true.
- [ ] **weak**: **Bool** - Whether the `Weak` setting is applied when linking the framework. Defaults to false.
- [ ] **platformFilter**: **String** - This field is specific to Mac Catalyst. It corresponds to the "Platforms" dropdown in the Frameworks & Libraries section of Target settings in Xcode. Available options are: **iOS**, **macOS** and **all**. Defaults is **all**.
- [ ] **destinationFilters**: **[[Supported Destinations](#supported-destinations)]** - List of supported platform destinations this dependency should filter to. Defaults to all supported destinations.
- [ ] **platforms**: **[[Platform](#platform)]** - List of platforms this dependency should apply to. Defaults to all applicable platforms.
- **copy** - Copy Files Phase for this dependency. This only applies when `embed` is true. Must be specified as an object with the following fields:
- [x] **destination**: **String** - Destination of the Copy Files phase. This can be one of the following values:
- `absolutePath`
- `productsDirectory`
- `wrapper`
- `executables`
- `resources`
- `javaResources`
- `frameworks`
- `sharedFrameworks`
- `sharedSupport`
- `plugins`
- [ ] **subpath**: **String** - The path inside of the destination to copy the files.
**Implicit Framework options**:
This only applies to `framework` dependencies. Implicit framework dependencies are useful in Xcode Workspaces which have multiple `.xcodeproj` that are not embedded within each other yet have a dependency on a framework built in an adjacent `.xcodeproj`. By having `Find Implicit Dependencies` checked within your scheme `Build Options` Xcode can link built frameworks in `BUILT_PRODUCTS_DIR`.
- [ ] **implicit**: **Bool** - Whether the framework is an implicit dependency. Defaults to `false` .
**Carthage Dependency**
- [ ] **findFrameworks**: **Bool** - Whether to find Carthage frameworks automatically. Defaults to `true` .
- [ ] **linkType**: **String** - Dependency link type. This value should be `dynamic` or `static`. Default value is `dynamic` .
Carthage frameworks are expected to be in `CARTHAGE_BUILD_PATH/PLATFORM/FRAMEWORK.framework` where:
- `CARTHAGE_BUILD_PATH` = `options.carthageBuildPath` or `Carthage/Build` by default
- `PLATFORM` = the target's platform
- `FRAMEWORK` = the specified name.
To link an XCFramework produced by Carthage (in `CARTHAGE_BUILD_PATH/FRAMEWORK.xcframework`), use a normal `framework:`
dependency. The helper logic provided by this dependency type is not necessary.
All the individual frameworks of a Carthage dependency can be automatically found via `findFrameworks: true`. This overrides the value of [Options](#options).findCarthageFrameworks. Otherwise each one will have to be listed individually.
Xcodegen uses `.version` files generated by Carthage in order for this framework lookup to work, so the Carthage dependencies will need to have already been built at the time XcodeGen is run.
If any applications contain carthage dependencies within itself or any dependent targets, a carthage copy files script is automatically added to the application containing all the relevant frameworks. A `FRAMEWORK_SEARCH_PATHS` setting is also automatically added
Carthage officially supports static frameworks. In this case, frameworks are expected to be in `CARTHAGE_BUILD_PATH/PLATFORM/Static/FRAMEWORK.framework`.
You can specify `linkType` to `static` to integrate static ones.
```yaml
projectReferences:
FooLib:
path: path/to/FooLib.xcodeproj
targets:
MyTarget:
supportedDestinations: [iOS, tvOS]
dependencies:
- target: MyFramework
destinationFilters: [iOS]
- target: FooLib/FooTarget
- framework: path/to/framework.framework
destinationFilters: [tvOS]
- carthage: Result
findFrameworks: false
linkType: static
destinationFilters: [iOS]
- sdk: Contacts.framework
- sdk: libc++.tbd
- sdk: libz.dylib
MyFramework:
type: framework
```
**SDK Dependency**
- [ ] **root**: **String** - Root of framework path, for example `DEVELOPER_DIR`. Default value is `BUILT_PRODUCTS_DIR`
```yaml
targets:
MyTestTarget:
dependencies:
- target: MyFramework
- framework: path/to/framework.framework
- sdk: Contacts.framework
- sdk: Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest
root: DEVELOPER_DIR
MyFramework:
type: framework
```
**Package dependency**
- [ ] **product**: **String** - The product to use from the package. This defaults to the package name, so is only required if a Package has multiple libraries or a library with a differing name. Use this over `products` when you want to define different linking options per product.
- [ ] **products**: **String** - A list of products to use from the package. This can be used when depending on multiple products from a package.
```yaml
packages:
Yams:
url: https://github.com/jpsim/Yams
majorVersion: 2.0.0
SwiftPM:
url: https://github.com/apple/swift-package-manager
branch: swift-5.0-branch
targets:
App:
dependencies:
- package: Yams
- package: SwiftPM
product: SPMUtility
```
Depending on multiple products from a package:
```yaml
packages:
FooFeature:
path: Packages/FooFeature
targets:
App:
dependencies:
- package: FooFeature
products:
- FooDomain
- FooUI
```
### Config Files
Specifies `.xcconfig` files for each configuration.
```yaml
configFiles:
Debug: debug.xcconfig
Release: release.xcconfig
targets:
App:
configFiles:
Debug: App/debug.xcconfig
Release: App/release.xcconfig
```
### Plist
Plists are created on disk on every generation of the project. They can be used as a way to define `Info.plist` or `.entitlement` files. Some `Info.plist` properties are generated automatically.
- [x] **path**: **String** - This is the path where the plist will be written to
- [x] **properties**: **[String: Any]** - This is a map of all the plist keys and values
```yml
targets:
App:
info:
path: App/Info.plist
properties:
UISupportedInterfaceOrientations: [UIInterfaceOrientationPortrait]
UILaunchStoryboardName: LaunchScreen
entitlements:
path: App/App.entitlements
properties:
com.apple.security.application-groups: group.com.app
```
### Build Tool Plug-ins
To add `Build Tool Plug-ins`, you need to add information about plugins to [Target](#target):
- **buildToolPlugins**: List of plugins to connect to the target
Each plugin includes information:
- [x] **plugin**: **String** - plugin name
- [x] **package**: **String** - the name of the package that contains the plugin
Сonnect the plugin to the desired target:
```yaml
targets:
App:
buildToolPlugins:
- plugin: MyPlugin
package: MyPackage
```
Don't forget to add a package containing the plugin we need:
```yaml
packages:
MyPackage:
url: https://github.com/MyPackage
from: 1.3.0
```
### Build Script
Run script build phases can be added at 3 different points in the build:
- **preBuildScripts**: Before any other build phases
- **postCompileScripts**: After the compile sources build phase
- **postBuildScripts**: After any other build phases
Each script can contain:
- [x] **path**: **String** - a relative or absolute path to a shell script
- [x] **script**: **String** - an inline shell script
- [ ] **name**: **String** - name of a script. Defaults to `Run Script`
- [ ] **inputFiles**: **[String]** - list of input files
- [ ] **outputFiles**: **[String]** - list of output files
- [ ] **inputFileLists**: **[String]** - list of input .xcfilelist
- [ ] **outputFileLists**: **[String]** - list of output .xcfilelist
- [ ] **shell**: **String** - shell used for the script. Defaults to `/bin/sh`
- [ ] **showEnvVars**: **Bool** - whether the environment variables accessible to the script show be printed to the build log. Defaults to `true`
- [ ] **runOnlyWhenInstalling**: **Bool** - whether the script is only run when installing (`runOnlyForDeploymentPostprocessing`). Defaults to `false`
- [ ] **basedOnDependencyAnalysis**: **Bool** - whether to skip the script if inputs, context, or outputs haven't changed. Defaults to `true`
- [ ] **discoveredDependencyFile**: **String** - discovered dependency .d file. Defaults to none
Either a **path** or **script** must be defined, the rest are optional.
A multiline script can be written using the various YAML multiline methods, for example with `|` as below:
```yaml
targets:
MyTarget:
preBuildScripts:
- path: myscripts/my_script.sh
name: My Script
inputFiles:
- $(SRCROOT)/file1
- $(SRCROOT)/file2
inputFileLists:
- $(SRCROOT)/inputFiles.xcfilelist
outputFiles:
- $(DERIVED_FILE_DIR)/file1
- $(DERIVED_FILE_DIR)/file2
outputFileLists:
- $(SRCROOT)/outputFiles.xcfilelist
discoveredDependencyFile: $(DERIVED_FILE_DIR)/target.d
postCompileScripts:
- script: swiftlint
name: Swiftlint
- script: |
command do
othercommand
postBuildScripts:
- path: myscripts/my_final_script.sh
name: My Final Script
```
### Build Rule
- [ ] **filePattern**: **String** - A glob pattern for the files that will have the build rule run on them. This or `fileType` must be defined
- [ ] **fileType**: **String** - A file type determined by Xcode. The available types can be seen by hovering your mouse of the `Process` dropdown in the Xcode interface. For example `sourcecode.swift` or `file.xib`. This or `filePattern` must be defined.
- [ ] **script**: **String** - The script that will be run on each file. This or `compilerSpec` must be defined.
- [ ] **compilerSpec**: **String**: A reference to a built in apple tool to run on each file. This is for advanced use and the the values for this must be checked. This or `script` must be defined.
- [ ] **name**: **String** - The name of a build rule. Defaults to `Build Rule`
- [ ] **outputFiles**: **[String]** - The list of output files
- [ ] **outputFilesCompilerFlags**: **[String]** - The list of compiler flags to apply to the output files
- [ ] **runOncePerArchitecture**: **Bool** - a boolean that indicates if this rule should run once per architecture. This defaults to true
```yaml
targets:
MyTarget:
buildRules:
- filePattern: "*.xcassets"
script: generate_assets.py
- fileType: sourcecode.swift
script: pre_process_swift.py
- filePattern: "*.txt"
name: My Build Rule
compilerSpec: com.apple.xcode.tools.swift.compiler
outputFiles:
- $(SRCROOT)/Generated.swift
runOncePerArchitecture: false
```
### Target Scheme
This is a convenience used to automatically generate schemes for a target based on different configs or included tests. If you want more control check out the top level [Scheme](#scheme).
- [x] **configVariants**: **[String]** - This generates a scheme for each entry, using configs that contain the name with debug and release variants. This is useful for having different environment schemes.
- [ ] **testTargets**: **[[Test Target](#test-target)]** - a list of test targets that should be included in the scheme. These will be added to the build targets and the test entries. Each entry can either be a simple string, or a [Test Target](#test-target)
- [ ] **gatherCoverageData**: **Bool** - a boolean that indicates if this scheme should gather coverage data. This defaults to false
- [ ] **coverageTargets**: **[[Testable Target Reference](#testable-target-reference) - a list of targets to gather code coverage. Each entry can either be a simple string, a string using [Project Reference](#project-reference) or [Testable Target Reference](#testable-target-reference)
- [ ] **disableMainThreadChecker**: **Bool** - a boolean that indicates if this scheme should disable the Main Thread Checker. This defaults to false
- [ ] **stopOnEveryMainThreadCheckerIssue**: **Bool** - a boolean that indicates if this scheme should stop at every Main Thread Checker issue. This defaults to false
- [ ] **disableThreadPerformanceChecker**: **Bool** - a boolean that indicates if this scheme should disable the Thread Performance Checker. This defaults to false
- [ ] **buildImplicitDependencies**: **Bool** - Flag to determine if Xcode should build implicit dependencies of this scheme. By default this is `true` if not set.
- [ ] **language**: **String** - a String that indicates the language used for running and testing. This defaults to nil
- [ ] **region**: **String** - a String that indicates the region used for running and testing. This defaults to nil
- [ ] **commandLineArguments**: **[String:Bool]** - a dictionary from the argument name (`String`) to if it is enabled (`Bool`). These arguments will be added to the Test, Profile and Run scheme actions
- [ ] **environmentVariables**: **[[Environment Variable](#environment-variable)]** or **[String:String]** - environment variables for Run, Test and Profile scheme actions. When passing a dictionary, every key-value entry maps to a corresponding variable that is enabled.
- [ ] **testPlans**: **[[Test Plan](#test-plan)]** - List of test plan locations that will be referenced in the scheme.
- [ ] **preActions**: **[[Execution Action](#execution-action)]** - Scripts that are run *before* the build action
- [ ] **postActions**: **[[Execution Action](#execution-action)]** - Scripts that are run *after* the build action
- [ ] **management**: **[Scheme Management](#scheme-management)** - Management options for the scheme
- [ ] **storeKitConfiguration**: **String** - specify storekit configuration to use during run. See [Options](#options).
For example, the spec below would create 3 schemes called:
- MyApp Test
- MyApp Staging
- MyApp Production
Each scheme would use different build configuration for the different build types, specifically debug configs for `run`, `test`, and `analyze`, and release configs for `profile` and `archive`.
The MyUnitTests target would also be linked.
```yaml
configs:
Test Debug: debug
Staging Debug: debug
Production Debug: debug
Test Release: release
Staging Release: release
Production Release: release
targets:
MyApp:
scheme:
testTargets:
- MyUnitTests
configVariants:
- Test
- Staging
- Production
gatherCoverageData: true
coverageTargets:
- MyTarget1
- ExternalTarget/OtherTarget1
commandLineArguments:
"-MyEnabledArg": true
"-MyDisabledArg": false
environmentVariables:
MY_ENV_VAR: VALUE
MyUnitTests:
sources: Tests
```
### Legacy Target
By providing a legacy target, you are opting in to the "Legacy Target" mode. This is the "External Build Tool" from the Xcode GUI. This is useful for scripts that you want to run as dependencies of other targets, but you want to make sure that it only runs once even if it is specified as a dependency from multiple other targets.
- [x] ***toolPath***: String - Path to the build tool used in the legacy target.
- [ ] ***arguments***: String - Build arguments used for the build tool in the legacy target
- [ ] ***passSettings***: Bool - Whether or not to pass build settings down to the build tool in the legacy target.
- [ ] ***workingDirectory***: String - The working directory under which the build tool will be invoked in the legacy target.
## Aggregate Target
This is used to override settings or run build scripts in specific targets
- [x] **targets**: **[String]** - The list of target names to include as target dependencies
- [ ] **configFiles**: **[Config Files](#config-files)** - `.xcconfig` files per config
- [ ] **settings**: **[Settings](#settings)** - Target specific build settings.
- [ ] **buildToolPlugins**: **[[Build Tool Plug-ins](#build-tool-plug-ins)]** - Commands for the build system that run automatically *during* the build
- [ ] **buildScripts**: **[[Build Script](#build-script)]** - Build scripts to run
- [ ] **scheme**: **[Target Scheme](#target-scheme)** - Generated scheme
- [ ] **attributes**: **[String: Any]** - This sets values in the project `TargetAttributes`. It is merged with `attributes` from the project and anything automatically added by XcodeGen, with any duplicate values being override by values specified here
## Target Template
This is a template that can be referenced from a normal target using the `templates` property. The properties of this template are the same as a [Target](#target).
Any instances of `${target_name}` within each template will be replaced by the final target name which references the template.
Any attributes defined within a targets `templateAttributes` will be used to replace any attribute references in the template using the syntax `${attribute_name}`.
```yaml
targets:
MyFramework:
templates:
- Framework
templateAttributes:
frameworkName: AwesomeFramework
sources:
- SomeSources
targetTemplates:
Framework:
platform: iOS
type: framework
sources:
- ${frameworkName}/${target_name}
```
## Scheme
Schemes allows for more control than the convenience [Target Scheme](#target-scheme) on [Target](#target)
- [x] ***build***: Build options
- [ ] ***run***: The run action
- [ ] ***test***: The test action
- [ ] ***profile***: The profile action
- [ ] ***analyze***: The analyze action
- [ ] ***archive***: The archive action
- [ ] ***management***: management metadata
### Build
- [x] **targets**: **[String:String]** or **[String:[String]]** - A map of target names to build and which build types they should be enabled for. The build types can be `all`, `none`, or an array of the following types:
- `run` or `running`
- `test` or `testing`
- `profile` or `profiling`
- `analyze` or `analyzing`
- `archive` or `archiving`
- [ ] **parallelizeBuild**: **Bool** - Whether or not your targets should be built in parallel. By default this is `true` if not set.
- `true`: Build targets in parallel
- `false`: Build targets serially
- [ ] **buildImplicitDependencies**: **Bool** - Flag to determine if Xcode should build implicit dependencies of this scheme. By default this is `true` if not set.
- `true`: Discover implicit dependencies of this scheme
- `false`: Only build explicit dependencies of this scheme
- [ ] **runPostActionsOnFailure**: **Bool** - Flag to determine if Xcode should run post scripts despite failure build. By default this is `false` if not set.
- `true`: Run post scripts even if build is failed
- `false`: Only run post scripts if build success
```yaml
targets:
MyTarget: all
FooLib/FooTarget: [test, run]
parallelizeBuild: true
buildImplicitDependencies: true
```
### Common Build Action options
The different actions share some properties:
- [ ] **config**: **String** - All build actions can be set to use a certain config. If a config, or the build action itself, is not defined the first configuration found of a certain type will be used, depending on the type:
- `debug`: run, test, analyze
- `release`: profile, archive
- [ ] **commandLineArguments**: **[String:Bool]** - `run`, `test` and `profile` actions have a map of command line arguments to whether they are enabled
- [ ] **preActions**: **[[Execution Action](#execution-action)]** - Scripts that are run *before* the action
- [ ] **postActions**: **[[Execution Action](#execution-action)]** - Scripts that are run *after* the action
- [ ] **environmentVariables**: **[[Environment Variable](#environment-variable)]** or **[String:String]** - `run`, `test` and `profile` actions can define the environment variables. When passing a dictionary, every key-value entry maps to a corresponding variable that is enabled.
- [ ] **enableGPUFrameCaptureMode**: **GPUFrameCaptureMode** - Property value set for `GPU Frame Capture`. Possible values are `autoEnabled`, `metal`, `openGL`, `disabled`. Default is `autoEnabled`.
- [ ] **enableGPUValidationMode**: **Bool** - Property value set for `Metal API Validation`. This defaults to true.
- [ ] **disableMainThreadChecker**: **Bool** - `run` and `test` actions can define a boolean that indicates that this scheme should disable the Main Thread Checker. This defaults to false
- [ ] **stopOnEveryMainThreadCheckerIssue**: **Bool** - a boolean that indicates if this scheme should stop at every Main Thread Checker issue. This defaults to false
- [ ] **disableThreadPerformanceChecker**: **Bool** - `run` action can define a boolean that indicates that this scheme should disable the Thread Performance Checker. This defaults to false
- [ ] **language**: **String** - `run` and `test` actions can define a language that is used for Application Language
- [ ] **region**: **String** - `run` and `test` actions can define a language that is used for Application Region
- [ ] **debugEnabled**: **Bool** - `run` and `test` actions can define a whether debugger should be used. This defaults to true.
- [ ] **simulateLocation**: **[Simulate Location](#simulate-location)** - `run` action can define a simulated location
- [ ] **askForAppToLaunch**: **Bool** - `run` and `profile` actions can define the executable set to ask to launch. This defaults to false.
- [ ] **launchAutomaticallySubstyle**: **String** - `run` action can define the launch automatically substyle ('2' for extensions).
- [ ] **storeKitConfiguration**: **String** - `run` action can specify a storekit configuration. See [Options](#options).
- [ ] **macroExpansion**: **String** - `run` and `test` actions can define the macro expansion from other target. This defaults to nil.
### Execution Action
Scheme run scripts added via **preActions** or **postActions**. They run before or after a build action, respectively, and in the order defined. Each execution action can contain:
- [x] **script**: **String** - an inline shell script
- [ ] **name**: **String** - name of a script. Defaults to `Run Script`
- [ ] **settingsTarget**: **String** - name of a build or test target whose settings will be available as environment variables.
A multiline script can be written using the various YAML multiline methods, for example with `|`. See [Build Script](#build-script).
### Run Action
- [ ] **executable**: **String** - the name of the target to launch as an executable. Defaults to the first runnable build target in the scheme, or the first build target if a runnable build target is not found
- [ ] **customLLDBInit**: **String** - the absolute path to the custom `.lldbinit` file
- [ ] **customWorkingDirectory**: **String** - a path to use as the working directory when launching the executable.
### Test Action
- [ ] **gatherCoverageData**: **Bool** - a boolean that indicates if this scheme should gather coverage data. This defaults to false
- [ ] **coverageTargets**: **[[Testable Target Reference](#testable-target-reference)]** - a list of targets to gather code coverage. Each entry can either be a simple string, a string using [Project Reference](#project-reference) or [Testable Target Reference](#testable-target-reference)
- [ ] **targets**: **[[Test Target](#test-target)]** - a list of targets to test. Each entry can either be a simple string, or a [Test Target](#test-target)
- [ ] **customLLDBInit**: **String** - the absolute path to the custom `.lldbinit` file
- [ ] **captureScreenshotsAutomatically**: **Bool** - indicates whether screenshots should be captured automatically while UI Testing. This defaults to true.
- [ ] **deleteScreenshotsWhenEachTestSucceeds**: **Bool** - whether successful UI tests should cause automatically-captured screenshots to be deleted. If `captureScreenshotsAutomatically` is false, this value is ignored. This defaults to true.
- [ ] **testPlans**: **[[Test Plan](#test-plan)]** - List of test plan locations that will be referenced in the scheme.
- [ ] **preferredScreenCaptureFormat**: **String** - automatic screen capture format to use while UI Testing. Possible values are `screenshots`, `screenRecording`. Default is `screenRecording`.
#### Test Target
A target can be one of a 2 types:
- **name**: **String** - The name of the target.
- **target**: **[Testable Target Reference](#testable-target-reference)** - The information of the target. You can specify more detailed information than `name:`.
As syntax sugar, you can also specify **[Testable Target Reference](#testable-target-reference)** without `target`.
#### Other Parameters
- [ ] **parallelizable**: **Bool** - Whether to run tests in parallel. Defaults to false
- [ ] **randomExecutionOrder**: **Bool** - Whether to run tests in a random order. Defaults to false
- [ ] **location**: **String** - GPX file or predefined value for simulating location. See [Simulate Location](#simulate-location) for location examples.
- [ ] **skipped**: **Bool** - Whether to skip all of the test target tests. Defaults to false
- [ ] **skippedTests**: **[String]** - List of tests in the test target to skip. Defaults to empty
- [ ] **selectedTests**: **[String]** - List of tests in the test target to whitelist and select. Defaults to empty. This will override `skippedTests` if provided
#### Testable Target Reference
A Testable Target Reference can be one of 3 types:
- `package: {local-swift-package-name}/{target-name}`: Name of local swift package and its target.
- `local: {target-name}`: Name of local target.
- `project: {project-reference-name}/{target-name}`: Name of local swift package and its target.
### Archive Action
- [ ] **customArchiveName**: **String** - the custom name to give to the archive
- [ ] **revealArchiveInOrganizer**: **Bool** - flag to determine whether the archive will be revealed in Xcode's Organizer after it's done building
### Simulate Location
- [x] **allow**: **Bool** - enable location simulation
- [ ] **defaultLocation**: **String** - set the default location, possible values:
- `London, England`
- `Johannesburg, South Africa`
- `Moscow, Russia`
- `Mumbai, India`
- `Tokyo, Japan`
- `Sydney, Australia`
- `Hong Kong, China`
- `Honolulu, HI, USA`
- `San Francisco, CA, USA`
- `Mexico City, Mexico`
- `New York, NY, USA`
- `Rio de Janeiro, Brazil`
- `<relative-path-to-gpx-file>` (e.g. ./location.gpx)
Setting the **defaultLocation** to a custom gpx file, you also need to add that file to `fileGroups` for Xcode be able to use it:
```yaml
targets:
MyTarget:
fileGroups:
- location.gpx
```
Note that the path the gpx file will be prefixed according to the `schemePathPrefix` option in order to support both `.xcodeproj` and `.xcworkspace` setups. See [Options](#options).
### Scheme Management
- [ ] **shared**: **Bool** - indicates whether the scheme is shared
- [ ] **orderHint**: **Int** - used by Xcode to sort the schemes
- [ ] **isShown**: **Bool** - indicates whether the sheme is shown in the scheme list
### Environment Variable
- [x] **variable**: **String** - variable's name.
- [x] **value**: **String** - variable's value.
- [ ] **isEnabled**: **Bool** - indicates whether the environment variable is enabled. This defaults to true.
```yaml
schemes:
Production:
build:
targets:
MyTarget1: all
MyTarget2: [run, archive]
run:
config: prod-debug
commandLineArguments:
"-MyEnabledArg": true
"-MyDisabledArg": false
environmentVariables:
RUN_ENV_VAR: VALUE
test:
config: prod-debug
commandLineArguments:
"-MyEnabledArg": true
"-MyDisabledArg": false
gatherCoverageData: true
coverageTargets:
- MyTarget1
- ExternalTarget/OtherTarget1
- package: LocalPackage/TestTarget
targets:
- Tester1
- name: Tester2
parallelizable: true
randomExecutionOrder: true
skippedTests: [Test/testExample()]
- package: APIClient/APIClientTests
parallelizable: true
randomExecutionOrder: true
environmentVariables:
- variable: TEST_ENV_VAR
value: VALUE
isEnabled: false
profile:
config: prod-release
analyze:
config: prod-debug
archive:
config: prod-release
customArchiveName: MyTarget
revealArchiveInOrganizer: false
```
### Test Plan
For now test plans are not generated by XcodeGen and must be created in Xcode and checked in, and then referenced by path. If the test targets are added, removed or renamed, the test plans may need to be updated in Xcode.
- [x] **path**: **String** - path that provides the `xctestplan` location.
- [ ] **defaultPlan**: **Bool** - a bool that defines if given plan is the default one. Defaults to false. If no default is set on any test plan, the first plan is set as the default.
```yaml
schemes:
TestTarget:
test:
testPlans:
- path: app.xctestplan
defaultPlan: true
```
## Scheme Template
This is a template that can be referenced from a normal scheme using the `templates` property. The properties of this template are the same as a [Scheme](#scheme). This functions identically in practice to [Target Template](#target-template).
Any instances of `${scheme_name}` within each template will be replaced by the final scheme name which references the template.
Any attributes defined within a scheme's `templateAttributes` will be used to replace any attribute references in the template using the syntax `${attribute_name}`.
```yaml
schemes:
MyModule:
templates:
- FeatureModuleScheme
templateAttributes:
testTargetName: MyModuleTests
schemeTemplates:
FeatureModuleScheme:
templates:
- TestScheme
build:
targets:
${scheme_name}: build
TestScheme:
test:
gatherCoverageData: true
targets:
- name: ${testTargetName}
parallelizable: true
randomExecutionOrder: true
```
The result will be a scheme that builds `MyModule` when you request a build, and will test against `MyModuleTests` when you request to run tests. This is particularly useful when you work in a very modular application and each module has a similar structure.
## Swift Package
Swift packages are defined at a project level, and then linked to individual targets via a [Dependency](#dependency).
### Remote Package
- [x] **url**: **URL** - the url to the package
- [x] **version**: **String** - the version of the package to use. It can take a few forms:
- `majorVersion: 1.2.0` or `from: 1.2.0`
- `minorVersion: 1.2.1`
- `exactVersion: 1.2.1` or `version: 1.2.1`
- `minVersion: 1.0.0, maxVersion: 1.2.9`
- `branch: master`
- `revision: xxxxxx`
- [ ] **github** : **String**- this is an optional helper you can use for github repos. Instead of specifying the full url in `url` you can just specify the github org and repo
### Local Package
- [x] **path**: **String** - the path to the package in local. The path must be directory with a `Package.swift`.
- [ ] **group** : **String**- Optional path that specifies the location where the package will live in your xcode project. Use `""` to specify the project root.
- [ ] **excludeFromProject** : **String**- Optional flag to exclude the package from the generated project (useful if the package is already added via xcworkspace and the project is not intended for standalone use), defaults to `false`
```yml
packages:
Yams:
url: https://github.com/jpsim/Yams
from: 2.0.0
Ink:
github: JohnSundell/Ink
from: 0.5.0
RxClient:
path: ../RxClient
AppFeature:
path: ../Packages
group: Domains/AppFeature
excludeFromProject: false
```
## Project Reference
Project References are defined at a project level, and then you can use the project name to refer its target via a [Scheme](#scheme)
- [x] **path**: **String** - The path to the `xcodeproj` file to reference.
```yml
projectReferences:
YamsProject:
path: ./Carthage/Checkouts/Yams/Yams.xcodeproj
schemes:
TestTarget:
build:
targets:
YamsProject/Yams: ["run"]
```
================================================
FILE: Docs/Usage.md
================================================
- [Configuring build settings](#configuring-build-settings)
- [Setting Presets](#setting-presets)
- [Settings](#settings)
- [Setting Groups](#setting-groups)
- [xcconfig files](#xcconfig-files)
- [Dependencies](#dependencies)
- [CocoaPods](#cocoapods)
- [Carthage](#carthage)
- [Swift Package](#swift-package)
- [SDK](#sdk)
- [Framework](#framework)
# Configuring build settings
There are various ways of configuring build settings
Xcode resolves a certain build setting for a configuration and target by looking up the different levels until it finds a value. This can be seen in Xcode when the `Levels` option is on in the `Build Settings` tab. The different levels of build settings are:
- target
- target xcconfig file
- project
- project xcconfig file
- sdk defaults
XcodeGen will apply settings to a target or project level by merging different methods
- [Setting Presets](#setting-presets)
- [Setting Groups](#setting-groups)
- [Settings](#settings) `base`
- [Settings](#settings) for a specific `config`
The values from [xcconfig files](#xcconfig-files) will then sit a level above this. Note that as a convenience, any settings in an xcconfig file will also overwrite any settings from [Setting Presets](#setting-presets)
>Note that when defining build settings you need to know the write name and value. In Xcode build settings are shown by default with a nicely formatted title and value. To be able to see what the actual build setting names and values are make sure you're in a `Build Settings` tab and go `Editor -> Show Setting Titles` and also `Editor -> Show Definitions`. This will then give you the actual names and values that XcodeGen expects.
### Setting Presets
XcodeGen applies default settings to your project and targets similar to how Xcode creates them when you create a new project or target.
Debug and Release settings will be applied to your project. Targets will also get specific settings depending on the platform and product type.
>You can change or disable how these setting presets are applied via the `options.settingPresets` which you can find more about in [Options](ProjectSpec.md#options)
### Settings
The `project` and each `target` have a `settings` object that you can define. This can be a simple map of build settings or can provide build settings per `config` via `configs` or `base`. See [Settings](ProjectSpec.md#settings) for more details.
```yaml
settings:
DEVELOPMENT_TEAM: T45H45J
targets:
App:
settings:
base:
CODE_SIGN_ENTITLEMENTS: App/Entitlements.entitlements
configs:
Debug:
DEBUG_MODE: YES
Release:
DEBUG_MODE: NO
```
### Setting Groups
Each `settings` can also reference one or more setting groups which let you reuse groups of build settings across targets or configurations. See [Setting Groups](ProjectSpec.md#setting-groups) for more details. Note that each setting group is also a full [Settings](ProjectSpec.md#settings) object, so you can reference other groups or define settings by config.
```yaml
settingGroups:
app:
DEVELOPMENT_TEAM: T45H45J
targets:
App:
settings:
groups: [app]
```
### xcconfig files
The `project` and each `target` have a `configFiles` object that lets you reference `.xcconfig` files per configuration.
>This is good guide to xcconfig files [https://pewpewthespells.com/blog/xcconfig_guide](https://pewpewthespells.com/blog/xcconfig_guide.html)
```yaml
configFiles:
Debug: debug.xcconfig
Release: release.xcconfig
targets:
App:
configFiles:
Debug: App/debug.xcconfig
Release: App/release.xcconfig
```
### xcodebuild environment variables
You can also always override any build settings on CI when building by passing specific build settings to xcodebuild like so:
```sh
DEVELOPMENT_TEAM=XXXXXXXXX xcodebuild ...
```
# Dependencies
Each target can declare one or more dependencies. See [Dependency](ProjectSpec.md#dependency) in the ProjectSpec for more info about all the properties
### CocoaPods
Use your `Podfile` as normal. The pods themselves don't need to be referenced in the project spec. After you generate your project simply run `pod install` which will integrate with your project and create a workspace.
### Carthage
XcodeGen makes integrating Carthage dependencies super easy!
You simply reference them in each target that requires them and XcodeGen does the rest by automatically linking and embedding the carthage frameworks where necessary.
```yaml
targets:
App:
dependencies:
- target: Framework
- carthage: Kingfisher
Framework:
dependencies:
- carthage: Alamofire
```
Some Carthage dependencies actually vend multiple frameworks. For example `github "ReactiveCocoa/ReactiveCocoa" ~> 8.0` vends 2 frameworks `ReactiveCocoa` and `ReactiveMapKit`.
By default these all have to be listed if you want to link and use them:
```yml
targets:
App:
dependencies:
- carthage: ReactiveCocoa
- carthage: ReactiveMapKit
```
XcodeGen can look these up for you automatically! This can be enabled with a global `options.findCarthageFrameworks` or can be overridden for each Carthage dependency. Note that if this is enabled, the Carthage dependencies need to have already been built before XcodeGen is run. This is because XcodeGen loads `.version` files that Carthage writes in the `Carthage/Build` directory which lists the all the frameworks. The name you use must also be the name of the `.version` file Carthage writes to `Carthage/Build`. Be aware that in some cases this name can differ from the name of the repo in the Cartfile and even the framework name. If the `.version` file is not found or fails parsing, XcodeGen will fallback to the regular Framework lookup in the relevant Carthage directory.
```yml
options:
findCarthageFrameworks: true
targets:
App:
dependencies:
- carthage: ReactiveCocoa # will find ReactiveMapKit as well
- carthage: OtherCarthageDependency
findFrameworks: false # disables the global option
```
XcodeGen automatically creates the build phase that Carthage requires which lists all the files and runs `carthage copy-frameworks`. You can change the invocation of carthage to something different, for example if you are running it with [Mint](https://github.com/yonaskolb/mint). This is then prepended to ` copy frameworks`
```yaml
options:
carthageExecutablePath: mint run Carthage/Carthage
```
By default XcodeGen looks for carthage frameworks in `Carthage/Build`. You can change this with the `carthageBuildPath` option
```yaml
options:
carthageBuildPath: ../../Carthage/Build
```
### Swift Package
Swift Packages can be integrated by defining them at the project level and then referencing them in targets
```yaml
packages:
Yams:
url: https://github.com/jpsim/Yams
from: 2.0.0
SwiftPM:
url: https://github.com/apple/swift-package-manager
branch: swift-5.0-branch
RxClient:
path: ../RxClient
targets:
App:
dependencies:
# by default the package product that is linked to is the same as the package name
- package: Yams
- package: SwiftPM
- package: RxClient
- package: SwiftPM
product: SPMUtility # specify a specific product
```
If you want to check in the `Package.resolved` file so that everyone is on the same versions, you need to check in `ProjectName.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved`
> Note that Swift Packages don't work in projects with configurations other than `Debug` and `Release`. That limitation is tracked here bugs.swift.org/browse/SR-10927
Specified local packages get put into a `Packages` group in the root of the project by default. This can be changed with `options.localPackagesGroup`.
### SDK
System frameworks and libs can be linked by using the `sdk` dependency type. You can either specify frameworks or libs by using a `.framework`, `.tbd` or `dylib` filename, respectively
```yaml
targets:
App:
dependencies:
- sdk: Contacts.framework
- sdk: libc++.tbd
- sdk: libz.dylib
```
### Framework
Individual frameworks can also be linked by specifying a path to them
```yamlå
targets:
App:
dependencies:
- framework: Vendor/MyFramework.framework
```
# Build Tool Plug-ins
XCodeGen supports working with [Swift Package Plug-ins](https://github.com/apple/swift-package-manager/blob/main/Documentation/Plugins.md#using-a-package-plugin).
To use plugins, you need to specify in your target which plugin you want to connect, and don't forget to connect the package to target.
```yaml
packages:
Prefire:
url: https://github.com/BarredEwe/Prefire
from: 1.3.0
targets:
App:
buildToolPlugins:
- plugin: PrefirePlaybookPlugin
package: Prefire
```
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2018 Yonas Kolb
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Makefile
================================================
TOOL_NAME = XcodeGen
export EXECUTABLE_NAME = xcodegen
VERSION = 2.45.3
PREFIX = /usr/local
INSTALL_PATH = $(PREFIX)/bin/$(EXECUTABLE_NAME)
SHARE_PATH = $(PREFIX)/share/$(EXECUTABLE_NAME)
CURRENT_PATH = $(PWD)
REPO = https://github.com/yonaskolb/$(TOOL_NAME)
SWIFT_BUILD_FLAGS = --disable-sandbox -c release --arch arm64 --arch x86_64
BUILD_PATH = $(shell swift build $(SWIFT_BUILD_FLAGS) --show-bin-path)
EXECUTABLE_PATH = $(BUILD_PATH)/$(EXECUTABLE_NAME)
.PHONY: install build uninstall format_code release
install: build
mkdir -p $(PREFIX)/bin
cp -f $(EXECUTABLE_PATH) $(INSTALL_PATH)
mkdir -p $(SHARE_PATH)
cp -R $(CURRENT_PATH)/SettingPresets $(SHARE_PATH)/SettingPresets
build:
swift build $(SWIFT_BUILD_FLAGS)
uninstall:
rm -f $(INSTALL_PATH)
rm -rf $(SHARE_PATH)
format_code:
swiftformat .
release:
sed -i '' 's|\(let version = Version("\)\(.*\)\(")\)|\1$(VERSION)\3|' Sources/XcodeGen/main.swift
sed -i '' 's|\(.package(url: "https://github.com/yonaskolb/XcodeGen.git", from: "\)\(.*\)\(")\)|\1$(VERSION)\3|' README.md
git add .
git commit -m "Update to $(VERSION)"
#git tag $(VERSION)
publish: archive
echo "published $(VERSION)"
archive: build
./scripts/archive.sh "$(EXECUTABLE_PATH)"
swift package plugin --allow-writing-to-package-directory generate-artifact-bundle \
--package-version $(VERSION) \
--executable-name $(EXECUTABLE_NAME) \
--build-config release \
--include-resource-path LICENSE
================================================
FILE: Package.resolved
================================================
{
"pins" : [
{
"identity" : "aexml",
"kind" : "remoteSourceControl",
"location" : "https://github.com/tadija/AEXML.git",
"state" : {
"revision" : "db806756c989760b35108146381535aec231092b",
"version" : "4.7.0"
}
},
{
"identity" : "artifactbundlegen",
"kind" : "remoteSourceControl",
"location" : "https://github.com/freddi-kit/ArtifactBundleGen",
"state" : {
"revision" : "33f4a65acb296dcde04aeb828b6850fcf9dceb6c",
"version" : "0.0.8"
}
},
{
"identity" : "jsonutilities",
"kind" : "remoteSourceControl",
"location" : "https://github.com/yonaskolb/JSONUtilities.git",
"state" : {
"revision" : "128d2ffc22467f69569ef8ff971683e2393191a0",
"version" : "4.2.0"
}
},
{
"identity" : "pathkit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/kylef/PathKit.git",
"state" : {
"revision" : "3bfd2737b700b9a36565a8c94f4ad2b050a5e574",
"version" : "1.0.1"
}
},
{
"identity" : "rainbow",
"kind" : "remoteSourceControl",
"location" : "https://github.com/onevcat/Rainbow.git",
"state" : {
"revision" : "e0dada9cd44e3fa7ec3b867e49a8ddbf543e3df3",
"version" : "4.0.1"
}
},
{
"identity" : "spectre",
"kind" : "remoteSourceControl",
"location" : "https://github.com/kylef/Spectre.git",
"state" : {
"revision" : "26cc5e9ae0947092c7139ef7ba612e34646086c7",
"version" : "0.10.1"
}
},
{
"identity" : "swiftcli",
"kind" : "remoteSourceControl",
"location" : "https://github.com/jakeheis/SwiftCLI.git",
"state" : {
"revision" : "2e949055d9797c1a6bddcda0e58dada16cc8e970",
"version" : "6.0.3"
}
},
{
"identity" : "version",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mxcl/Version",
"state" : {
"revision" : "a94b48f36763c05629fc102837398505032dead9",
"version" : "2.0.0"
}
},
{
"identity" : "xcodeproj",
"kind" : "remoteSourceControl",
"location" : "https://github.com/tuist/XcodeProj.git",
"state" : {
"revision" : "01bb77000bc8c23a09ea2058f4954612f03cb705",
"version" : "9.10.1"
}
},
{
"identity" : "yams",
"kind" : "remoteSourceControl",
"location" : "https://github.com/jpsim/Yams.git",
"state" : {
"revision" : "01835dc202670b5bb90d07f3eae41867e9ed29f6",
"version" : "5.0.1"
}
}
],
"version" : 2
}
================================================
FILE: Package.resources
================================================
SettingPresets
================================================
FILE: Package.swift
================================================
// swift-tools-version:5.9
import PackageDescription
let package = Package(
name: "XcodeGen",
platforms: [.macOS(.v11)],
products: [
.executable(name: "xcodegen", targets: ["XcodeGen"]),
.library(name: "XcodeGenKit", targets: ["XcodeGenKit"]),
.library(name: "ProjectSpec", targets: ["ProjectSpec"]),
],
dependencies: [
.package(url: "https://github.com/kylef/PathKit.git", from: "1.0.1"),
.package(url: "https://github.com/jpsim/Yams.git", from: "5.0.0"),
.package(url: "https://github.com/yonaskolb/JSONUtilities.git", from: "4.2.0"),
.package(url: "https://github.com/kylef/Spectre.git", from: "0.9.2"),
.package(url: "https://github.com/onevcat/Rainbow.git", from: "4.0.0"),
.package(url: "https://github.com/tuist/XcodeProj.git", exact: "9.10.1"),
.package(url: "https://github.com/jakeheis/SwiftCLI.git", from: "6.0.3"),
.package(url: "https://github.com/mxcl/Version", from: "2.0.0"),
.package(url: "https://github.com/freddi-kit/ArtifactBundleGen", exact: "0.0.8")
],
targets: [
.executableTarget(name: "XcodeGen", dependencies: [
"XcodeGenCLI",
.product(name: "Version", package: "Version"),
]),
.target(name: "XcodeGenCLI", dependencies: [
"XcodeGenKit",
"ProjectSpec",
.product(name: "SwiftCLI", package: "SwiftCLI"),
.product(name: "Rainbow", package: "Rainbow"),
.product(name: "PathKit", package: "PathKit"),
.product(name: "Version", package: "Version"),
]),
.target(name: "XcodeGenKit", dependencies: [
"ProjectSpec",
.product(name: "JSONUtilities", package: "JSONUtilities"),
.product(name: "XcodeProj", package: "XcodeProj"),
.product(name: "PathKit", package: "PathKit"),
"XcodeGenCore",
], resources: [
.copy("SettingPresets")
]),
.target(name: "ProjectSpec", dependencies: [
.product(name: "JSONUtilities", package: "JSONUtilities"),
.product(name: "XcodeProj", package: "XcodeProj"),
.product(name: "Yams", package: "yams"),
"XcodeGenCore",
.product(name: "Version", package: "Version"),
]),
.target(name: "XcodeGenCore", dependencies: [
.product(name: "PathKit", package: "PathKit"),
.product(name: "Yams", package: "yams"),
]),
.target(name: "TestSupport", dependencies: [
.product(name: "XcodeProj", package: "XcodeProj"),
.product(name: "Spectre", package: "Spectre"),
.product(name: "PathKit", package: "PathKit"),
]),
.testTarget(name: "XcodeGenKitTests", dependencies: [
"XcodeGenKit",
.product(name: "Spectre", package: "Spectre"),
.product(name: "PathKit", package: "PathKit"),
"TestSupport",
]),
.testTarget(name: "FixtureTests", dependencies: [
"XcodeGenKit",
.product(name: "Spectre", package: "Spectre"),
.product(name: "PathKit", package: "PathKit"),
"TestSupport",
]),
.testTarget(name: "XcodeGenCoreTests", dependencies: [
"XcodeGenCore",
.product(name: "Spectre", package: "Spectre"),
.product(name: "PathKit", package: "PathKit"),
"TestSupport",
]),
.testTarget(name: "ProjectSpecTests", dependencies: [
"ProjectSpec",
.product(name: "Spectre", package: "Spectre"),
.product(name: "PathKit", package: "PathKit"),
"TestSupport",
]),
.testTarget(name: "PerformanceTests", dependencies: [
"XcodeGenKit",
.product(name: "Spectre", package: "Spectre"),
.product(name: "PathKit", package: "PathKit"),
"TestSupport",
]),
]
)
================================================
FILE: README.md
================================================
<p align="center">
<a href="https://github.com/yonaskolb/XcodeGen">
<img src="Assets/Logo_animated.gif" alt="XcodeGen" />
</a>
</p>
<p align="center">
<a href="https://github.com/yonaskolb/XcodeGen/releases">
<img src="https://img.shields.io/github/release/yonaskolb/xcodegen.svg"/>
</a>
<a href="https://swiftpackageindex.com/yonaskolb/XcodeGen">
<img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fyonaskolb%2FXcodeGen%2Fbadge%3Ftype%3Dplatforms" alt="Swift Package Manager Platforms" />
</a>
<a href="https://swiftpackageindex.com/yonaskolb/XcodeGen">
<img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fyonaskolb%2FXcodeGen%2Fbadge%3Ftype%3Dswift-versions" alt="Swift Versions" />
</a>
<a href="https://github.com/yonaskolb/XcodeGen/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/yonaskolb/XcodeGen.svg"/>
</a>
</p>
# XcodeGen
XcodeGen is a command line tool written in Swift that generates your Xcode project using your folder structure and a project spec.
The project spec is a YAML or JSON file that defines your targets, configurations, schemes, custom build settings and many other options. All your source directories are automatically parsed and referenced appropriately while preserving your folder structure. Sensible defaults are used in many places, so you only need to customize what is needed. Very complex projects can also be defined using more advanced features.
- ✅ Generate projects on demand and remove your `.xcodeproj` from git, which means **no more merge conflicts**!
- ✅ Groups and files in Xcode are always **synced** to your directories on disk
- ✅ Easy **configuration** of projects which is human readable and git friendly
- ✅ Easily copy and paste **files and directories** without having to edit anything in Xcode
- ✅ Share build settings across multiple targets with **build setting groups**
- ✅ Automatically generate Schemes for **different environments** like test and production
- ✅ Easily **create new projects** with complicated setups on demand without messing around with Xcode
- ✅ Generate from anywhere including on **CI**
- ✅ Distribute your spec amongst multiple files for easy **sharing** and overriding
- ✅ Easily create **multi-platform** frameworks
- ✅ Integrate **Carthage** frameworks without any work
Given an example project spec:
```yaml
name: MyProject
include:
- base_spec.yml
options:
bundleIdPrefix: com.myapp
packages:
Yams:
url: https://github.com/jpsim/Yams
from: 2.0.0
targets:
MyApp:
type: application
platform: iOS
deploymentTarget: "10.0"
sources: [MyApp]
settings:
configs:
debug:
CUSTOM_BUILD_SETTING: my_debug_value
release:
CUSTOM_BUILD_SETTING: my_release_value
dependencies:
- target: MyFramework
- carthage: Alamofire
- framework: Vendor/MyFramework.framework
- sdk: Contacts.framework
- sdk: libc++.tbd
- package: Yams
MyFramework:
type: framework
platform: iOS
sources: [MyFramework]
```
A project would be created with 2 connected targets, with all the required configurations and build settings. See the [Project Spec](Docs/ProjectSpec.md) documentation for all the options you can specify, and [Usage](Docs/Usage.md) for more general documentation.
## Installing
Make sure the latest stable (non-beta) version of Xcode is installed first.
### [Mint](https://github.com/yonaskolb/mint)
```sh
mint install yonaskolb/xcodegen
```
### Make
```shell
git clone https://github.com/yonaskolb/XcodeGen.git
cd XcodeGen
make install
```
### Homebrew
```shell
brew install xcodegen
```
### Swift Package Manager
**Use as CLI**
```shell
git clone https://github.com/yonaskolb/XcodeGen.git
cd XcodeGen
swift run xcodegen
```
**Use as dependency**
Add the following to your Package.swift file's dependencies:
```swift
.package(url: "https://github.com/yonaskolb/XcodeGen.git", from: "2.45.3"),
```
And then import wherever needed: `import XcodeGenKit`
## Usage
Simply run:
```shell
xcodegen generate
```
This will look for a project spec in the current directory called `project.yml` and generate an Xcode project with the name defined in the spec.
Options:
- **--spec**: An optional path to a `.yml` or `.json` project spec. Defaults to `project.yml`. (It is also possible to link to multiple spec files by comma separating them. Note that all other flags will be the same.)
- **--project**: An optional path to a directory where the project will be generated. By default this is the directory the spec lives in.
- **--quiet**: Suppress informational and success messages.
- **--use-cache**: Used to prevent unnecessarily generating the project. If this is set, then a cache file will be written to when a project is generated. If `xcodegen` is later run but the spec and all the files it contains are the same, the project won't be generated.
- **--cache-path**: A custom path to use for your cache file. This defaults to `~/.xcodegen/cache/{PROJECT_SPEC_PATH_HASH}`
There are other commands as well such as `xcodegen dump` which lets one output the resolved spec in many different formats, or write it to a file. Use `xcodegen help` to see more detailed usage information.
## Editing
```shell
git clone https://github.com/yonaskolb/XcodeGen.git
cd XcodeGen
swift package generate-xcodeproj
```
This uses Swift Package Manager to create an `xcodeproj` file that you can open, edit and run in Xcode, which makes editing any code easier.
If you want to pass any required arguments when running in Xcode, you can edit the scheme to include launch arguments.
## Documentation
- See [Project Spec](Docs/ProjectSpec.md) documentation for all the various properties and options that can be set
- See [Usage](Docs/Usage.md) for more specific usage and use case documentation
- See [FAQ](Docs/FAQ.md) for a list of some frequently asked questions
- See [Examples](Docs/Examples.md) for some real world XcodeGen project specs out in the wild
## Alternatives
If XcodeGen doesn't meet your needs try these great alternatives:
- [Tuist](https://github.com/tuist/tuist)
- [Xcake](https://github.com/igor-makarov/xcake)
- [struct](https://github.com/workshop/struct)
## Attributions
This tool is powered by:
- [XcodeProj](https://github.com/tuist/XcodeProj)
- [JSONUtilities](https://github.com/yonaskolb/JSONUtilities)
- [Spectre](https://github.com/kylef/Spectre)
- [PathKit](https://github.com/kylef/PathKit)
- [Yams](https://github.com/jpsim/Yams)
- [SwiftCLI](https://github.com/jakeheis/SwiftCLI)
Inspiration for this tool came from:
- [struct](https://github.com/workshop/struct)
- [Xcake](https://github.com/igor-makarov/xcake)
- [CocoaPods Xcodeproj](https://github.com/CocoaPods/Xcodeproj)
## Contributions
Pull requests and issues are always welcome. Please open any issues and PRs for bugs, features, or documentation.
[](https://sourcerer.io/fame/yonaskolb/yonaskolb/XcodeGen/links/0)[](https://sourcerer.io/fame/yonaskolb/yonaskolb/XcodeGen/links/1)[](https://sourcerer.io/fame/yonaskolb/yonaskolb/XcodeGen/links/2)[](https://sourcerer.io/fame/yonaskolb/yonaskolb/XcodeGen/links/3)[](https://sourcerer.io/fame/yonaskolb/yonaskolb/XcodeGen/links/4)[](https://sourcerer.io/fame/yonaskolb/yonaskolb/XcodeGen/links/5)[](https://sourcerer.io/fame/yonaskolb/yonaskolb/XcodeGen/links/6)[](https://sourcerer.io/fame/yonaskolb/yonaskolb/XcodeGen/links/7)
## License
XcodeGen is licensed under the MIT license. See [LICENSE](LICENSE) for more info.
================================================
FILE: RELEASE.md
================================================
# The release process for XcodeGen
1. Make sure `CHANGELOG.md` is up to date:
- All merged PRs since the last release have been added with the PR link and author (check `git log <last-tag>..HEAD`)
- The new version number is added at the top after `Master`
1. Update the version at the top of `Makefile`
1. Run `make release`
1. Run `make archive`
1. Push commit and tag to github
1. Create release from tag on GitHub using the version number and relevant changelog contents, attaching `xcodegen.zip` and `xcodegen.artifactbundle.zip`
================================================
FILE: SettingPresets/Configs/debug.yml
================================================
---
# Settings take from the following file and sorted
# /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/Base/Base_ProjectSettings.xctemplate/TemplateInfo.plist
DEBUG_INFORMATION_FORMAT: dwarf
ENABLE_TESTABILITY: YES
GCC_DYNAMIC_NO_PIC: NO
GCC_OPTIMIZATION_LEVEL: '0'
GCC_PREPROCESSOR_DEFINITIONS: ["$(inherited)", "DEBUG=1"]
MTL_ENABLE_DEBUG_INFO: INCLUDE_SOURCE
ONLY_ACTIVE_ARCH: YES
# Swift Settings
SWIFT_ACTIVE_COMPILATION_CONDITIONS: DEBUG
SWIFT_OPTIMIZATION_LEVEL: -Onone
================================================
FILE: SettingPresets/Configs/release.yml
================================================
---
# Settings take from the following file and sorted
# /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/Base/Base_ProjectSettings.xctemplate/TemplateInfo.plist
DEBUG_INFORMATION_FORMAT: dwarf-with-dsym
ENABLE_NS_ASSERTIONS: NO
MTL_ENABLE_DEBUG_INFO: NO
# Swift Settings
SWIFT_COMPILATION_MODE: wholemodule
SWIFT_OPTIMIZATION_LEVEL: -O
================================================
FILE: SettingPresets/Platforms/iOS.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks"]
SDKROOT: iphoneos
TARGETED_DEVICE_FAMILY: '1,2'
================================================
FILE: SettingPresets/Platforms/macOS.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/../Frameworks"]
SDKROOT: macosx
COMBINE_HIDPI_IMAGES: 'YES'
================================================
FILE: SettingPresets/Platforms/tvOS.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks"]
SDKROOT: appletvos
TARGETED_DEVICE_FAMILY: 3
================================================
FILE: SettingPresets/Platforms/visionOS.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks"]
SDKROOT: xros
TARGETED_DEVICE_FAMILY: 7
================================================
FILE: SettingPresets/Platforms/watchOS.yml
================================================
SDKROOT: watchos
SKIP_INSTALL: 'YES'
TARGETED_DEVICE_FAMILY: 4
================================================
FILE: SettingPresets/Product_Platform/app-extension_macOS.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks"]
================================================
FILE: SettingPresets/Product_Platform/application_iOS.yml
================================================
CODE_SIGN_IDENTITY: iPhone Developer
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
================================================
FILE: SettingPresets/Product_Platform/application_macOS.yml
================================================
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
================================================
FILE: SettingPresets/Product_Platform/application_tvOS.yml
================================================
ASSETCATALOG_COMPILER_APPICON_NAME: App Icon & Top Shelf Image
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME: LaunchImage
================================================
FILE: SettingPresets/Product_Platform/application_visionOS.yml
================================================
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
================================================
FILE: SettingPresets/Product_Platform/application_watchOS.yml
================================================
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
================================================
FILE: SettingPresets/Product_Platform/bundle.unit-test_macOS.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/../Frameworks", "@loader_path/../Frameworks"]
================================================
FILE: SettingPresets/Products/app-extension.intents-service.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks", "@executable_path/../../../../Frameworks"]
================================================
FILE: SettingPresets/Products/app-extension.messages.yml
================================================
ASSETCATALOG_COMPILER_APPICON_NAME: iMessage App Icon
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks"]
================================================
FILE: SettingPresets/Products/app-extension.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks"]
================================================
FILE: SettingPresets/Products/bundle.ui-testing.yml
================================================
BUNDLE_LOADER: $(TEST_HOST)
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks"]
================================================
FILE: SettingPresets/Products/bundle.unit-test.yml
================================================
BUNDLE_LOADER: $(TEST_HOST)
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks"]
================================================
FILE: SettingPresets/Products/framework.static.yml
================================================
CURRENT_PROJECT_VERSION: 1
DEFINES_MODULE: 'YES'
CODE_SIGN_IDENTITY: ""
DYLIB_COMPATIBILITY_VERSION: 1
DYLIB_CURRENT_VERSION: 1
VERSIONING_SYSTEM: "apple-generic"
INSTALL_PATH: "$(LOCAL_LIBRARY_DIR)/Frameworks"
DYLIB_INSTALL_NAME_BASE: "@rpath"
SKIP_INSTALL: 'YES'
================================================
FILE: SettingPresets/Products/framework.yml
================================================
CURRENT_PROJECT_VERSION: 1
DEFINES_MODULE: 'YES'
CODE_SIGN_IDENTITY: ""
DYLIB_COMPATIBILITY_VERSION: 1
DYLIB_CURRENT_VERSION: 1
VERSIONING_SYSTEM: "apple-generic"
INSTALL_PATH: "$(LOCAL_LIBRARY_DIR)/Frameworks"
DYLIB_INSTALL_NAME_BASE: "@rpath"
SKIP_INSTALL: 'YES'
================================================
FILE: SettingPresets/Products/library.static.yml
================================================
SKIP_INSTALL: 'YES'
================================================
FILE: SettingPresets/Products/tv-app-extension.yml
================================================
SKIP_INSTALL: 'YES'
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks"]
================================================
FILE: SettingPresets/Products/watchkit2-extension.yml
================================================
LD_RUNPATH_SEARCH_PATHS: ["$(inherited)", "@executable_path/Frameworks", "@executable_path/../../Frameworks"]
ASSETCATALOG_COMPILER_COMPLICATION_NAME: Complication
================================================
FILE: SettingPresets/SupportedDestinations/iOS.yml
================================================
SUPPORTED_PLATFORMS: iphoneos iphonesimulator
TARGETED_DEVICE_FAMILY: '1,2'
SUPPORTS_MACCATALYST: NO
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD: YES
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD: YES
================================================
FILE: SettingPresets/SupportedDestinations/macCatalyst.yml
================================================
SUPPORTS_MACCATALYST: YES
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD: NO
================================================
FILE: SettingPresets/SupportedDestinations/macOS.yml
================================================
SUPPORTED_PLATFORMS: macosx
SUPPORTS_MACCATALYST: NO
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD: NO
================================================
FILE: SettingPresets/SupportedDestinations/tvOS.yml
================================================
SUPPORTED_PLATFORMS: appletvos appletvsimulator
TARGETED_DEVICE_FAMILY: '3'
================================================
FILE: SettingPresets/SupportedDestinations/visionOS.yml
================================================
SUPPORTED_PLATFORMS: xros xrsimulator
TARGETED_DEVICE_FAMILY: '7'
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD: NO
================================================
FILE: SettingPresets/SupportedDestinations/watchOS.yml
================================================
SUPPORTED_PLATFORMS: watchos watchsimulator
TARGETED_DEVICE_FAMILY: '4'
================================================
FILE: SettingPresets/base.yml
================================================
---
# Settings take from the following file and sorted
# /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/Base/Base_ProjectSettings.xctemplate/TemplateInfo.plist
ALWAYS_SEARCH_USER_PATHS: NO
CLANG_ANALYZER_NONNULL: YES
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION: YES_AGGRESSIVE
CLANG_CXX_LANGUAGE_STANDARD: gnu++14
CLANG_CXX_LIBRARY: libc++
CLANG_ENABLE_MODULES: YES
CLANG_ENABLE_OBJC_ARC: YES
CLANG_ENABLE_OBJC_WEAK: YES
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING: YES
CLANG_WARN_BOOL_CONVERSION: YES
CLANG_WARN_COMMA: YES
CLANG_WARN_CONSTANT_CONVERSION: YES
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS: YES
CLANG_WARN_DIRECT_OBJC_ISA_USAGE: YES_ERROR
CLANG_WARN_DOCUMENTATION_COMMENTS: YES
CLANG_WARN_EMPTY_BODY: YES
CLANG_WARN_ENUM_CONVERSION: YES
CLANG_WARN_INFINITE_RECURSION: YES
CLANG_WARN_INT_CONVERSION: YES
CLANG_WARN_NON_LITERAL_NULL_CONVERSION: YES
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF: YES
CLANG_WARN_OBJC_LITERAL_CONVERSION: YES
CLANG_WARN_OBJC_ROOT_CLASS: YES_ERROR
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER: YES
CLANG_WARN_RANGE_LOOP_ANALYSIS: YES
CLANG_WARN_STRICT_PROTOTYPES: YES
CLANG_WARN_SUSPICIOUS_MOVE: YES
CLANG_WARN_UNGUARDED_AVAILABILITY: YES_AGGRESSIVE
CLANG_WARN_UNREACHABLE_CODE: YES
CLANG_WARN__DUPLICATE_METHOD_MATCH: YES
COPY_PHASE_STRIP: NO
ENABLE_STRICT_OBJC_MSGSEND: YES
GCC_C_LANGUAGE_STANDARD: gnu11
GCC_NO_COMMON_BLOCKS: YES
GCC_WARN_64_TO_32_BIT_CONVERSION: YES
GCC_WARN_ABOUT_RETURN_TYPE: YES_ERROR
GCC_WARN_UNDECLARED_SELECTOR: YES
GCC_WARN_UNINITIALIZED_AUTOS: YES_AGGRESSIVE
GCC_WARN_UNUSED_FUNCTION: YES
GCC_WARN_UNUSED_VARIABLE: YES
MTL_FAST_MATH: YES
# Target Settings
PRODUCT_NAME: $(TARGET_NAME)
# Swift Settings
SWIFT_VERSION: '5.0'
================================================
FILE: Sources/ProjectSpec/AggregateTarget.swift
================================================
import Foundation
import JSONUtilities
import XcodeProj
public struct AggregateTarget: ProjectTarget {
public var name: String
public var type: PBXProductType = .none
public var targets: [String]
public var settings: Settings
public var buildScripts: [BuildScript]
public var buildToolPlugins: [BuildToolPlugin]
public var configFiles: [String: String]
public var scheme: TargetScheme?
public var attributes: [String: Any]
public init(
name: String,
targets: [String],
settings: Settings = .empty,
configFiles: [String: String] = [:],
buildScripts: [BuildScript] = [],
buildToolPlugins: [BuildToolPlugin] = [],
scheme: TargetScheme? = nil,
attributes: [String: Any] = [:]
) {
self.name = name
self.targets = targets
self.settings = settings
self.configFiles = configFiles
self.buildScripts = buildScripts
self.buildToolPlugins = buildToolPlugins
self.scheme = scheme
self.attributes = attributes
}
}
extension AggregateTarget: CustomStringConvertible {
public var description: String {
"\(name)\(targets.isEmpty ? "" : ": \(targets.joined(separator: ", "))")"
}
}
extension AggregateTarget: Equatable {
public static func == (lhs: AggregateTarget, rhs: AggregateTarget) -> Bool {
lhs.name == rhs.name &&
lhs.targets == rhs.targets &&
lhs.settings == rhs.settings &&
lhs.configFiles == rhs.configFiles &&
lhs.buildScripts == rhs.buildScripts &&
lhs.buildToolPlugins == rhs.buildToolPlugins &&
lhs.scheme == rhs.scheme &&
NSDictionary(dictionary: lhs.attributes).isEqual(to: rhs.attributes)
}
}
extension AggregateTarget: NamedJSONDictionaryConvertible {
public init(name: String, jsonDictionary: JSONDictionary) throws {
self.name = jsonDictionary.json(atKeyPath: "name") ?? name
targets = jsonDictionary.json(atKeyPath: "targets") ?? []
settings = try BuildSettingsParser(jsonDictionary: jsonDictionary).parse()
configFiles = jsonDictionary.json(atKeyPath: "configFiles") ?? [:]
buildScripts = jsonDictionary.json(atKeyPath: "buildScripts") ?? []
buildToolPlugins = jsonDictionary.json(atKeyPath: "buildToolPlugins") ?? []
scheme = jsonDictionary.json(atKeyPath: "scheme")
attributes = jsonDictionary.json(atKeyPath: "attributes") ?? [:]
}
}
extension AggregateTarget: JSONEncodable {
public func toJSONValue() -> Any {
[
"settings": settings.toJSONValue(),
"targets": targets,
"configFiles": configFiles,
"attributes": attributes,
"buildScripts": buildScripts.map { $0.toJSONValue() },
"buildToolPlugins": buildToolPlugins.map { $0.toJSONValue() },
"scheme": scheme?.toJSONValue(),
] as [String: Any?]
}
}
extension AggregateTarget: PathContainer {
static var pathProperties: [PathProperty] {
[
.dictionary([
.string("configFiles"),
.object("buildScripts", BuildScript.pathProperties),
]),
]
}
}
================================================
FILE: Sources/ProjectSpec/Array+Extension.swift
================================================
extension Array where Element == [String: Any?] {
func removingEmptyArraysDictionariesAndNils() -> [[String: Any]] {
var new: [[String: Any]] = []
forEach { element in
new.append(element.removingEmptyArraysDictionariesAndNils())
}
return new
}
}
================================================
FILE: Sources/ProjectSpec/Breakpoint.swift
================================================
import Foundation
import XcodeProj
import JSONUtilities
public typealias BreakpointActionExtensionID = XCBreakpointList.BreakpointProxy.BreakpointContent.BreakpointActionProxy.ActionExtensionID
public typealias BreakpointExtensionID = XCBreakpointList.BreakpointProxy.BreakpointExtensionID
public struct Breakpoint: Equatable {
public enum BreakpointType: Equatable {
public struct Exception: Equatable {
public enum Scope: String, Equatable {
case all = "0"
case objectiveC = "1"
case cpp = "2"
}
public enum StopOnStyle: String, Equatable {
case `throw` = "0"
case `catch` = "1"
}
public var scope: Scope
public var stopOnStyle: StopOnStyle
public init(scope: Breakpoint.BreakpointType.Exception.Scope = .objectiveC,
stopOnStyle: Breakpoint.BreakpointType.Exception.StopOnStyle = .throw) {
self.scope = scope
self.stopOnStyle = stopOnStyle
}
}
case file(path: String, line: Int, column: Int?)
case exception(Exception)
case swiftError
case openGLError
case symbolic(symbol: String?, module: String?)
case ideConstraintError
case ideTestFailure
case runtimeIssue
}
public enum Action: Equatable {
public struct Log: Equatable {
public enum ConveyanceType: String, Equatable {
case console = "0"
case speak = "1"
}
public var message: String?
public var conveyanceType: ConveyanceType
public init(message: String? = nil, conveyanceType: Breakpoint.Action.Log.ConveyanceType = .console) {
self.message = message
self.conveyanceType = conveyanceType
}
}
public enum Sound: String, Equatable {
case basso = "Basso"
case blow = "Blow"
case bottle = "Bottle"
case frog = "Frog"
case funk = "Funk"
case glass = "Glass"
case hero = "Hero"
case morse = "Morse"
case ping = "Ping"
case pop = "Pop"
case purr = "Purr"
case sosumi = "Sosumi"
case submarine = "Submarine"
case tink = "Tink"
}
case debuggerCommand(String?)
case log(Log)
case shellCommand(path: String?, arguments: String?, waitUntilDone: Bool = false)
case graphicsTrace
case appleScript(String?)
case sound(Sound)
}
public var type: BreakpointType
public var enabled: Bool
public var ignoreCount: Int
public var continueAfterRunningActions: Bool
public var condition: String?
public var actions: [Breakpoint.Action]
public init(type: BreakpointType,
enabled: Bool = true,
ignoreCount: Int = 0,
continueAfterRunningActions: Bool = false,
filePath: String? = nil,
line: Int? = nil,
condition: String? = nil,
actions: [Breakpoint.Action] = []) {
self.type = type
self.enabled = enabled
self.ignoreCount = ignoreCount
self.continueAfterRunningActions = continueAfterRunningActions
self.condition = condition
self.actions = actions
}
}
extension Breakpoint.BreakpointType.Exception.Scope {
public init(string: String) throws {
let string = string.lowercased()
switch string {
case "all":
self = .all
case "objective-c":
self = .objectiveC
case "c++":
self = .cpp
default:
throw SpecParsingError.unknownBreakpointScope(string)
}
}
}
extension Breakpoint.BreakpointType.Exception.StopOnStyle {
public init(string: String) throws {
let string = string.lowercased()
switch string {
case "throw":
self = .throw
case "catch":
self = .catch
default:
throw SpecParsingError.unknownBreakpointStopOnStyle(string)
}
}
}
extension Breakpoint.Action.Log.ConveyanceType {
init(string: String) throws {
let string = string.lowercased()
switch string {
case "console":
self = .console
case "speak":
self = .speak
default:
throw SpecParsingError.unknownBreakpointActionConveyanceType(string)
}
}
}
extension Breakpoint.Action.Sound {
init(name: String) throws {
guard let sound = Self.init(rawValue: name) else {
throw SpecParsingError.unknownBreakpointActionSoundName(name)
}
self = sound
}
}
extension Breakpoint.Action: JSONObjectConvertible {
public init(jsonDictionary: JSONDictionary) throws {
let idString: String = try jsonDictionary.json(atKeyPath: "type")
let id = try BreakpointActionExtensionID(string: idString)
switch id {
case .debuggerCommand:
let command: String? = jsonDictionary.json(atKeyPath: "command")
self = .debuggerCommand(command)
case .log:
let message: String? = jsonDictionary.json(atKeyPath: "message")
let conveyanceType: Log.ConveyanceType
if jsonDictionary["conveyanceType"] != nil {
let conveyanceTypeString: String = try jsonDictionary.json(atKeyPath: "conveyanceType")
conveyanceType = try .init(string: conveyanceTypeString)
} else {
conveyanceType = .console
}
self = .log(.init(message: message, conveyanceType: conveyanceType))
case .shellCommand:
let path: String? = jsonDictionary.json(atKeyPath: "path")
let arguments: String? = jsonDictionary.json(atKeyPath: "arguments")
let waitUntilDone = jsonDictionary.json(atKeyPath: "waitUntilDone") ?? false
self = .shellCommand(path: path, arguments: arguments, waitUntilDone: waitUntilDone)
case .graphicsTrace:
self = .graphicsTrace
case .appleScript:
let script: String? = jsonDictionary.json(atKeyPath: "script")
self = .appleScript(script)
case .sound:
let sound: Sound
if jsonDictionary["sound"] != nil {
let name: String = try jsonDictionary.json(atKeyPath: "sound")
sound = try .init(name: name)
} else {
sound = .basso
}
self = .sound(sound)
case .openGLError:
throw SpecParsingError.unknownBreakpointActionType(idString)
}
}
}
extension Breakpoint: JSONObjectConvertible {
public init(jsonDictionary: JSONDictionary) throws {
let idString: String = try jsonDictionary.json(atKeyPath: "type")
let id = try BreakpointExtensionID(string: idString)
switch id {
case .file:
let path: String = try jsonDictionary.json(atKeyPath: "path")
let line: Int = try jsonDictionary.json(atKeyPath: "line")
let column: Int? = jsonDictionary.json(atKeyPath: "column")
type = .file(path: path, line: line, column: column)
case .exception:
let scope: BreakpointType.Exception.Scope
if jsonDictionary["scope"] != nil {
let scopeString: String = try jsonDictionary.json(atKeyPath: "scope")
scope = try .init(string: scopeString)
} else {
scope = .objectiveC
}
let stopOnStyle: BreakpointType.Exception.StopOnStyle
if jsonDictionary["stopOnStyle"] != nil {
let stopOnStyleString: String = try jsonDictionary.json(atKeyPath: "stopOnStyle")
stopOnStyle = try .init(string: stopOnStyleString)
} else {
stopOnStyle = .throw
}
type = .exception(.init(scope: scope, stopOnStyle: stopOnStyle))
case .swiftError:
type = .swiftError
case .openGLError:
type = .openGLError
case .symbolic:
let symbol: String? = jsonDictionary.json(atKeyPath: "symbol")
let module: String? = jsonDictionary.json(atKeyPath: "module")
type = .symbolic(symbol: symbol, module: module)
case .ideConstraintError:
type = .ideConstraintError
case .ideTestFailure:
type = .ideTestFailure
case .runtimeIssue:
type = .runtimeIssue
}
enabled = jsonDictionary.json(atKeyPath: "enabled") ?? true
ignoreCount = jsonDictionary.json(atKeyPath: "ignoreCount") ?? 0
continueAfterRunningActions = jsonDictionary.json(atKeyPath: "continueAfterRunningActions") ?? false
condition = jsonDictionary.json(atKeyPath: "condition")
if jsonDictionary["actions"] != nil {
actions = try jsonDictionary.json(atKeyPath: "actions", invalidItemBehaviour: .fail)
} else {
actions = []
}
}
}
================================================
FILE: Sources/ProjectSpec/BuildPhaseSpec.swift
================================================
//
// File.swift
//
//
// Created by Yonas Kolb on 1/5/20.
//
import Foundation
import XcodeProj
import JSONUtilities
public enum BuildPhaseSpec: Equatable {
case sources
case headers
case resources
case copyFiles(CopyFilesSettings)
case none
// Not currently exposed as selectable options, but used internally
case frameworks
case runScript
case carbonResources
public struct CopyFilesSettings: Equatable, Hashable {
public static let xpcServices = CopyFilesSettings(
destination: .productsDirectory,
subpath: "$(CONTENTS_FOLDER_PATH)/XPCServices",
phaseOrder: .postCompile
)
public static let plugins = CopyFilesSettings(
destination: .plugins,
subpath: "$(CONTENTS_FOLDER_PATH)/PlugIns",
phaseOrder: .postCompile
)
public enum Destination: String {
case absolutePath
case productsDirectory
case wrapper
case executables
case resources
case javaResources
case frameworks
case sharedFrameworks
case sharedSupport
case plugins
public var destination: PBXCopyFilesBuildPhase.SubFolder? {
switch self {
case .absolutePath: return .absolutePath
case .productsDirectory: return .productsDirectory
case .wrapper: return .wrapper
case .executables: return .executables
case .resources: return .resources
case .javaResources: return .javaResources
case .frameworks: return .frameworks
case .sharedFrameworks: return .sharedFrameworks
case .sharedSupport: return .sharedSupport
case .plugins: return .plugins
}
}
}
public enum PhaseOrder: String {
/// Run before the Compile Sources phase
case preCompile
/// Run after the Compile Sources and post-compile Run Script phases
case postCompile
}
public var destination: Destination
public var subpath: String
public var phaseOrder: PhaseOrder
public init(
destination: Destination,
subpath: String,
phaseOrder: PhaseOrder
) {
self.destination = destination
self.subpath = subpath
self.phaseOrder = phaseOrder
}
}
public var buildPhase: BuildPhase? {
switch self {
case .sources: return .sources
case .headers: return .headers
case .resources: return .resources
case .copyFiles: return .copyFiles
case .frameworks: return .frameworks
case .runScript: return .runScript
case .carbonResources: return .carbonResources
case .none: return nil
}
}
}
extension BuildPhaseSpec {
public init(string: String) throws {
switch string {
case "sources": self = .sources
case "headers": self = .headers
case "resources": self = .resources
case "copyFiles":
throw SpecParsingError.invalidSourceBuildPhase("copyFiles must specify a \"destination\" and optional \"subpath\"")
case "none": self = .none
default:
throw SpecParsingError.invalidSourceBuildPhase(string.quoted)
}
}
}
extension BuildPhaseSpec: JSONObjectConvertible {
public init(jsonDictionary: JSONDictionary) throws {
self = .copyFiles(try jsonDictionary.json(atKeyPath: "copyFiles"))
}
}
extension BuildPhaseSpec: JSONEncodable {
public func toJSONValue() -> Any {
switch self {
case .sources: return "sources"
case .headers: return "headers"
case .resources: return "resources"
case .copyFiles(let files): return ["copyFiles": files.toJSONValue()]
case .none: return "none"
case .frameworks: fatalError("invalid build phase")
case .runScript: fatalError("invalid build phase")
case .carbonResources: fatalError("invalid build phase")
}
}
}
extension BuildPhaseSpec.CopyFilesSettings: JSONObjectConvertible {
public init(jsonDictionary: JSONDictionary) throws {
destination = try jsonDictionary.json(atKeyPath: "destination")
subpath = jsonDictionary.json(atKeyPath: "subpath") ?? ""
phaseOrder = .postCompile
}
}
extension BuildPhaseSpec.CopyFilesSettings: JSONEncodable {
public func toJSONValue() -> Any {
[
"destination": destination.rawValue,
"subpath": subpath,
]
}
}
================================================
FILE: Sources/ProjectSpec/BuildRule.swift
================================================
import Foundation
import JSONUtilities
public struct BuildRule: Equatable {
public static let scriptCompilerSpec = "com.apple.compilers.proxy.script"
public static let filePatternFileType = "pattern.proxy"
public static let runOncePerArchitectureDefault = true
public enum FileType: Equatable {
case type(String)
case pattern(String)
public var fileType: String {
switch self {
case let .type(fileType): return fileType
case .pattern: return BuildRule.filePatternFileType
}
}
public var pattern: String? {
switch self {
case .type: return nil
case let .pattern(pattern): return pattern
}
}
}
public enum Action: Equatable {
case compilerSpec(String)
case script(String)
public var compilerSpec: String {
switch self {
case let .compilerSpec(compilerSpec): return compilerSpec
case .script: return BuildRule.scriptCompilerSpec
}
}
public var script: String? {
switch self {
case .compilerSpec: return nil
case let .script(script): return script
}
}
}
public var fileType: FileType
public var action: Action
public var outputFiles: [String]
public var outputFilesCompilerFlags: [String]
public var name: String?
public var runOncePerArchitecture: Bool
public init(
fileType: FileType,
action: Action,
name: String? = nil,
outputFiles: [String] = [],
outputFilesCompilerFlags: [String] = [],
runOncePerArchitecture: Bool = runOncePerArchitectureDefault
) {
self.fileType = fileType
self.action = action
self.name = name
self.outputFiles = outputFiles
self.outputFilesCompilerFlags = outputFilesCompilerFlags
self.runOncePerArchitecture = runOncePerArchitecture
}
}
extension BuildRule: JSONObjectConvertible {
public init(jsonDictionary: JSONDictionary) throws {
if let fileType: String = jsonDictionary.json(atKeyPath: "fileType") {
self.fileType = .type(fileType)
} else {
fileType = .pattern(try jsonDictionary.json(atKeyPath: "filePattern"))
}
if let compilerSpec: String = jsonDictionary.json(atKeyPath: "compilerSpec") {
action = .compilerSpec(compilerSpec)
} else {
action = .script(try jsonDictionary.json(atKeyPath: "script"))
}
outputFiles = jsonDictionary.json(atKeyPath: "outputFiles") ?? []
outputFilesCompilerFlags = jsonDictionary.json(atKeyPath: "outputFilesCompilerFlags") ?? []
name = jsonDictionary.json(atKeyPath: "name")
runOncePerArchitecture = jsonDictionary.json(atKeyPath: "runOncePerArchitecture") ?? BuildRule.runOncePerArchitectureDefault
}
}
extension BuildRule: JSONEncodable {
public func toJSONValue() -> Any {
var dict: [String: Any?] = [
"outputFiles": outputFiles,
"outputFilesCompilerFlags": outputFilesCompilerFlags,
"name": name,
]
switch fileType {
case .pattern(let string):
dict["filePattern"] = string
case .type(let string):
dict["fileType"] = string
}
switch action {
case .compilerSpec(let string):
dict["compilerSpec"] = string
case .script(let string):
dict["script"] = string
}
if runOncePerArchitecture != BuildRule.runOncePerArchitectureDefault {
dict["runOncePerArchitecture"] = runOncePerArchitecture
}
return dict
}
}
================================================
FILE: Sources/ProjectSpec/BuildScript.swift
================================================
import Foundation
import JSONUtilities
public struct BuildScript: Equatable {
public static let runOnlyWhenInstallingDefault = false
public static let showEnvVarsDefault = true
public static let basedOnDependencyAnalysisDefault = true
public var script: ScriptType
public var name: String?
public var shell: String?
public var inputFiles: [String]
public var outputFiles: [String]
public var inputFileLists: [String]
public var outputFileLists: [String]
public var runOnlyWhenInstalling: Bool
public let showEnvVars: Bool
public let basedOnDependencyAnalysis: Bool
public let discoveredDependencyFile: String?
public enum ScriptType: Equatable {
case path(String)
case script(String)
}
public init(
script: ScriptType,
name: String? = nil,
inputFiles: [String] = [],
outputFiles: [String] = [],
inputFileLists: [String] = [],
outputFileLists: [String] = [],
shell: String? = nil,
runOnlyWhenInstalling: Bool = runOnlyWhenInstallingDefault,
showEnvVars: Bool = showEnvVarsDefault,
basedOnDependencyAnalysis: Bool = basedOnDependencyAnalysisDefault,
discoveredDependencyFile: String? = nil
) {
self.script = script
self.name = name
self.inputFiles = inputFiles
self.outputFiles = outputFiles
self.inputFileLists = inputFileLists
self.outputFileLists = outputFileLists
self.shell = shell
self.runOnlyWhenInstalling = runOnlyWhenInstalling
self.showEnvVars = showEnvVars
self.basedOnDependencyAnalysis = basedOnDependencyAnalysis
self.discoveredDependencyFile = discoveredDependencyFile
}
}
extension BuildScript: JSONObjectConvertible {
public init(jsonDictionary: JSONDictionary) throws {
name = jsonDictionary.json(atKeyPath: "name")
inputFiles = jsonDictionary.json(atKeyPath: "inputFiles") ?? []
outputFiles = jsonDictionary.json(atKeyPath: "outputFiles") ?? []
inputFileLists = jsonDictionary.json(atKeyPath: "inputFileLists") ?? []
outputFileLists = jsonDictionary.json(atKeyPath: "outputFileLists") ?? []
if let string: String = jsonDictionary.json(atKeyPath: "script") {
script = .script(string)
} else {
let path: String = try jsonDictionary.json(atKeyPath: "path")
script = .path(path)
}
shell = jsonDictionary.json(atKeyPath: "shell")
runOnlyWhenInstalling = jsonDictionary.json(atKeyPath: "runOnlyWhenInstalling") ?? BuildScript.runOnlyWhenInstallingDefault
showEnvVars = jsonDictionary.json(atKeyPath: "showEnvVars") ?? BuildScript.showEnvVarsDefault
basedOnDependencyAnalysis = jsonDictionary.json(atKeyPath: "basedOnDependencyAnalysis") ?? BuildScript.basedOnDependencyAnalysisDefault
discoveredDependencyFile = jsonDictionary.json(atKeyPath: "discoveredDependencyFile")
}
}
extension BuildScript: JSONEncodable {
public func toJSONValue() -> Any {
var dict: [String: Any?] = [
"inputFiles": inputFiles,
"inputFileLists": inputFileLists,
"outputFiles": outputFiles,
"outputFileLists": outputFileLists,
"runOnlyWhenInstalling": runOnlyWhenInstalling,
"name": name,
"shell": shell,
]
if showEnvVars != BuildScript.showEnvVarsDefault {
dict["showEnvVars"] = showEnvVars
}
if basedOnDependencyAnalysis != BuildScript.basedOnDependencyAnalysisDefault {
dict["basedOnDependencyAnalysis"] = basedOnDependencyAnalysis
}
switch script {
case .path(let string):
dict["path"] = string
case .script(let string):
dict["script"] = string
}
if let discoveredDependencyFile = discoveredDependencyFile {
dict["discoveredDependencyFile"] = discoveredDependencyFile
}
return dict
}
}
extension BuildScript: PathContainer {
static var pathProperties: [PathProperty] {
[
.string("path"),
]
}
}
================================================
FILE: Sources/ProjectSpec/BuildSettingsContainer.swift
================================================
import Foundation
public protocol BuildSettingsContainer {
var settings: Settings { get }
var configFiles: [String: String] { get }
}
================================================
FILE: Sources/ProjectSpec/BuildSettingsExtractor.swift
================================================
import Foundation
import JSONUtilities
/// A helper for extracting and validating the `Settings` object from a JSON dictionary.
struct BuildSettingsParser {
let jsonDictionary: JSONDictionary
/// Attempts to extract and parse the `Settings` from the dictionary.
///
/// - Returns: A valid `Settings` object
func parse() throws -> Settings {
do {
return try jsonDictionary.json(atKeyPath: "settings")
} catch let specParsingError as SpecParsingError {
// Re-throw `SpecParsingError` to prevent the misuse of settings.configs.
throw specParsingError
} catch {
// Ignore all errors except `SpecParsingError`
return .empty
}
}
/// Attempts to extract and parse setting groups from the dictionary with fallback defaults.
///
/// - Returns: Parsed setting groups or default groups if parsing fails
func parseSettingGroups() throws -> [String: Settings] {
do {
return try jsonDictionary.json(atKeyPath: "settingGroups", invalidItemBehaviour: .fail)
} catch let specParsingError as SpecParsingError {
// Re-throw `SpecParsingError` to prevent the misuse of settingGroups.
throw specParsingError
} catch {
// Ignore all errors except `SpecParsingError`
return jsonDictionary.json(atKeyPath: "settingPresets") ?? [:]
}
}
}
================================================
FILE: Sources/ProjectSpec/BuildToolPlugin.swift
================================================
import Foundation
import JSONUtilities
/// Specifies the use of a plug-in product in a target.
public struct BuildToolPlugin: Equatable {
/// The name of the plug-in target.
public var plugin: String
/// The name of the package that defines the plug-in target.
public var package: String
public init(
plugin: String,
package: String
) {
self.plugin = plugin
self.package = package
}
}
extension BuildToolPlugin: JSONObjectConvertible {
public init(jsonDictionary: JSONDictionary) throws {
if let plugin: String = jsonDictionary.json(atKeyPath: "plugin") {
self.plugin = plugin
} else {
throw SpecParsingError.invalidDependency(jsonDictionary)
}
if let package: String = jsonDictionary.json(atKeyPath: "package") {
self.package = package
} else {
throw SpecParsingError.invalidDependency(jsonDictionary)
gitextract_4pjcqkl7/
├── .gitattributes
├── .github/
│ └── workflows/
│ └── ci.yml
├── .gitignore
├── .swiftformat
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Docs/
│ ├── Examples.md
│ ├── FAQ.md
│ ├── ProjectSpec.md
│ └── Usage.md
├── LICENSE
├── Makefile
├── Package.resolved
├── Package.resources
├── Package.swift
├── README.md
├── RELEASE.md
├── SettingPresets/
│ ├── Configs/
│ │ ├── debug.yml
│ │ └── release.yml
│ ├── Platforms/
│ │ ├── iOS.yml
│ │ ├── macOS.yml
│ │ ├── tvOS.yml
│ │ ├── visionOS.yml
│ │ └── watchOS.yml
│ ├── Product_Platform/
│ │ ├── app-extension_macOS.yml
│ │ ├── application_iOS.yml
│ │ ├── application_macOS.yml
│ │ ├── application_tvOS.yml
│ │ ├── application_visionOS.yml
│ │ ├── application_watchOS.yml
│ │ └── bundle.unit-test_macOS.yml
│ ├── Products/
│ │ ├── app-extension.intents-service.yml
│ │ ├── app-extension.messages.yml
│ │ ├── app-extension.yml
│ │ ├── bundle.ui-testing.yml
│ │ ├── bundle.unit-test.yml
│ │ ├── framework.static.yml
│ │ ├── framework.yml
│ │ ├── library.static.yml
│ │ ├── tv-app-extension.yml
│ │ └── watchkit2-extension.yml
│ ├── SupportedDestinations/
│ │ ├── iOS.yml
│ │ ├── macCatalyst.yml
│ │ ├── macOS.yml
│ │ ├── tvOS.yml
│ │ ├── visionOS.yml
│ │ └── watchOS.yml
│ └── base.yml
├── Sources/
│ ├── ProjectSpec/
│ │ ├── AggregateTarget.swift
│ │ ├── Array+Extension.swift
│ │ ├── Breakpoint.swift
│ │ ├── BuildPhaseSpec.swift
│ │ ├── BuildRule.swift
│ │ ├── BuildScript.swift
│ │ ├── BuildSettingsContainer.swift
│ │ ├── BuildSettingsExtractor.swift
│ │ ├── BuildToolPlugin.swift
│ │ ├── CacheFile.swift
│ │ ├── Config.swift
│ │ ├── Decoding.swift
│ │ ├── Dependency.swift
│ │ ├── DeploymentTarget.swift
│ │ ├── Dictionary+Extension.swift
│ │ ├── Encoding.swift
│ │ ├── FileType.swift
│ │ ├── GroupOrdering.swift
│ │ ├── Linkage.swift
│ │ ├── NSRegularExpressionExtensions.swift
│ │ ├── PathContainer.swift
│ │ ├── Platform.swift
│ │ ├── Plist.swift
│ │ ├── Project.swift
│ │ ├── ProjectReference.swift
│ │ ├── ProjectTarget.swift
│ │ ├── Scheme.swift
│ │ ├── Settings.swift
│ │ ├── SourceType.swift
│ │ ├── SpecFile.swift
│ │ ├── SpecLoader.swift
│ │ ├── SpecOptions.swift
│ │ ├── SpecParsingError.swift
│ │ ├── SpecValidation.swift
│ │ ├── SpecValidationError.swift
│ │ ├── SupportedDestination.swift
│ │ ├── SwiftPackage.swift
│ │ ├── Target.swift
│ │ ├── TargetReference.swift
│ │ ├── TargetScheme.swift
│ │ ├── TargetSource.swift
│ │ ├── Template.swift
│ │ ├── TestPlan.swift
│ │ ├── TestTargeReference.swift
│ │ ├── VersionExtensions.swift
│ │ ├── XCProjExtensions.swift
│ │ └── Yaml.swift
│ ├── TestSupport/
│ │ └── TestHelpers.swift
│ ├── XcodeGen/
│ │ └── main.swift
│ ├── XcodeGenCLI/
│ │ ├── Arguments.swift
│ │ ├── Commands/
│ │ │ ├── CacheCommand.swift
│ │ │ ├── DumpCommand.swift
│ │ │ ├── GenerateCommand.swift
│ │ │ └── ProjectCommand.swift
│ │ ├── GenerationError.swift
│ │ └── XcodeGenCLI.swift
│ ├── XcodeGenCore/
│ │ ├── ArrayExtensions.swift
│ │ ├── Atomic.swift
│ │ ├── Glob.swift
│ │ ├── MD5.swift
│ │ ├── PathExtensions.swift
│ │ └── StringDiff.swift
│ └── XcodeGenKit/
│ ├── BreakpointGenerator.swift
│ ├── CarthageDependencyResolver.swift
│ ├── CarthageVersionLoader.swift
│ ├── FileWriter.swift
│ ├── InfoPlistGenerator.swift
│ ├── PBXProjGenerator.swift
│ ├── ProjectFormat.swift
│ ├── ProjectGenerator.swift
│ ├── SchemeGenerator.swift
│ ├── SettingsBuilder.swift
│ ├── SettingsPresetFile.swift
│ ├── SourceGenerator.swift
│ ├── StringCatalogDecoding.swift
│ ├── Version.swift
│ └── XCProjExtensions.swift
├── Tests/
│ ├── FixtureTests/
│ │ └── FixtureTests.swift
│ ├── Fixtures/
│ │ ├── CarthageProject/
│ │ │ ├── .gitignore
│ │ │ ├── Cartfile
│ │ │ ├── Cartfile.resolved
│ │ │ ├── Carthage/
│ │ │ │ └── Build/
│ │ │ │ ├── .Alamofire.version
│ │ │ │ ├── .CarthageTestFixture.version
│ │ │ │ ├── .ReactiveCocoa.version
│ │ │ │ ├── .ReactiveSwift.version
│ │ │ │ └── .Result.version
│ │ │ ├── Project.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── project.xcworkspace/
│ │ │ │ └── contents.xcworkspacedata
│ │ │ └── project.yml
│ │ ├── SPM/
│ │ │ ├── FooFeature/
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ ├── FooDomain/
│ │ │ │ │ └── FooDomain.swift
│ │ │ │ └── FooUI/
│ │ │ │ └── FooUI.swift
│ │ │ ├── SPM/
│ │ │ │ ├── App.xctestplan
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Info.plist
│ │ │ ├── SPM.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ └── swiftpm/
│ │ │ │ │ └── Package.resolved
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── App.xcscheme
│ │ │ ├── SPMTests/
│ │ │ │ └── SPMTests.swift
│ │ │ ├── StaticLibrary/
│ │ │ │ └── StaticLibrary.swift
│ │ │ └── project.yml
│ │ ├── TestProject/
│ │ │ ├── .gitignore
│ │ │ ├── .lldbinit
│ │ │ ├── AnotherProject/
│ │ │ │ ├── AnotherProject.xcodeproj/
│ │ │ │ │ ├── project.pbxproj
│ │ │ │ │ └── project.xcworkspace/
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ └── project.yml
│ │ │ ├── App_Clip/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Clip.entitlements
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ ├── App_Clip_Tests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectTests.swift
│ │ │ ├── App_Clip_UITests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectUITests.swift
│ │ │ ├── App_iOS/
│ │ │ │ ├── App.entitlements
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── App_iOS.xctestplan
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ ├── Localizable.strings
│ │ │ │ │ ├── Localizable.stringsdict
│ │ │ │ │ ├── LocalizedStoryboard.storyboard
│ │ │ │ │ ├── Main.storyboard
│ │ │ │ │ └── excluded-file
│ │ │ │ ├── Configuration.storekit
│ │ │ │ ├── Documentation.docc/
│ │ │ │ │ └── Documentation.md
│ │ │ │ ├── FolderWithDot2.0/
│ │ │ │ │ └── SwiftFileInDotPath.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Model.xcdatamodeld/
│ │ │ │ │ ├── .xccurrentversion
│ │ │ │ │ ├── Model 2.xcdatamodel/
│ │ │ │ │ │ └── contents
│ │ │ │ │ ├── Model 3.xcdatamodel/
│ │ │ │ │ │ └── contents
│ │ │ │ │ └── Model.xcdatamodel/
│ │ │ │ │ └── contents
│ │ │ │ ├── Model.xcmappingmodel/
│ │ │ │ │ └── xcmapping.xml
│ │ │ │ ├── Resource.abc
│ │ │ │ ├── Resource.abcd/
│ │ │ │ │ └── File.json
│ │ │ │ ├── Settings.bundle/
│ │ │ │ │ ├── Root.plist
│ │ │ │ │ └── en.lproj/
│ │ │ │ │ └── Root.strings
│ │ │ │ ├── TestIcon.icon/
│ │ │ │ │ └── icon.json
│ │ │ │ ├── ViewController.swift
│ │ │ │ ├── en.lproj/
│ │ │ │ │ ├── Localizable.strings
│ │ │ │ │ ├── Localizable.stringsdict
│ │ │ │ │ └── LocalizedStoryboard.strings
│ │ │ │ ├── excluded-file
│ │ │ │ ├── inputList.xcfilelist
│ │ │ │ ├── module.modulemap
│ │ │ │ └── outputList.xcfilelist
│ │ │ ├── App_iOS_Tests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectTests.swift
│ │ │ ├── App_iOS_UITests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectUITests.swift
│ │ │ ├── App_macOS/
│ │ │ │ ├── App-Info.plist
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── Main.storyboard
│ │ │ │ └── ViewController.swift
│ │ │ ├── App_macOS_Tests/
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestProjectTests.swift
│ │ │ ├── App_supportedDestinations/
│ │ │ │ ├── Info.generated.plist
│ │ │ │ ├── Sources/
│ │ │ │ │ ├── MyAppApp.swift
│ │ │ │ │ ├── iOS/
│ │ │ │ │ │ └── ContentView.swift
│ │ │ │ │ └── tvOS/
│ │ │ │ │ └── ContentView.swift
│ │ │ │ ├── Storyboards/
│ │ │ │ │ └── LaunchScreen.storyboard
│ │ │ │ └── TestResources/
│ │ │ │ ├── File_MACCATALYST.swift
│ │ │ │ ├── File_ios.swift
│ │ │ │ ├── File_macOS.swift
│ │ │ │ ├── File_tvOs.swift
│ │ │ │ ├── TVOS/
│ │ │ │ │ └── File_B.swift
│ │ │ │ ├── iOs/
│ │ │ │ │ └── File_A.swift
│ │ │ │ ├── macCatalyst/
│ │ │ │ │ └── File_D.swift
│ │ │ │ └── macos/
│ │ │ │ └── File_C.swift
│ │ │ ├── App_watchOS/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── Interface.storyboard
│ │ │ │ └── Info.plist
│ │ │ ├── App_watchOS Extension/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── Complication.complicationset/
│ │ │ │ │ ├── Circular.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Extra Large.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Modular.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Utilitarian.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── ExtensionDelegate.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── InterfaceController.swift
│ │ │ │ ├── NotificationController.swift
│ │ │ │ └── PushNotificationPayload.apns
│ │ │ ├── Cartfile
│ │ │ ├── Cartfile.resolved
│ │ │ ├── Configs/
│ │ │ │ ├── base.xcconfig
│ │ │ │ └── config.xcconfig
│ │ │ ├── CopyFiles/
│ │ │ │ └── Empty.h
│ │ │ ├── CrossOverlayFramework/
│ │ │ │ ├── CrossOverlayFramework.swiftcrossimport/
│ │ │ │ │ └── Framework.swiftoverlay
│ │ │ │ ├── FrameworkFile.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MyFramework.h
│ │ │ │ └── Project.xcodeproj/
│ │ │ │ └── project.pbxproj
│ │ │ ├── DriverKit Driver/
│ │ │ │ ├── Driver.cpp
│ │ │ │ ├── Driver.entitlements
│ │ │ │ ├── Driver.iig
│ │ │ │ └── Info.plist
│ │ │ ├── EndpointSecurity Extension/
│ │ │ │ ├── EndpointSecurity.entitlements
│ │ │ │ ├── Info.plist
│ │ │ │ └── main.swift
│ │ │ ├── ExtensionKit Extension/
│ │ │ │ ├── EntryPoint.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── Intent.swift
│ │ │ ├── FileGroup/
│ │ │ │ └── UnderFileGroup/
│ │ │ │ └── MoreUnder.swift
│ │ │ ├── Folder/
│ │ │ │ ├── Folder1/
│ │ │ │ │ └── file.file
│ │ │ │ └── Folder2/
│ │ │ │ └── file.file
│ │ │ ├── Framework/
│ │ │ │ ├── FrameworkFile.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MyFramework.h
│ │ │ │ └── Project.xcodeproj/
│ │ │ │ └── project.pbxproj
│ │ │ ├── Group/
│ │ │ │ └── File1.swift
│ │ │ ├── Group2/
│ │ │ │ └── File2.swift
│ │ │ ├── Headers/
│ │ │ │ ├── Folder1/
│ │ │ │ │ └── Header2.h
│ │ │ │ └── Header1.h
│ │ │ ├── Mintfile
│ │ │ ├── NestedFiles/
│ │ │ │ └── Foo/
│ │ │ │ └── Nested.swift
│ │ │ ├── Network Extension/
│ │ │ │ ├── FilterDataProvider.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── NetworkExtension.entitlements
│ │ │ │ └── main.swift
│ │ │ ├── Project.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ │ └── xcshareddata/
│ │ │ │ ├── xcdebugger/
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes/
│ │ │ │ ├── App_Clip.xcscheme
│ │ │ │ ├── App_Scheme.xcscheme
│ │ │ │ ├── App_iOS Production.xcscheme
│ │ │ │ ├── App_iOS Staging.xcscheme
│ │ │ │ ├── App_iOS Test.xcscheme
│ │ │ │ ├── App_macOS.xcscheme
│ │ │ │ ├── App_watchOS.xcscheme
│ │ │ │ ├── DriverKitDriver.xcscheme
│ │ │ │ ├── EndpointSecuritySystemExtension.xcscheme
│ │ │ │ ├── Framework.xcscheme
│ │ │ │ ├── NetworkSystemExtension.xcscheme
│ │ │ │ ├── Tool.xcscheme
│ │ │ │ ├── iMessageApp.xcscheme
│ │ │ │ └── iMessageExtension.xcscheme
│ │ │ ├── Resources/
│ │ │ │ ├── GoogleService-Info.plist
│ │ │ │ └── MyBundle.bundle/
│ │ │ │ └── file.text
│ │ │ ├── SomeFile
│ │ │ ├── StandaloneFiles/
│ │ │ │ ├── Standalone.swift
│ │ │ │ └── StandaloneAssets.xcassets/
│ │ │ │ └── Contents.json
│ │ │ ├── StaticLibrary_ObjC/
│ │ │ │ ├── Module/
│ │ │ │ │ └── module.modulemap
│ │ │ │ ├── StaticLibrary_ObjC.h
│ │ │ │ └── StaticLibrary_ObjC.m
│ │ │ ├── StaticLibrary_Swift/
│ │ │ │ └── StaticLibrary.swift
│ │ │ ├── String Catalogs/
│ │ │ │ └── LocalizableStrings.xcstrings
│ │ │ ├── SyncedFolder/
│ │ │ │ ├── ExcludedFile.swift
│ │ │ │ ├── FeatureATests/
│ │ │ │ │ └── __Snapshots__/
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── FeatureBTests/
│ │ │ │ │ └── __Snapshots__/
│ │ │ │ │ └── .gitkeep
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Resources/
│ │ │ │ │ └── .gitkeep
│ │ │ │ └── SyncedFile.swift
│ │ │ ├── SyncedParent/
│ │ │ │ └── SyncedChild/
│ │ │ │ └── SyncedChildFile.swift
│ │ │ ├── Tool/
│ │ │ │ └── main.swift
│ │ │ ├── Utilities/
│ │ │ │ └── MyPlayground.playground/
│ │ │ │ ├── Contents.swift
│ │ │ │ ├── contents.xcplayground
│ │ │ │ └── playground.xcworkspace/
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ ├── Vendor/
│ │ │ │ └── SomeXPCService.xpc/
│ │ │ │ └── Contents/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MacOS/
│ │ │ │ │ └── XPC Service
│ │ │ │ └── _CodeSignature/
│ │ │ │ └── CodeResources
│ │ │ ├── Workspace.xcworkspace/
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ └── swiftpm/
│ │ │ │ └── Package.resolved
│ │ │ ├── XPC Service/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── XPC_Service.h
│ │ │ │ ├── XPC_Service.m
│ │ │ │ ├── XPC_ServiceProtocol.h
│ │ │ │ └── main.m
│ │ │ ├── build.sh
│ │ │ ├── carthage_dynamic.xcconfig
│ │ │ ├── carthage_static.xcconfig
│ │ │ ├── environments.yml
│ │ │ ├── excluded-file
│ │ │ ├── fixtures.xcconfig
│ │ │ ├── iMessageApp/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Info.plist
│ │ │ ├── iMessageExtension/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── iMessage App Icon.stickersiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ └── MainInterface.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── MessagesViewController.swift
│ │ │ ├── iMessageStickers/
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Info.plist
│ │ │ ├── project.yml
│ │ │ ├── scripts/
│ │ │ │ ├── script.sh
│ │ │ │ └── strip-frameworks.sh
│ │ │ └── xcode12_13_and_14_workaround.xcconfig
│ │ ├── duplicated_include/
│ │ │ ├── different_path/
│ │ │ │ └── duplicated_import_root.yml
│ │ │ ├── duplicated_import_root.yml
│ │ │ ├── duplicated_import_sut.yml
│ │ │ └── duplicated_import_transitive.yml
│ │ ├── include_test.json
│ │ ├── include_test.yml
│ │ ├── included.yml
│ │ ├── included_additional.yml
│ │ ├── invalid_configs/
│ │ │ ├── invalid_configs_value_non_mapping_aggregate_targets.yml
│ │ │ ├── invalid_configs_value_non_mapping_setting_groups.yml
│ │ │ ├── invalid_configs_value_non_mapping_settings.yml
│ │ │ └── invalid_configs_value_non_mapping_targets.yml
│ │ ├── legacy_paths_test/
│ │ │ ├── legacy_included_paths_test.yml
│ │ │ └── recursive_include.yml
│ │ ├── legacy_paths_test.yml
│ │ ├── paths_test/
│ │ │ ├── included_paths_test.yml
│ │ │ ├── recursive_test/
│ │ │ │ └── recursive_test.yml
│ │ │ ├── relative_file_groups/
│ │ │ │ ├── TestFile.md
│ │ │ │ └── inc.yml
│ │ │ ├── relative_local_package/
│ │ │ │ ├── LocalPackage/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Package.swift
│ │ │ │ │ └── Sources/
│ │ │ │ │ └── LocalPackage/
│ │ │ │ │ └── LocalPackage.swift
│ │ │ │ └── inc.yml
│ │ │ └── same_relative_path_test/
│ │ │ ├── parent1/
│ │ │ │ ├── parent1.yml
│ │ │ │ └── same/
│ │ │ │ ├── same.yml
│ │ │ │ └── target1/
│ │ │ │ └── target1.yml
│ │ │ ├── parent2/
│ │ │ │ ├── parent2.yml
│ │ │ │ └── same/
│ │ │ │ ├── same.yml
│ │ │ │ └── target2/
│ │ │ │ └── target2.yml
│ │ │ └── same_relative_path_test.yml
│ │ ├── paths_test.yml
│ │ ├── scheme_test/
│ │ │ ├── TestProject.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ └── contents.xcworkspacedata
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ ├── ExternalTarget.xcscheme
│ │ │ │ └── Shared_TargetScheme.xcscheme
│ │ │ └── test_project.yml
│ │ ├── settings_test.yml
│ │ ├── test.xcconfig
│ │ ├── variables_test.yml
│ │ └── yaml.yml
│ ├── LinuxMain.swift
│ ├── PerformanceTests/
│ │ ├── PerformanceTests.swift
│ │ └── TestProject.swift
│ ├── ProjectSpecTests/
│ │ ├── Dictionary+Extension_Tests.swift
│ │ ├── InvalidConfigsFormatTests.swift
│ │ ├── ProjectSpecTests.swift
│ │ └── SpecLoadingTests.swift
│ ├── XcodeGenCoreTests/
│ │ ├── ArrayExtensionsTests.swift
│ │ ├── AtomicTests.swift
│ │ ├── GlobTests.swift
│ │ └── PathExtensionsTests.swift
│ └── XcodeGenKitTests/
│ ├── BreakpointGeneratorTests.swift
│ ├── CarthageDependencyResolverTests.swift
│ ├── PBXProjGeneratorTests.swift
│ ├── ProjectGeneratorTests.swift
│ ├── SchemeGeneratorTests.swift
│ └── SourceGeneratorTests.swift
├── _config.yml
└── scripts/
├── archive.sh
├── build-fixtures.sh
├── diff-fixtures.sh
├── gen-fixtures.sh
└── install.sh
SYMBOL INDEX (1 symbols across 1 files) FILE: Tests/Fixtures/TestProject/DriverKit Driver/Driver.cpp function kern_return_t (line 15) | kern_return_t
Condensed preview — 412 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,053K chars).
[
{
"path": ".gitattributes",
"chars": 22,
"preview": "CHANGELOG merge=union\n"
},
{
"path": ".github/workflows/ci.yml",
"chars": 954,
"preview": "name: CI\non:\n push: {}\n pull_request: {}\njobs:\n run:\n runs-on: macos-15\n name: Xcode ${{ matrix.xcode }}\n st"
},
{
"path": ".gitignore",
"chars": 176,
"preview": ".DS_Store\n.swiftpm\n/.build\n/Packages\nxcuserdata\n*.xccheckout\n*.xcuserstate\nXcodeGen.xcodeproj\nxcodegen.zip\nxcodegen.arti"
},
{
"path": ".swiftformat",
"chars": 335,
"preview": "--exclude .build\n--exclude .swiftpm\n--swiftversion 5.1\n--disable redundantSelf\n--disable sortedImports\n--disable blankLi"
},
{
"path": "CHANGELOG.md",
"chars": 53802,
"preview": "# Change Log\n\n## Next Version\n\n## 2.45.3\n\n### Fixed\n- Fix folder source PBXFileReference path regression with createInte"
},
{
"path": "CONTRIBUTING.md",
"chars": 2595,
"preview": "# Contributing to XcodeGen\n\nThere are various ways to contribute to XcodeGen, and all are welcome and appreciated!\n\n- [B"
},
{
"path": "Docs/Examples.md",
"chars": 1278,
"preview": "# Examples\n\nThese are a bunch of real world examples of XcodeGen project specs. Feel free to add your own via PR.\n\n- [to"
},
{
"path": "Docs/FAQ.md",
"chars": 2515,
"preview": "# Frequently asked questions\n- [Can I still check in my project](#can-i-still-check-in-my-project)\n- [Can I use CocoaPod"
},
{
"path": "Docs/ProjectSpec.md",
"chars": 69557,
"preview": "# Project Spec\n\nThe project spec can be written in either YAML or JSON. All the examples below use YAML.\n\n- [x] required"
},
{
"path": "Docs/Usage.md",
"chars": 8836,
"preview": "\n- [Configuring build settings](#configuring-build-settings)\n - [Setting Presets](#setting-presets)\n - [Settings]("
},
{
"path": "LICENSE",
"chars": 1067,
"preview": "MIT License\n\nCopyright (c) 2018 Yonas Kolb\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "Makefile",
"chars": 1443,
"preview": "TOOL_NAME = XcodeGen\nexport EXECUTABLE_NAME = xcodegen\nVERSION = 2.45.3\n\nPREFIX = /usr/local\nINSTALL_PATH = $(PREFIX)/bi"
},
{
"path": "Package.resolved",
"chars": 2663,
"preview": "{\n \"pins\" : [\n {\n \"identity\" : \"aexml\",\n \"kind\" : \"remoteSourceControl\",\n \"location\" : \"https://githu"
},
{
"path": "Package.resources",
"chars": 15,
"preview": "SettingPresets\n"
},
{
"path": "Package.swift",
"chars": 4000,
"preview": "// swift-tools-version:5.9\n\nimport PackageDescription\n\nlet package = Package(\n name: \"XcodeGen\",\n platforms: [.mac"
},
{
"path": "README.md",
"chars": 8172,
"preview": "<p align=\"center\">\n<a href=\"https://github.com/yonaskolb/XcodeGen\">\n<img src=\"Assets/Logo_animated.gif\" alt=\"XcodeGen\" /"
},
{
"path": "RELEASE.md",
"chars": 542,
"preview": "# The release process for XcodeGen\n\n1. Make sure `CHANGELOG.md` is up to date:\n - All merged PRs since the last releas"
},
{
"path": "SettingPresets/Configs/debug.yml",
"chars": 517,
"preview": "---\n# Settings take from the following file and sorted\n# /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templa"
},
{
"path": "SettingPresets/Configs/release.yml",
"chars": 374,
"preview": "---\n# Settings take from the following file and sorted\n# /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templa"
},
{
"path": "SettingPresets/Platforms/iOS.yml",
"chars": 121,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\"]\nSDKROOT: iphoneos\nTARGETED_DEVICE_FAMILY: '1,2'"
},
{
"path": "SettingPresets/Platforms/macOS.yml",
"chars": 120,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/../Frameworks\"]\nSDKROOT: macosx\nCOMBINE_HIDPI_IMAGES: 'YES'\n"
},
{
"path": "SettingPresets/Platforms/tvOS.yml",
"chars": 118,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\"]\nSDKROOT: appletvos\nTARGETED_DEVICE_FAMILY: 3\n"
},
{
"path": "SettingPresets/Platforms/visionOS.yml",
"chars": 113,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\"]\nSDKROOT: xros\nTARGETED_DEVICE_FAMILY: 7\n"
},
{
"path": "SettingPresets/Platforms/watchOS.yml",
"chars": 63,
"preview": "SDKROOT: watchos\nSKIP_INSTALL: 'YES'\nTARGETED_DEVICE_FAMILY: 4\n"
},
{
"path": "SettingPresets/Product_Platform/app-extension_macOS.yml",
"chars": 119,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/../Frameworks\", \"@executable_path/../../../../Frameworks\"]\n"
},
{
"path": "SettingPresets/Product_Platform/application_iOS.yml",
"chars": 81,
"preview": "CODE_SIGN_IDENTITY: iPhone Developer\nASSETCATALOG_COMPILER_APPICON_NAME: AppIcon\n"
},
{
"path": "SettingPresets/Product_Platform/application_macOS.yml",
"chars": 44,
"preview": "ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon\n"
},
{
"path": "SettingPresets/Product_Platform/application_tvOS.yml",
"chars": 115,
"preview": "ASSETCATALOG_COMPILER_APPICON_NAME: App Icon & Top Shelf Image\nASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME: LaunchImage\n"
},
{
"path": "SettingPresets/Product_Platform/application_visionOS.yml",
"chars": 44,
"preview": "ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon\n"
},
{
"path": "SettingPresets/Product_Platform/application_watchOS.yml",
"chars": 44,
"preview": "ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon\n"
},
{
"path": "SettingPresets/Product_Platform/bundle.unit-test_macOS.yml",
"chars": 106,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/../Frameworks\", \"@loader_path/../Frameworks\"]\n"
},
{
"path": "SettingPresets/Products/app-extension.intents-service.yml",
"chars": 153,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\", \"@executable_path/../../Frameworks\", \"@executab"
},
{
"path": "SettingPresets/Products/app-extension.messages.yml",
"chars": 164,
"preview": "ASSETCATALOG_COMPILER_APPICON_NAME: iMessage App Icon\nLD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Framew"
},
{
"path": "SettingPresets/Products/app-extension.yml",
"chars": 110,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\", \"@executable_path/../../Frameworks\"]\n"
},
{
"path": "SettingPresets/Products/bundle.ui-testing.yml",
"chars": 128,
"preview": "BUNDLE_LOADER: $(TEST_HOST)\nLD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\", \"@loader_path/Frame"
},
{
"path": "SettingPresets/Products/bundle.unit-test.yml",
"chars": 128,
"preview": "BUNDLE_LOADER: $(TEST_HOST)\nLD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\", \"@loader_path/Frame"
},
{
"path": "SettingPresets/Products/framework.static.yml",
"chars": 265,
"preview": "CURRENT_PROJECT_VERSION: 1\nDEFINES_MODULE: 'YES'\nCODE_SIGN_IDENTITY: \"\"\nDYLIB_COMPATIBILITY_VERSION: 1\nDYLIB_CURRENT_VER"
},
{
"path": "SettingPresets/Products/framework.yml",
"chars": 265,
"preview": "CURRENT_PROJECT_VERSION: 1\nDEFINES_MODULE: 'YES'\nCODE_SIGN_IDENTITY: \"\"\nDYLIB_COMPATIBILITY_VERSION: 1\nDYLIB_CURRENT_VER"
},
{
"path": "SettingPresets/Products/library.static.yml",
"chars": 20,
"preview": "SKIP_INSTALL: 'YES'\n"
},
{
"path": "SettingPresets/Products/tv-app-extension.yml",
"chars": 130,
"preview": "SKIP_INSTALL: 'YES'\nLD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\", \"@executable_path/../../Fra"
},
{
"path": "SettingPresets/Products/watchkit2-extension.yml",
"chars": 164,
"preview": "LD_RUNPATH_SEARCH_PATHS: [\"$(inherited)\", \"@executable_path/Frameworks\", \"@executable_path/../../Frameworks\"]\nASSETCATAL"
},
{
"path": "SettingPresets/SupportedDestinations/iOS.yml",
"chars": 186,
"preview": "SUPPORTED_PLATFORMS: iphoneos iphonesimulator\nTARGETED_DEVICE_FAMILY: '1,2'\nSUPPORTS_MACCATALYST: NO\nSUPPORTS_MAC_DESIGN"
},
{
"path": "SettingPresets/SupportedDestinations/macCatalyst.yml",
"chars": 68,
"preview": "SUPPORTS_MACCATALYST: YES\nSUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD: NO\n"
},
{
"path": "SettingPresets/SupportedDestinations/macOS.yml",
"chars": 95,
"preview": "SUPPORTED_PLATFORMS: macosx\nSUPPORTS_MACCATALYST: NO\nSUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD: NO\n"
},
{
"path": "SettingPresets/SupportedDestinations/tvOS.yml",
"chars": 76,
"preview": "SUPPORTED_PLATFORMS: appletvos appletvsimulator\nTARGETED_DEVICE_FAMILY: '3'\n"
},
{
"path": "SettingPresets/SupportedDestinations/visionOS.yml",
"chars": 107,
"preview": "SUPPORTED_PLATFORMS: xros xrsimulator\nTARGETED_DEVICE_FAMILY: '7'\nSUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD: NO\n"
},
{
"path": "SettingPresets/SupportedDestinations/watchOS.yml",
"chars": 72,
"preview": "SUPPORTED_PLATFORMS: watchos watchsimulator\nTARGETED_DEVICE_FAMILY: '4'\n"
},
{
"path": "SettingPresets/base.yml",
"chars": 1716,
"preview": "---\n# Settings take from the following file and sorted\n# /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templa"
},
{
"path": "Sources/ProjectSpec/AggregateTarget.swift",
"chars": 3260,
"preview": "import Foundation\nimport JSONUtilities\nimport XcodeProj\n\npublic struct AggregateTarget: ProjectTarget {\n public var n"
},
{
"path": "Sources/ProjectSpec/Array+Extension.swift",
"chars": 298,
"preview": "extension Array where Element == [String: Any?] {\n func removingEmptyArraysDictionariesAndNils() -> [[String: Any]] {"
},
{
"path": "Sources/ProjectSpec/Breakpoint.swift",
"chars": 9285,
"preview": "import Foundation\nimport XcodeProj\nimport JSONUtilities\n\npublic typealias BreakpointActionExtensionID = XCBreakpointList"
},
{
"path": "Sources/ProjectSpec/BuildPhaseSpec.swift",
"chars": 4734,
"preview": "//\n// File.swift\n// \n//\n// Created by Yonas Kolb on 1/5/20.\n//\n\nimport Foundation\nimport XcodeProj\nimport JSONUtiliti"
},
{
"path": "Sources/ProjectSpec/BuildRule.swift",
"chars": 3785,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct BuildRule: Equatable {\n\n public static let scriptCompilerSpec ="
},
{
"path": "Sources/ProjectSpec/BuildScript.swift",
"chars": 4208,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct BuildScript: Equatable {\n public static let runOnlyWhenInstalli"
},
{
"path": "Sources/ProjectSpec/BuildSettingsContainer.swift",
"chars": 144,
"preview": "import Foundation\n\npublic protocol BuildSettingsContainer {\n\n var settings: Settings { get }\n var configFiles: [St"
},
{
"path": "Sources/ProjectSpec/BuildSettingsExtractor.swift",
"chars": 1444,
"preview": "import Foundation\nimport JSONUtilities\n\n/// A helper for extracting and validating the `Settings` object from a JSON dic"
},
{
"path": "Sources/ProjectSpec/BuildToolPlugin.swift",
"chars": 1432,
"preview": "import Foundation\nimport JSONUtilities\n\n/// Specifies the use of a plug-in product in a target.\npublic struct BuildToolP"
},
{
"path": "Sources/ProjectSpec/CacheFile.swift",
"chars": 841,
"preview": "import Foundation\nimport XcodeGenCore\nimport Version\n\npublic class CacheFile {\n\n public let string: String\n\n init?"
},
{
"path": "Sources/ProjectSpec/Config.swift",
"chars": 1216,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct Config: Hashable {\n public var name: String\n public var type"
},
{
"path": "Sources/ProjectSpec/Decoding.swift",
"chars": 3116,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport Yams\n\nextension Dictionary where Key: JSONKey {\n public "
},
{
"path": "Sources/ProjectSpec/Dependency.swift",
"chars": 7411,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct Dependency: Equatable {\n public static let removeHeadersDefault"
},
{
"path": "Sources/ProjectSpec/DeploymentTarget.swift",
"chars": 2844,
"preview": "import Foundation\nimport JSONUtilities\nimport Version\n\npublic struct DeploymentTarget: Equatable {\n\n public var iOS: "
},
{
"path": "Sources/ProjectSpec/Dictionary+Extension.swift",
"chars": 1231,
"preview": "extension Dictionary where Key == String, Value == Any? {\n func removingEmptyArraysDictionariesAndNils() -> [String: "
},
{
"path": "Sources/ProjectSpec/Encoding.swift",
"chars": 169,
"preview": "import Foundation\nimport JSONUtilities\n\npublic protocol JSONEncodable {\n // returns JSONDictionary or JSONArray or JS"
},
{
"path": "Sources/ProjectSpec/FileType.swift",
"chars": 4457,
"preview": "//\n// File.swift\n// \n//\n// Created by Yonas Kolb on 1/5/20.\n//\n\nimport Foundation\nimport JSONUtilities\nimport enum Xc"
},
{
"path": "Sources/ProjectSpec/GroupOrdering.swift",
"chars": 805,
"preview": "import Foundation\nimport JSONUtilities\n\n/// Describes an order of groups.\npublic struct GroupOrdering: Equatable {\n\n "
},
{
"path": "Sources/ProjectSpec/Linkage.swift",
"chars": 1533,
"preview": "import Foundation\nimport XcodeProj\n\npublic enum Linkage {\n case dynamic\n case `static`\n case none\n}\n\nextension "
},
{
"path": "Sources/ProjectSpec/NSRegularExpressionExtensions.swift",
"chars": 260,
"preview": "import Foundation\n\npublic extension NSRegularExpression {\n\n func isMatch(to string: String) -> Bool {\n let ran"
},
{
"path": "Sources/ProjectSpec/PathContainer.swift",
"chars": 2390,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\n\nprotocol PathContainer {\n\n static var pathProperties: [PathPro"
},
{
"path": "Sources/ProjectSpec/Platform.swift",
"chars": 167,
"preview": "import Foundation\n\npublic enum Platform: String, Hashable, CaseIterable {\n case auto\n case iOS\n case tvOS\n c"
},
{
"path": "Sources/ProjectSpec/Plist.swift",
"chars": 1017,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct Plist: Equatable {\n\n public let path: String\n public let pro"
},
{
"path": "Sources/ProjectSpec/Project.swift",
"chars": 13047,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport Yams\n\npublic struct Project: BuildSettingsContainer {\n\n "
},
{
"path": "Sources/ProjectSpec/ProjectReference.swift",
"chars": 808,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct ProjectReference: Hashable {\n public var name: String\n publi"
},
{
"path": "Sources/ProjectSpec/ProjectTarget.swift",
"chars": 645,
"preview": "import Foundation\nimport XcodeProj\n\npublic protocol ProjectTarget: BuildSettingsContainer {\n\n var name: String { get "
},
{
"path": "Sources/ProjectSpec/Scheme.swift",
"chars": 45755,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport XcodeProj\n\npublic typealias BuildType = XCScheme.BuildActio"
},
{
"path": "Sources/ProjectSpec/Settings.swift",
"chars": 5632,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport XcodeProj\n\npublic struct Settings: Equatable, JSONObjectCon"
},
{
"path": "Sources/ProjectSpec/SourceType.swift",
"chars": 188,
"preview": "//\n// File.swift\n// \n//\n// Created by Yonas Kolb on 1/5/20.\n//\n\nimport Foundation\n\npublic enum SourceType: String {\n "
},
{
"path": "Sources/ProjectSpec/SpecFile.swift",
"chars": 10644,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport Yams\n\npublic struct SpecFile {\n /// For the root spec, t"
},
{
"path": "Sources/ProjectSpec/SpecLoader.swift",
"chars": 2207,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport XcodeProj\nimport Yams\nimport Version\n\npublic class SpecLoad"
},
{
"path": "Sources/ProjectSpec/SpecOptions.swift",
"chars": 10678,
"preview": "import Foundation\nimport JSONUtilities\nimport Version\n\npublic struct SpecOptions: Equatable {\n public static let sett"
},
{
"path": "Sources/ProjectSpec/SpecParsingError.swift",
"chars": 2598,
"preview": "import Foundation\n\npublic enum SpecParsingError: Error, CustomStringConvertible {\n case unknownTargetType(String)\n "
},
{
"path": "Sources/ProjectSpec/SpecValidation.swift",
"chars": 15535,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport Version\n\nextension Project {\n\n public func validate() th"
},
{
"path": "Sources/ProjectSpec/SpecValidationError.swift",
"chars": 8567,
"preview": "import Foundation\nimport Version\n\npublic struct SpecValidationError: Error, CustomStringConvertible {\n\n public var er"
},
{
"path": "Sources/ProjectSpec/SupportedDestination.swift",
"chars": 1138,
"preview": "import Foundation\n\npublic enum SupportedDestination: String, CaseIterable {\n case iOS\n case tvOS\n case macOS\n "
},
{
"path": "Sources/ProjectSpec/SwiftPackage.swift",
"chars": 5528,
"preview": "import Foundation\nimport XcodeProj\nimport JSONUtilities\nimport Version\n\npublic enum SwiftPackage: Equatable {\n\n publi"
},
{
"path": "Sources/ProjectSpec/Target.swift",
"chars": 17276,
"preview": "import Foundation\nimport JSONUtilities\nimport XcodeProj\nimport Version\n\npublic struct LegacyTarget: Equatable {\n publ"
},
{
"path": "Sources/ProjectSpec/TargetReference.swift",
"chars": 1357,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct TargetReference: Hashable {\n public var name: String\n public"
},
{
"path": "Sources/ProjectSpec/TargetScheme.swift",
"chars": 8166,
"preview": "import Foundation\nimport JSONUtilities\nimport XcodeProj\n\npublic struct TargetScheme: Equatable {\n public static let g"
},
{
"path": "Sources/ProjectSpec/TargetSource.swift",
"chars": 6011,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\n\npublic struct TargetSource: Equatable {\n public static let opt"
},
{
"path": "Sources/ProjectSpec/Template.swift",
"chars": 3327,
"preview": "import Foundation\nimport JSONUtilities\n\nstruct TemplateStructure {\n let baseKey: String\n let templatesKey: String\n"
},
{
"path": "Sources/ProjectSpec/TestPlan.swift",
"chars": 846,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct TestPlan: Hashable {\n public var path: String\n public var de"
},
{
"path": "Sources/ProjectSpec/TestTargeReference.swift",
"chars": 3474,
"preview": "import Foundation\nimport JSONUtilities\n\npublic struct TestableTargetReference: Hashable {\n public var name: String\n "
},
{
"path": "Sources/ProjectSpec/VersionExtensions.swift",
"chars": 607,
"preview": "//\n// File.swift\n//\n//\n// Created by Yonas Kolb on 7/2/20.\n//\n\nimport Foundation\nimport Version\n\nextension Version: Sw"
},
{
"path": "Sources/ProjectSpec/XCProjExtensions.swift",
"chars": 4165,
"preview": "import Foundation\nimport PathKit\nimport XcodeProj\n\nextension PBXProductType {\n\n init?(string: String) {\n if le"
},
{
"path": "Sources/ProjectSpec/Yaml.swift",
"chars": 730,
"preview": "import Foundation\nimport PathKit\nimport Yams\n\npublic func loadYamlDictionary(path: Path) throws -> [String: Any] {\n l"
},
{
"path": "Sources/TestSupport/TestHelpers.swift",
"chars": 4050,
"preview": "import Foundation\nimport PathKit\nimport Spectre\nimport XcodeProj\nimport XCTest\n\npublic let fixturePath = Path(#file).par"
},
{
"path": "Sources/XcodeGen/main.swift",
"chars": 158,
"preview": "import Foundation\nimport ProjectSpec\nimport XcodeGenCLI\nimport Version\n\nlet version = Version(\"2.45.3\")\nlet cli = XcodeG"
},
{
"path": "Sources/XcodeGenCLI/Arguments.swift",
"chars": 167,
"preview": "import Foundation\nimport PathKit\nimport SwiftCLI\n\nextension Path: SwiftCLI.ConvertibleFromString {\n\n public init?(inp"
},
{
"path": "Sources/XcodeGenCLI/Commands/CacheCommand.swift",
"chars": 1337,
"preview": "import Foundation\nimport PathKit\nimport ProjectSpec\nimport SwiftCLI\nimport XcodeGenKit\nimport XcodeProj\nimport Version\n\n"
},
{
"path": "Sources/XcodeGenCLI/Commands/DumpCommand.swift",
"chars": 2223,
"preview": "import Foundation\nimport SwiftCLI\nimport PathKit\nimport ProjectSpec\nimport Yams\nimport Version\nimport XcodeGenKit\n\nclass"
},
{
"path": "Sources/XcodeGenCLI/Commands/GenerateCommand.swift",
"chars": 4685,
"preview": "import Foundation\nimport PathKit\nimport ProjectSpec\nimport SwiftCLI\nimport XcodeGenKit\nimport XcodeProj\nimport Version\n\n"
},
{
"path": "Sources/XcodeGenCLI/Commands/ProjectCommand.swift",
"chars": 2589,
"preview": "import Foundation\nimport SwiftCLI\nimport ProjectSpec\nimport XcodeGenKit\nimport PathKit\nimport XcodeGenCore\nimport Versio"
},
{
"path": "Sources/XcodeGenCLI/GenerationError.swift",
"chars": 1228,
"preview": "import Foundation\nimport PathKit\nimport ProjectSpec\nimport Rainbow\nimport SwiftCLI\n\nenum GenerationError: Error, CustomS"
},
{
"path": "Sources/XcodeGenCLI/XcodeGenCLI.swift",
"chars": 864,
"preview": "import Foundation\nimport ProjectSpec\nimport SwiftCLI\nimport Version\n\npublic class XcodeGenCLI {\n let cli: CLI\n\n pu"
},
{
"path": "Sources/XcodeGenCore/ArrayExtensions.swift",
"chars": 3070,
"preview": "import Foundation\n\npublic extension Array {\n\n func parallelMap<T>(transform: (Element) -> T) -> [T] {\n var resul"
},
{
"path": "Sources/XcodeGenCore/Atomic.swift",
"chars": 1125,
"preview": "//\n// Atomic.swift\n// \n//\n// Created by Vladislav Lisianskii on 23.02.2022.\n//\n\nimport Foundation\n\n@propertyWrapper\np"
},
{
"path": "Sources/XcodeGenCore/Glob.swift",
"chars": 8932,
"preview": "//\n// Created by Eric Firestone on 3/22/16.\n// Copyright © 2016 Square, Inc. All rights reserved.\n// Released under t"
},
{
"path": "Sources/XcodeGenCore/MD5.swift",
"chars": 9207,
"preview": "// To date, adding CommonCrypto to a Swift framework is problematic. See:\n// http://stackoverflow.com/questions/25248598"
},
{
"path": "Sources/XcodeGenCore/PathExtensions.swift",
"chars": 3741,
"preview": "import Foundation\nimport PathKit\n\nextension Path {\n /// Returns a Path without any inner parent directory references."
},
{
"path": "Sources/XcodeGenCore/StringDiff.swift",
"chars": 3385,
"preview": "import Foundation\n\n// https://gist.github.com/kristopherjohnson/543687c763cd6e524c91\n\n/// Find first differing character"
},
{
"path": "Sources/XcodeGenKit/BreakpointGenerator.swift",
"chars": 4724,
"preview": "import Foundation\nimport ProjectSpec\nimport XcodeProj\n\npublic class BreakpointGenerator {\n\n let project: Project\n\n "
},
{
"path": "Sources/XcodeGenKit/CarthageDependencyResolver.swift",
"chars": 6502,
"preview": "//\n// CarthageDependencyResolver.swift\n// XcodeGenKit\n//\n// Created by Rogerio de Paula Assis on 2/4/19.\n//\n\nimport F"
},
{
"path": "Sources/XcodeGenKit/CarthageVersionLoader.swift",
"chars": 2353,
"preview": "//\n// CarthageVersionLoader.swift\n// XcodeGenKit\n//\n// Created by Yonas Kolb on 24/3/19.\n//\n\nimport Foundation\nimport"
},
{
"path": "Sources/XcodeGenKit/FileWriter.swift",
"chars": 1922,
"preview": "import Foundation\nimport PathKit\nimport ProjectSpec\nimport XcodeProj\n\npublic class FileWriter {\n\n let project: Projec"
},
{
"path": "Sources/XcodeGenKit/InfoPlistGenerator.swift",
"chars": 1806,
"preview": "import Foundation\nimport PathKit\nimport ProjectSpec\n\npublic class InfoPlistGenerator {\n\n /**\n Default info plist "
},
{
"path": "Sources/XcodeGenKit/PBXProjGenerator.swift",
"chars": 75821,
"preview": "import Foundation\nimport PathKit\nimport ProjectSpec\nimport XcodeProj\nimport Yams\nimport Version\n\npublic class PBXProjGen"
},
{
"path": "Sources/XcodeGenKit/ProjectFormat.swift",
"chars": 876,
"preview": "public extension ProjectFormat {\n static let `default`: ProjectFormat = .xcode16_0\n}\n\npublic enum ProjectFormat: Stri"
},
{
"path": "Sources/XcodeGenKit/ProjectGenerator.swift",
"chars": 1898,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport ProjectSpec\nimport XcodeProj\nimport Yams\n\npublic class Proj"
},
{
"path": "Sources/XcodeGenKit/SchemeGenerator.swift",
"chars": 27608,
"preview": "import Foundation\nimport ProjectSpec\nimport XcodeProj\nimport PathKit\n\nprivate func suitableConfig(for type: ConfigType, "
},
{
"path": "Sources/XcodeGenKit/SettingsBuilder.swift",
"chars": 12769,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\nimport ProjectSpec\nimport XcodeProj\nimport Yams\n\nextension Project"
},
{
"path": "Sources/XcodeGenKit/SettingsPresetFile.swift",
"chars": 1322,
"preview": "import Foundation\nimport ProjectSpec\nimport XcodeProj\n\npublic enum SettingsPresetFile {\n case config(ConfigType)\n "
},
{
"path": "Sources/XcodeGenKit/SourceGenerator.swift",
"chars": 39086,
"preview": "import Foundation\nimport PathKit\nimport ProjectSpec\nimport XcodeProj\nimport XcodeGenCore\n\nstruct SourceFile {\n let pa"
},
{
"path": "Sources/XcodeGenKit/StringCatalogDecoding.swift",
"chars": 2131,
"preview": "import Foundation\nimport JSONUtilities\nimport PathKit\n\nstruct StringCatalog {\n \n/**\n* Sample string catalog:\n "
},
{
"path": "Sources/XcodeGenKit/Version.swift",
"chars": 1534,
"preview": "import Foundation\nimport ProjectSpec\n\nextension Project {\n\n public var xcodeVersion: String {\n XCodeVersion.pa"
},
{
"path": "Sources/XcodeGenKit/XCProjExtensions.swift",
"chars": 2716,
"preview": "import Foundation\nimport PathKit\nimport XcodeProj\n\nextension PBXFileElement {\n public var nameOrPath: String {\n "
},
{
"path": "Tests/FixtureTests/FixtureTests.swift",
"chars": 1227,
"preview": "import PathKit\nimport ProjectSpec\nimport Spectre\nimport XcodeGenKit\nimport XcodeProj\nimport XCTest\nimport TestSupport\n\nc"
},
{
"path": "Tests/Fixtures/CarthageProject/.gitignore",
"chars": 100,
"preview": "Carthage/Build/iOS\nCarthage/Build/watchOS\nCarthage/Build/tvOS\nCarthage/Build/Mac\nCarthage/Checkouts\n"
},
{
"path": "Tests/Fixtures/CarthageProject/Cartfile",
"chars": 153,
"preview": "github \"antitypical/Result\"\ngithub \"rpassis/CarthageTestFixture\"\ngithub \"ReactiveCocoa/ReactiveSwift\" ~> 4.0\ngithub \"Rea"
},
{
"path": "Tests/Fixtures/CarthageProject/Cartfile.resolved",
"chars": 169,
"preview": "github \"ReactiveCocoa/ReactiveCocoa\" \"8.0.2\"\ngithub \"ReactiveCocoa/ReactiveSwift\" \"4.0.0\"\ngithub \"antitypical/Result\" \"4"
},
{
"path": "Tests/Fixtures/CarthageProject/Carthage/Build/.Alamofire.version",
"chars": 588,
"preview": "{\n \"Mac\" : [\n {\n \"name\" : \"Alamofire\",\n \"hash\" : \"c8ee4910ecef2738eccd34a7abcae7d6561c0d709fbc301f66039101"
},
{
"path": "Tests/Fixtures/CarthageProject/Carthage/Build/.CarthageTestFixture.version",
"chars": 1682,
"preview": "{\n \"Mac\" : [\n {\n \"name\" : \"CarthageTestFixture\",\n \"hash\" : \"071b5d10a76f763129c32223af9f0e34674f2d6766e1b8"
},
{
"path": "Tests/Fixtures/CarthageProject/Carthage/Build/.ReactiveCocoa.version",
"chars": 1753,
"preview": "{\n \"Mac\" : [\n {\n \"name\" : \"ReactiveMapKit\",\n \"hash\" : \"ca2fed26f8381df41034bab95e4751c59a2e6790fb2a6def8f4"
},
{
"path": "Tests/Fixtures/CarthageProject/Carthage/Build/.ReactiveSwift.version",
"chars": 604,
"preview": "{\n \"Mac\" : [\n {\n \"name\" : \"ReactiveSwift\",\n \"hash\" : \"ed8de3ce3e03c940ba43f99c5de552b9af89c2d850bb8afb6e5f"
},
{
"path": "Tests/Fixtures/CarthageProject/Carthage/Build/.Result.version",
"chars": 576,
"preview": "{\n \"Mac\" : [\n {\n \"name\" : \"Result\",\n \"hash\" : \"a608337c467d3ef16f53035c587dab84152fc14b3b4c8b597c5a973d3bf"
},
{
"path": "Tests/Fixtures/CarthageProject/Project.xcodeproj/project.pbxproj",
"chars": 34459,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 77;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Tests/Fixtures/CarthageProject/Project.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "Tests/Fixtures/CarthageProject/project.yml",
"chars": 311,
"preview": "name: Project\noptions:\n findCarthageFrameworks: true\ntargets:\n Framework:\n type: framework\n platform: [iOS, tvOS"
},
{
"path": "Tests/Fixtures/SPM/FooFeature/Package.swift",
"chars": 470,
"preview": "// swift-tools-version: 5.8\n// The swift-tools-version declares the minimum version of Swift required to build this pack"
},
{
"path": "Tests/Fixtures/SPM/FooFeature/Sources/FooDomain/FooDomain.swift",
"chars": 27,
"preview": "public struct FooDomain {}\n"
},
{
"path": "Tests/Fixtures/SPM/FooFeature/Sources/FooUI/FooUI.swift",
"chars": 23,
"preview": "public struct FooUI {}\n"
},
{
"path": "Tests/Fixtures/SPM/SPM/App.xctestplan",
"chars": 422,
"preview": "{\n \"configurations\" : [\n {\n \"id\" : \"521B6958-2D62-4961-B353-91EF8F252F4B\",\n \"name\" : \"Configuration 1\",\n "
},
{
"path": "Tests/Fixtures/SPM/SPM/AppDelegate.swift",
"chars": 474,
"preview": "//\n// AppDelegate.swift\n// SPM\n//\n// Created by Yonas Kolb on 13/8/19.\n// Copyright © 2019 BeemIt. All rights reserv"
},
{
"path": "Tests/Fixtures/SPM/SPM/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1590,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "Tests/Fixtures/SPM/SPM/Assets.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "Tests/Fixtures/SPM/SPM/Info.plist",
"chars": 2005,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/SPM/SPM.xcodeproj/project.pbxproj",
"chars": 28160,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 77;\n\tobjects = {\n\n/* Begin PBXAggregateTarget sec"
},
{
"path": "Tests/Fixtures/SPM/SPM.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "Tests/Fixtures/SPM/SPM.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/SPM/SPM.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
"chars": 3442,
"preview": "{\n \"pins\" : [\n {\n \"identity\" : \"aexml\",\n \"kind\" : \"remoteSourceControl\",\n \"location\" : \"https://githu"
},
{
"path": "Tests/Fixtures/SPM/SPM.xcodeproj/xcshareddata/xcschemes/App.xcscheme",
"chars": 4310,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1430\"\n version = \"1.7\">\n <BuildAction\n "
},
{
"path": "Tests/Fixtures/SPM/SPMTests/SPMTests.swift",
"chars": 769,
"preview": "import XCTest\n\nclass SPMTests: XCTestCase {\n\n override func setUp() {\n super.setUp()\n // Put setup code"
},
{
"path": "Tests/Fixtures/SPM/StaticLibrary/StaticLibrary.swift",
"chars": 62,
"preview": "import Codability\n\nfunc doThing() {\n _ = AnyCodable.self\n}\n"
},
{
"path": "Tests/Fixtures/SPM/project.yml",
"chars": 1584,
"preview": "name: SPM\npackages:\n Codability:\n url: https://github.com/yonaskolb/Codability\n majorVersion: 0.2.1\n SwiftRoarin"
},
{
"path": "Tests/Fixtures/TestProject/.gitignore",
"chars": 9,
"preview": "Carthage\n"
},
{
"path": "Tests/Fixtures/TestProject/.lldbinit",
"chars": 0,
"preview": ""
},
{
"path": "Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.pbxproj",
"chars": 31562,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 77;\n\tobjects = {\n\n/* Begin PBXFileReference secti"
},
{
"path": "Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "Tests/Fixtures/TestProject/AnotherProject/AnotherProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/AnotherProject/project.yml",
"chars": 628,
"preview": "name: AnotherProject\ninclude: [../environments.yml]\noptions:\n useBaseInternationalization: false\nconfigFiles:\n Test De"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip/AppDelegate.swift",
"chars": 408,
"preview": "import Framework\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n var windo"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1590,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "Tests/Fixtures/TestProject/App_Clip/Base.lproj/LaunchScreen.storyboard",
"chars": 1740,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip/Base.lproj/Main.storyboard",
"chars": 3005,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip/Clip.entitlements",
"chars": 417,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip/Info.plist",
"chars": 1443,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip/ViewController.swift",
"chars": 318,
"preview": "import Contacts\nimport UIKit\n\nclass ViewController: UIViewController {\n\n override func viewDidLoad() {\n super."
},
{
"path": "Tests/Fixtures/TestProject/App_Clip_Tests/Info.plist",
"chars": 680,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip_Tests/TestProjectTests.swift",
"chars": 777,
"preview": "import XCTest\n\nclass TestProjectTests: XCTestCase {\n\n override func setUp() {\n super.setUp()\n // Put se"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip_UITests/Info.plist",
"chars": 680,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_Clip_UITests/TestProjectUITests.swift",
"chars": 779,
"preview": "import XCTest\n\nclass TestProjectUITests: XCTestCase {\n\n override func setUp() {\n super.setUp()\n // Put "
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/App.entitlements",
"chars": 270,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/AppDelegate.swift",
"chars": 529,
"preview": "import Framework\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n var windo"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/App_iOS.xctestplan",
"chars": 991,
"preview": "{\n \"configurations\" : [\n {\n \"id\" : \"AC4AE1EF-F65C-4037-8994-D607D2E5841E\",\n \"name\" : \"Configuration 1\",\n "
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1590,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Base.lproj/LaunchScreen.storyboard",
"chars": 1740,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings",
"chars": 78,
"preview": "/* \n Localizable.strings\n Project\n\n Created by ryohey on 2017/11/03.\n \n*/\n"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict",
"chars": 723,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Base.lproj/LocalizedStoryboard.storyboard",
"chars": 464,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Base.lproj/Main.storyboard",
"chars": 3005,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Base.lproj/excluded-file",
"chars": 0,
"preview": ""
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Configuration.storekit",
"chars": 484,
"preview": "{\n \"products\" : [\n {\n \"displayPrice\" : \"0.00\",\n \"familyShareable\" : false,\n \"internalID\" : \"6D7919A3\""
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Documentation.docc/Documentation.md",
"chars": 40,
"preview": "# ``App_Clip``\n\nTest\n\n## Overview\n\nTest\n"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/FolderWithDot2.0/SwiftFileInDotPath.swift",
"chars": 105,
"preview": "import Foundation\n\nextension String {\n func printHelloWorld() {\n print(\"Hello World!\")\n }\n}\n"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Info.plist",
"chars": 1442,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Model.xcdatamodeld/.xccurrentversion",
"chars": 260,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Model.xcdatamodeld/Model 2.xcdatamodel/contents",
"chars": 504,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<model type=\"com.apple.IDECoreDataModeler.DataModel\" documentVer"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Model.xcdatamodeld/Model 3.xcdatamodel/contents",
"chars": 504,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<model type=\"com.apple.IDECoreDataModeler.DataModel\" documentVer"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Model.xcdatamodeld/Model.xcdatamodel/contents",
"chars": 504,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<model type=\"com.apple.IDECoreDataModeler.DataModel\" documentVer"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Model.xcmappingmodel/xcmapping.xml",
"chars": 14655,
"preview": "<?xml version=\"1.0\"?>\n<!DOCTYPE database SYSTEM \"file:///System/Library/DTDs/CoreData.dtd\">\n\n<database>\n <databaseInf"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Resource.abc",
"chars": 0,
"preview": ""
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Resource.abcd/File.json",
"chars": 0,
"preview": ""
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/Settings.bundle/Root.plist",
"chars": 1456,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/TestIcon.icon/icon.json",
"chars": 514,
"preview": "{\n \"groups\" : [\n {\n \"layers\" : [\n {\n \"image-name\" : \"back.svg\",\n \"name\" : \"back\",\n "
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/ViewController.swift",
"chars": 318,
"preview": "import Contacts\nimport UIKit\n\nclass ViewController: UIViewController {\n\n override func viewDidLoad() {\n super."
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings",
"chars": 78,
"preview": "/* \n Localizable.strings\n Project\n\n Created by ryohey on 2017/11/03.\n \n*/\n"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict",
"chars": 723,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/en.lproj/LocalizedStoryboard.strings",
"chars": 1,
"preview": "\n"
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/excluded-file",
"chars": 0,
"preview": ""
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/inputList.xcfilelist",
"chars": 0,
"preview": ""
},
{
"path": "Tests/Fixtures/TestProject/App_iOS/module.modulemap",
"chars": 0,
"preview": ""
}
]
// ... and 212 more files (download for full content)
About this extraction
This page contains the full source code of the yonaskolb/XcodeGen GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 412 files (1.8 MB), approximately 477.3k tokens, and a symbol index with 1 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.