class Xcodeproj::XCScheme

This class represents a Scheme document represented by a “.xcscheme” file usually stored in a xcuserdata or xcshareddata (for a shared scheme) folder.

Constants

COMMAND_LINE_ARGS_NODE
COMMAND_LINE_ARG_NODE
VARIABLES_NODE
VARIABLE_NODE

Attributes

doc[R]

@return [REXML::Document] the XML object that will be manipulated to save

the scheme file after.

Public Class Methods

new(file_path = nil) click to toggle source

Create a XCScheme either from scratch or using an existing file

@param [String] file_path

The path of the existing .xcscheme file. If nil will create an empty scheme
# File lib/xcodeproj/scheme.rb, line 35
def initialize(file_path = nil)
  if file_path
    @file_path = file_path
    @doc = File.open(file_path, 'r') do |f|
      REXML::Document.new(f)
    end
    @doc.context[:attribute_quote] = :quote

    @scheme = @doc.elements['Scheme']
  else
    @doc = REXML::Document.new
    @doc.context[:attribute_quote] = :quote
    @doc << REXML::XMLDecl.new(REXML::XMLDecl::DEFAULT_VERSION, 'UTF-8')

    @scheme = @doc.add_element 'Scheme'
    @scheme.attributes['LastUpgradeVersion'] = Constants::LAST_UPGRADE_CHECK
    @scheme.attributes['version'] = Xcodeproj::Constants::XCSCHEME_FORMAT_VERSION

    self.build_action   = BuildAction.new
    self.test_action    = TestAction.new
    self.launch_action  = LaunchAction.new
    self.profile_action = ProfileAction.new
    self.analyze_action = AnalyzeAction.new
    self.archive_action = ArchiveAction.new
  end
end
share_scheme(project_path, scheme_name, user = nil) click to toggle source

Share a User Scheme. Basically this method move the xcscheme file from the xcuserdata folder to xcshareddata folder.

@param [String] project_path

Path of the .xcodeproj folder.

@param [String] scheme_name

The name of scheme that will be shared.

@param [String] user

The user name that have the scheme.
# File lib/xcodeproj/scheme.rb, line 251
def self.share_scheme(project_path, scheme_name, user = nil)
  to_folder = shared_data_dir(project_path)
  to_folder.mkpath
  to = to_folder + "#{scheme_name}.xcscheme"
  from = user_data_dir(project_path, user) + "#{scheme_name}.xcscheme"
  FileUtils.mv(from, to)
end
shared_data_dir(project_path) click to toggle source

@return [Pathname]

# File lib/xcodeproj/scheme.rb, line 261
def self.shared_data_dir(project_path)
  project_path = Pathname.new(project_path)
  project_path + 'xcshareddata/xcschemes'
end
user_data_dir(project_path, user = nil) click to toggle source

@return [Pathname]

# File lib/xcodeproj/scheme.rb, line 268
def self.user_data_dir(project_path, user = nil)
  project_path = Pathname.new(project_path)
  user ||= ENV['USER']
  project_path + "xcuserdata/#{user}.xcuserdatad/xcschemes"
end

Public Instance Methods

add_build_target(build_target, build_for_running = true) click to toggle source

Add a target to the list of targets to build in the build action.

@param [Xcodeproj::Project::Object::AbstractTarget] build_target

A target used by scheme in the build step.

@param [Bool] build_for_running

Whether to build this target in the launch action. Often false for test targets.
# File lib/xcodeproj/scheme.rb, line 197
def add_build_target(build_target, build_for_running = true)
  entry = BuildAction::Entry.new(build_target)

  entry.build_for_testing   = true
  entry.build_for_running   = build_for_running
  entry.build_for_profiling = build_for_running
  entry.build_for_archiving = build_for_running
  entry.build_for_analyzing = build_for_running

  build_action.add_entry(entry)
end
add_test_target(test_target) click to toggle source

Add a target to the list of targets to build in the build action.

@param [Xcodeproj::Project::Object::AbstractTarget] test_target

A target used by scheme in the test step.
# File lib/xcodeproj/scheme.rb, line 214
def add_test_target(test_target)
  testable = TestAction::TestableReference.new(test_target)
  test_action.add_testable(testable)
end
analyze_action() click to toggle source

@return [XCScheme::AnalyzeAction]

The Analyze Action associated with this scheme
# File lib/xcodeproj/scheme.rb, line 158
def analyze_action
  @analyze_action ||= AnalyzeAction.new(@scheme.elements['AnalyzeAction'])
end
analyze_action=(action) click to toggle source

@param [XCScheme::AnalyzeAction] action

The Analyze Action to associate to this scheme
# File lib/xcodeproj/scheme.rb, line 165
def analyze_action=(action)
  @scheme.delete_element('AnalyzeAction')
  @scheme.add_element(action.xml_element)
  @analyze_action = action
end
archive_action() click to toggle source

@return [XCScheme::ArchiveAction]

The Archive Action associated with this scheme
# File lib/xcodeproj/scheme.rb, line 174
def archive_action
  @archive_action ||= ArchiveAction.new(@scheme.elements['ArchiveAction'])
end
archive_action=(action) click to toggle source

@param [XCScheme::ArchiveAction] action

The Archive Action to associate to this scheme
# File lib/xcodeproj/scheme.rb, line 181
def archive_action=(action)
  @scheme.delete_element('ArchiveAction')
  @scheme.add_element(action.xml_element)
  @archive_action = action
end
build_action() click to toggle source

@return [XCScheme::BuildAction]

The Build Action associated with this scheme
# File lib/xcodeproj/scheme.rb, line 94
def build_action
  @build_action ||= BuildAction.new(@scheme.elements['BuildAction'])
