class Ognivo::Build

Constants

OPTIONS

Attributes

zip_file[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/ognivo/build.rb, line 10
def initialize(opts = {})
  OPTIONS.each { |v| instance_variable_set("@#{v}", opts[v]) }
  @project = nil if @workspace
end

Public Instance Methods

build() click to toggle source
# File lib/ognivo/build.rb, line 15
def build
  collect_settings
  error_and_abort('Build failed') unless system(xcodebuild_cmd)
  package_app
  say_ok 'App has been successfully built'
end
build_version() click to toggle source
# File lib/ognivo/build.rb, line 22
def build_version
  @build_version ||= XcTools::Agvtool.marketing_version.to_s
end

Private Instance Methods

build_actions() click to toggle source
# File lib/ognivo/build.rb, line 93
def build_actions
  [:clean, :build, :archive]
end
build_flags() click to toggle source
# File lib/ognivo/build.rb, line 83
def build_flags
  flags = []
  flags << %(-workspace "#{@workspace}") if @workspace
  flags << %(-project "#{@project}") if @project
  flags << %(-scheme "#{@scheme}") if @scheme
  flags << %(-configuration "#{@build_configuration}") if @build_configuration

  flags
end
collect_settings() click to toggle source
# File lib/ognivo/build.rb, line 35
def collect_settings
  build_info = XcTools::XcodeBuild.info(workspace: @workspace, project: @project)

  ensure_workspace_project

  @scheme = select_option('scheme', build_info.schemes) unless @scheme

  build_settings = XcTools::XcodeBuild.settings(*build_flags).find_app
  validate_settings(build_settings)

  @build_configuration ||= build_settings['CONFIGURATION']

  @app_path = File.join(build_settings['BUILT_PRODUCTS_DIR'],
                        build_settings['WRAPPER_NAME'])

  @destination_dir ||= Dir.pwd
end
ensure_workspace_project() click to toggle source
# File lib/ognivo/build.rb, line 97
def ensure_workspace_project
  return if @workspace || @project
  @workspace = find_workspace
  @project = find_project unless @workspace

  verify_workspace_project
end
execute_in_tmpdir(*cmds) click to toggle source
# File lib/ognivo/build.rb, line 64
def execute_in_tmpdir(*cmds)
  Dir.mktmpdir('ognivo') do |dir|
    cmd = ["cd #{dir}", *cmds].join(' && ')
    `#{cmd}`
  end
end
find_project() click to toggle source
# File lib/ognivo/build.rb, line 114
def find_project
  find_xcfile('project', '*.xcodeproj')
end
find_workspace() click to toggle source
# File lib/ognivo/build.rb, line 110
def find_workspace
  find_xcfile('workspace', '*.xcworkspace')
end
find_xcfile(name, pattern) click to toggle source
# File lib/ognivo/build.rb, line 118
def find_xcfile(name, pattern)
  files = Dir[pattern]
  select_option("a #{name}", files)
end
package_app() click to toggle source
# File lib/ognivo/build.rb, line 71
def package_app
  app_dir = File.basename(@app_path)
  app_name = File.basename(app_dir, '.app')
  @zip_file = "#{app_name}#{version_suffix}.zip"

  execute_in_tmpdir(
    "cp -R #{@app_path} ./",
    "zip -9 -y -r #{@zip_file} #{app_dir}",
    "mv #{@zip_file} #{@destination_dir}"
  )
end
select_option(name, collection) click to toggle source
# File lib/ognivo/build.rb, line 123
def select_option(name, collection)
  return unless collection && !collection.empty?
  return collection.first if collection.count == 1
  choose "Select #{name}:\n", *collection
end
validate_settings(build_settings) click to toggle source
# File lib/ognivo/build.rb, line 30
def validate_settings(build_settings)
  return if build_settings
  error_and_abort('App settings could not be found.')
end
verify_workspace_project() click to toggle source
# File lib/ognivo/build.rb, line 105
def verify_workspace_project
  return if @workspace || @project
  error_and_abort('No Xcode projects or workspaces found in current directory')
end
version_suffix() click to toggle source
# File lib/ognivo/build.rb, line 59
def version_suffix
  return unless @append_version
  build_version.empty? ? '' : "-#{build_version}"
end
xcodebuild_cmd() click to toggle source
# File lib/ognivo/build.rb, line 53
def xcodebuild_cmd
  cmd = ['xcodebuild', *build_flags, *build_actions]
  cmd << '1> /dev/null' unless @verbose
  cmd.join(' ')
end