An API for manipulating Xcode project files.
Adding Source Files to a Project
XCProject* project = [[XCProject alloc] initWithFilePath:@"MyProject.xcodeproj"]; XCGroup* group = [project groupWithPathFromRoot:@"Main"]; XCClassDefinition* classDefinition = [[XCClassDefinition alloc] initWithName:@"MyNewClass"]; [classDefinition setHeader:@"<some-header-text>"]; [classDefinition setSource:@"<some-impl-text>"]; [group addClass:classDefinition]; [project save];
It will be added to project as well.
XCTarget* target = [project targetWithName:@"SomeTarget"]; XCTarget* duplicated = [target duplicateWithTargetName:@"DuplicatedTarget" productName:@"NewProduct"];
Specifying Source File Belongs to Target
XCSourceFile* sourceFile = [project fileWithName:@"MyNewClass.m"]; XCTarget* examples = [project targetWithName:@"Examples"]; [examples addMember:sourceFile]; [project save];
Adding a Xib File
This time, we'll use a convenience method on XCGroup to specify the targets at the same time:
XCXibDefinition* xibDefinition = [[XCXibDefinition alloc] initWithName:@"MyXibFile" content:@"<xibXml>"]; [group addXib:xibDefinition toTargets:[project targets]]; [project save];
Adding a Framework
XCFrameworkDefinition* frameworkDefinition = [[XCFrameworkDefinition alloc] initWithFilePath:@"<framework path>" copyToDestination:NO]; [group addFramework:frameworkDefinition toTargets:[project targets]]; [project save];
Setting copyToDestination to YES, will cause the framework to be first copied to the group's directory within the project, and subsequently linked from there.
Adding an Image Resource
XCSourceFileDefinition* sourceFileDefinition = [[XCSourceFileDefinition alloc] initWithName:@"MyImageFile.png" data:[NSData dataWithContentsOfFile:<your image file name>] type:ImageResourcePNG]; [group addSourceFile:sourceFileDefinition]; [project save];
Adding a Header
XCSourceFileDefinition* header = [[XCSourceFileDefinition alloc] initWithName:@"SomeHeader.h" text:<your header text> type:SourceCodeHeader]; [group addSourceFile:header]; [project save];
Adding a sub-project
subProjectDefinition = [XCSubProjectDefinition withName:@"mySubproject" projPath=@"/Path/To/Subproject" type:XcodeProject]; [group addSubProject:subProjectDefinition toTargets:[project targets]];
Removing a sub-project
[group removeSubProject:subProjectDefinition]; //TODO: project should be able to remove itself from parent.
File write behavior
//Creates the reference in the project and writes the contents to disk. If a file already exists at the //specified location, its contents will be updated. [definition setFileOperationStyle:FileOperationStyleOverwrite];
//Creates the reference in the project. If a file already exists at the specified location, the contents will //not be updated. [definition setFileOperationStyle:FileOperationStyleAcceptExisting];
//Creates the reference in the project, but does not write to disk. The filesystem is expected to be updated //through some other means. [definition setFileOperationStyle:FileOperationStyleReferenceOnly];
You've just read them! The Source/Tests folder contains further usasge examples. A good starting point is to run the test target in Xcode. This will extract a test project to the /tmp directory, where you'll be able to see the outcome for yourself.
Just the Framework
Open the project in XCode and choose Product/Build.
Includes Unit Tests, Integration Tests, Code Coverge and API reports installed to Xcode.
Requirements (one time only)
In addition to Xcode, requires the Appledoc and lcov packages. A nice way to install these is with MacPorts.
git clone https://github.com/tomaz/appledoc.git sudo install-appledoc.sh sudo port install lcov
NB: Xcode 4.3+ requires command-line tools to be installed separately.
Running the build (every other time)
Feature Requests and Contributions
. . . are very welcome.
If you're using the API shoot me an email and tell me what you're doing with it.
- Xcode-editor has been tested on Xcode 4+. It should also work on earlier versions of Xcode.
- The AppCode IDE from JetBrains is now supported too!
- Supports both ARC and MRR modes of memory management.
Who's using it?
- expanz: A RAD framework that enables .NET developers in producing cross-platform and cloud apps.
- Less Painful: The Calabash automated functional testing for mobile applications.
- Level Helper: A RAD framework for developing 2D games on iOS & Android.
- Text Mate: The missing Text Editor for OSX.
With contributions from:
- Alexander Smirnov - Cleaned up, generalized and contributed back the changes from the Calabash fork.
- Connor Duggan - bug fixes and maintenance.
- Zach Drayer - lots of fixes and features to support TextMate.
- Janine Ohmer - support adding and removing sub-projects (http://www.synapticats.com).
- Bogdan Vladu - support adding and removing groups (www.levelhelper.org).
- Chris Ross of Hidden Memory (http://www.hiddenmemory.co.uk/)
- Paul Taykalo
- Vladislav Alekseev
- Felix Schneider - bug fixes.
- Isak Sky - mutable XCSourceFiles.
Apache License, Version 2.0, January 2004, http://www.apache.org/licenses/
- © 2011 - 2012 Jasper Blues and contributors.