end
build_action=(action) click to toggle source

@param [XCScheme::BuildAction] action

The Build Action to associate to this scheme
# File lib/xcodeproj/scheme.rb, line 101
def build_action=(action)
  @scheme.delete_element('BuildAction')
  @scheme.add_element(action.xml_element)
  @build_action = action
end
configure_with_targets(runnable_target, test_target, launch_target: false) click to toggle source

Convenience method to quickly add app and test targets to a new scheme.

It will add the runnable_target to the Build, Launch and Profile actions and the test_target to the Build and Test actions

@param [Xcodeproj::Project::Object::PBXAbstractTarget] runnable_target

The target to use for the 'Run', 'Profile' and 'Analyze' actions

@param [Xcodeproj::Project::Object::PBXAbstractTarget] test_target

The target to use for the 'Test' action

@param [Boolean] launch_target

Determines if the runnable_target is launchable.
# File lib/xcodeproj/scheme.rb, line 76
def configure_with_targets(runnable_target, test_target, launch_target: false)
  if runnable_target
    add_build_target(runnable_target)
    set_launch_target(runnable_target) if launch_target
  end
  if test_target
    add_build_target(test_target, false) if test_target != runnable_target
    add_test_target(test_target)
  end
end
launch_action() click to toggle source

@return [XCScheme::LaunchAction]

The Launch Action associated with this scheme
# File lib/xcodeproj/scheme.rb, line 126
def launch_action
  @launch_action ||= LaunchAction.new(@scheme.elements['LaunchAction'])
end
launch_action=(action) click to toggle source

@param [XCScheme::LaunchAction] action

The Launch Action to associate to this scheme
# File lib/xcodeproj/scheme.rb, line 133
def launch_action=(action)
  @scheme.delete_element('LaunchAction')
  @scheme.add_element(action.xml_element)
  @launch_action = action
end
profile_action() click to toggle source

@return [XCScheme::ProfileAction]

The Profile Action associated with this scheme
# File lib/xcodeproj/scheme.rb, line 142
def profile_action
  @profile_action ||= ProfileAction.new(@scheme.elements['ProfileAction'])
end
profile_action=(action) click to toggle source

@param [XCScheme::ProfileAction] action

The Profile Action to associate to this scheme
# File lib/xcodeproj/scheme.rb, line 149
def profile_action=(action)
  @scheme.delete_element('ProfileAction')
  @scheme.add_element(action.xml_element)
  @profile_action = action
end
save!() click to toggle source

Serializes the current state of the object to the original “.xcscheme” file this XCScheme was created from, overriding the original file.

Requires that the XCScheme object was initialized using a file path.

# File lib/xcodeproj/scheme.rb, line 333
def save!
  raise Informative, 'This XCScheme object was not initialized ' \
    'using a file path. Use save_as instead.' unless @file_path
  File.open(@file_path, 'w') do |f|
    f.write(to_s)
  end
end
save_as(project_path, name, shared = true) click to toggle source

Serializes the current state of the object to a “.xcscheme” file.

@param [String, Pathname] project_path

The path where the ".xcscheme" file should be stored.

@param [String] name

The name of the scheme, to have ".xcscheme" appended.

@param [Boolean] shared

true  => if the scheme must be a shared scheme (default value)
false => if the scheme must be a user scheme

@return [void]

@example Saving a scheme

scheme.save_as('path/to/Project.xcodeproj') #=> true
# File lib/xcodeproj/scheme.rb, line 314
def save_as(project_path, name, shared = true)
  scheme_folder_path = if shared
                         self.class.shared_data_dir(project_path)
                       else
                         self.class.user_data_dir(project_path)
                       end
  scheme_folder_path.mkpath
  scheme_path = scheme_folder_path + "#{name}.xcscheme"
  @file_path = scheme_path
  File.open(scheme_path, 'w') do |f|
    f.write(to_s)
  end
end
set_launch_target(build_target) click to toggle source

Sets a runnable target to be the target of the launch action of the scheme.

@param [Xcodeproj::Project::Object::AbstractTarget] build_target

A target used by scheme in the launch step.
# File lib/xcodeproj/scheme.rb, line 224
def set_launch_target(build_target)
  launch_runnable = BuildableProductRunnable.new(build_target, 0)
  launch_action.buildable_product_runnable = launch_runnable

  profile_runnable = BuildableProductRunnable.new(build_target, 0)
  profile_action.buildable_product_runnable = profile_runnable

  macro_exp = MacroExpansion.new(build_target)
  test_action.add_macro_expansion(macro_exp)
end
test_action() click to toggle source

@return [XCScheme::TestAction]

The Test Action associated with this scheme
# File lib/xcodeproj/scheme.rb, line 110
def test_action
  @test_action ||= TestAction.new(@scheme.elements['TestAction'])
end
test_action=(action) click to toggle source

@param [XCScheme::TestAction] action

The Test Action to associate to this scheme
# File lib/xcodeproj/scheme.rb, line 117
def test_action=(action)
  @scheme.delete_element('TestAction')
  @scheme.add_element(action.xml_element)
  @test_action = action
end
to_s() click to toggle source

Serializes the current state of the object to a String.

@note The goal of the string representation is to match Xcode output as

close as possible to aide comparison.

@return [String] the XML string value of the current state of the object.

# File lib/xcodeproj/scheme.rb, line 287
def to_s
  formatter = XMLFormatter.new(2)
  formatter.compact = false
  out = ''
  formatter.write(@doc, out)
  out.gsub!("<?xml version='1.0' encoding='UTF-8'?>", '<?xml version="1.0" encoding="UTF-8"?>')
  out << "\n"
  out
end