I installed Apple’s developer tools using the default path so my copy of Apple’s Xcode templates is located in “/Developer/Library/Xcode/File Templates” and “/Developer/Library/Xcode/Project Templates”. Installing the iPhone SDK added additional templates in “/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/”. Those were useful examples to base my own templates on but I needed to save my new templates separate from Apple’s default configuration files.
I started by adding a “test” build target to Apple’s default “View-Based Application” template. First I copied “/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application/View-Based Application” to “/Library/Application Support/Developer/Shared/Xcode/Project Templates/Carbon Five/Testable View-Based Application”. Then I opened “Testable View-Based Application/___PROJECTNAME___.xcodeproj” in Xcode and changed the customized the project structure by adding a “Unit Tests” target, the hamcrest and OCMock frameworks, GTM classes, an example test class, and a couple of groups in the overview list.
While setting up the project and testing its configuration Xcode created a bunch of files I did not want as part of my template so when I finished with the project I deleted both the build products directory and the user specific settings files inside the “___PROJECTNAME___.xcodeproj” package. I also editted the template description in “TemplateInfo.plist”.
I restarted Xcode and could start a new project using the template by selecting it from the User Templates section of the New Project dialog.
Creating a file template:
Creating a project from my template was handy but I wanted a faster way to build individual test classes as well so I wrote a file template.
First I copied “/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/File Templates/Cocoa Touch Classes/NSObject subclass.pbfiletemplate” to “/Library/Application Support/Developer/Shared/Xcode/File Templates/Carbon Five/GTM test template.pbfiletemplate”. Then in the class.m file I added hamcrest and OCMock imports and an example test method. This class did not require a separate header file so I deleted class.h.
In TemplateInfo.plist I updated the template’s description and since I removed the header file I removed the CounterpartTemplateFile line.
After restart Xcode again I could create test classes based on the template using the “New File…” menu.
A couple dozen unit tests later I’m happy not to be repeating even this minimal amount of configuration each time I start a new test.
If you’re developing in Xcode I’d like to hear what sort of project setup you use. Are there libraries or frameworks you always include? Class files you have, or wish you had, created templates for? Do you use Apple’s default resource groups or have you established your own conventions for organizing your projects?