Class: Gym::PackageCommandGeneratorXcode7

Inherits:
Object
  • Object
show all
Defined in:
gym/lib/gym/generators/package_command_generator_xcode7.rb

Overview

Responsible for building the fully working xcodebuild command

Constant Summary collapse

DEFAULT_EXPORT_METHOD =
"app-store"

Class Method Summary collapse

Class Method Details

.app_thinning_pathObject

The path to the app-thinning plist file



131
132
133
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 131

def app_thinning_path
  Gym.cache[:app_thinning] ||= File.join(temporary_output_path, "app-thinning.plist")
end

.app_thinning_size_report_pathObject

The path to the App Thinning Size Report file



136
137
138
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 136

def app_thinning_size_report_path
  Gym.cache[:app_thinning_size_report] ||= File.join(temporary_output_path, "App Thinning Size Report.txt")
end

.apps_pathObject

The path to the Apps folder



141
142
143
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 141

def apps_path
  Gym.cache[:apps_path] ||= File.join(temporary_output_path, "Apps")
end

.appstore_info_pathObject



150
151
152
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 150

def appstore_info_path
  Gym.cache[:appstore_info_path] ||= File.join(temporary_output_path, "AppStoreInfo.plist")
end

.asset_packs_pathObject

The path to the Apps folder



146
147
148
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 146

def asset_packs_path
  Gym.cache[:asset_packs_path] ||= File.join(temporary_output_path, "OnDemandResources")
end

.binary_pathObject



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 85

def binary_path
  path = Gym.cache[:binary_path]
  return path if path

  path = Dir[File.join(temporary_output_path, "*.pkg")].last
  app_path = Dir[File.join(temporary_output_path, "*.app")].last
  # We need to process generic PKG or APP
  if path
    # Try to find PKG file in the output directory, used when app thinning was not set
    Gym.cache[:binary_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.pkg")
    FileUtils.mv(path, Gym.cache[:binary_path]) unless File.expand_path(path).casecmp(File.expand_path(Gym.cache[:binary_path]).downcase).zero?
  elsif Dir.exist?(apps_path)
    # Try to find "generic" PKG file inside "Apps" folder, used when app thinning was set
    files = Dir[File.join(apps_path, "*.pkg")]
    # Generic PKG file doesn't have suffix so its name is the shortest
    path = files.min_by(&:length)
    Gym.cache[:binary_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.pkg")
    FileUtils.cp(path, Gym.cache[:binary_path]) unless File.expand_path(path).casecmp(File.expand_path(Gym.cache[:binary_path]).downcase).zero?
  elsif app_path
    # Try to find .app file in the output directory. This is used when macOS is set and .app is being generated.
    Gym.cache[:binary_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.app")
    FileUtils.mv(app_path, Gym.cache[:binary_path]) unless File.expand_path(app_path).casecmp(File.expand_path(Gym.cache[:binary_path]).downcase).zero?
  else
    ErrorHandler.handle_empty_pkg unless path
  end

  Gym.cache[:binary_path]
end

.config_pathObject

The path the config file we use to sign our app



120
121
122
123
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 120

def config_path
  Gym.cache[:config_path] ||= "#{Tempfile.new('gym_config').path}.plist"
  return Gym.cache[:config_path]
end

.dsym_pathObject

The path of the dSYM file for this app. Might be nil



115
116
117
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 115

def dsym_path
  Dir[BuildCommandGenerator.archive_path + "/**/*.app.dSYM"].last
end

.generateObject



22
23
24
25
26
27
28
29
30
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 22

def generate
  parts = ["/usr/bin/xcrun #{wrap_xcodebuild.shellescape} -exportArchive"]
  parts += options
  parts += pipe

  File.write(config_path, config_content) # overwrite every time. Could be optimized

  parts
end

.ipa_pathObject



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 61

def ipa_path
  path = Gym.cache[:ipa_path]
  return path if path

  path = Dir[File.join(temporary_output_path, "*.ipa")].last
  # We need to process generic IPA
  if path
    # Try to find IPA file in the output directory, used when app thinning was not set
    Gym.cache[:ipa_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.ipa")
    FileUtils.mv(path, Gym.cache[:ipa_path]) unless File.expand_path(path).casecmp?(File.expand_path(Gym.cache[:ipa_path]).downcase)
  elsif Dir.exist?(apps_path)
    # Try to find "generic" IPA file inside "Apps" folder, used when app thinning was set
    files = Dir[File.join(apps_path, "*.ipa")]
    # Generic IPA file doesn't have suffix so its name is the shortest
    path = files.min_by(&:length)
    Gym.cache[:ipa_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.ipa")
    FileUtils.cp(path, Gym.cache[:ipa_path]) unless File.expand_path(path).casecmp?(File.expand_path(Gym.cache[:ipa_path]).downcase)
  else
    ErrorHandler.handle_empty_ipa unless path
  end

  Gym.cache[:ipa_path]
end

.manifest_pathObject

The path to the manifest plist file



126
127
128
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 126

def manifest_path
  Gym.cache[:manifest_path] ||= File.join(temporary_output_path, "manifest.plist")
end

.optionsObject



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 32

def options
  config = Gym.config

  options = []
  options << "-exportOptionsPlist '#{config_path}'"
  options << "-archivePath #{BuildCommandGenerator.archive_path.shellescape}"
  options << "-exportPath '#{temporary_output_path}'"
  options << "-toolchain '#{config[:toolchain]}'" if config[:toolchain]
  options << config[:export_xcargs] if config[:export_xcargs]
  options << config[:xcargs] if config[:xcargs]

  options
end

.pipeObject



46
47
48
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 46

def pipe
  [""]
end

.temporary_output_pathObject

We export the ipa into this directory, as we can’t specify the ipa file directly



51
52
53
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 51

def temporary_output_path
  Gym.cache[:temporary_output_path] ||= Dir.mktmpdir('gym_output')
end

.wrap_xcodebuildObject

Wrap xcodebuild to work around ipatool dependency to system ruby



56
57
58
59
# File 'gym/lib/gym/generators/package_command_generator_xcode7.rb', line 56

def wrap_xcodebuild
  require 'fileutils'
  @wrapped_xcodebuild_path ||= File.join(Gym::ROOT, "lib/assets/wrap_xcodebuild/xcbuild-safe.sh")
end