XcodeProject

The Ruby API for working with Xcode project files.

Pledgie Badge

Build Status

Installation

gem install xcodeproject

Getting started

A simple example that displays all targets of the project will look like this:

require 'rubygems'
require 'xcodeproject'

proj = XcodeProject::Project.new('path/to/example.xcodeproj')
proj.read.targets.each do |target|
    puts target.name
end

First, you must create an XcodeProject::Project object like this:

proj = XcodeProject::Project.new('path/to/example.xcodeproj')

Or you can find all projects are located in the specified directory:

projs = XcodeProject::Project.find('path/to/dir')

Or by specified directory pattern:

projs = XcodeProject::Project.find('*/**')

After creating the project object, you can read the data from it:

data = proj.read
p data.target('example').config('Release').build_settings

Or rewrite data:

proj.change do |data|
    data.target('example').config('Release').build_settings['GCC_VERSION'] = 'com.apple.compilers.llvmgcc42'
end

Files, groups and directories

Displaying all of top-level groups:

data.main_group.children.each do |child|
    p child.name
end

Displaying files of specified group:

group = data.group('path/from/main_group')
group.files.each do |file|
    p file.name
end

You can get group's (or file's) group path (the path from the main group):

group.group_path

Directories are groups that are explicitly represented in the file system. For them, you can also get a file path:

group.total_path

You can add a group to project by specifying the path from the main group:

data.add_group('path/from/main_group')

Or from the current group:

group.add_group('path/from/current_group')

To add a directory to the project, you must specify the file path:

data.add_dir('group_path/to/parent', '/file_path/to/dir')
group.add_dir('/file_path/to/dir')

Adding files are same:

data.add_file('group_path/to/parent', '/file_path/to/file')
group.add_file('/file_path/to/file')

You can also remove files, groups and directories from the project:

data.remove_file('path/from/main_group')
data.remove_group('path/from/main_group')

group.remove_file('path/from/current_group')
group.remove_group('path/from/current_group')

Targets

Getting the target object is simple:

target = data.target('example')

After adding a file to the project, you can add it to target's build phase:

file = main_group.add_file('/file_path/to/file')
target.add_source(file)

Or remove from target's build phase:

target.remove_source(file)

Building the project

XcodeProject uses Rake and XcodeBuilder for building projects.

You need to create a rakefile, a simple look like this:

require 'rubygems'
require 'xcodeproject'

proj = XcodeProject::Project.new('path/to/example.xcodeproj')
XcodeProject::Tasks::BuildTask.new(proj)

You will now have access to a variety of tasks such as clean and build. A full list of tasks can be viewed by running rake -T:

$ rake -T
rake example:archive            # Creates an archive build of the specified target(s).
rake example:build              # Builds the specified target(s).
rake example:clean              # Cleans the build using the same build settings.
rake example:cleanbuild         # Builds the specified target(s) from a clean slate.

Configuring your tasks:

XcodeProject::Tasks::BuildTask.new(proj) do |t|
    t.target = "libexample"
    t.configuration = "Release"
end

You can find out more about XcodeBuilder here.

License

XcodeProject is provided under the terms of the the MIT license