Class: Fastlane::Actions::GetVersionNumberAction
- Inherits:
-
Fastlane::Action
- Object
- Fastlane::Action
- Fastlane::Actions::GetVersionNumberAction
- Defined in:
- fastlane/lib/fastlane/actions/get_version_number.rb
Constant Summary
Constants inherited from Fastlane::Action
Fastlane::Action::AVAILABLE_CATEGORIES, Fastlane::Action::RETURN_TYPES
Documentation collapse
- .authors ⇒ Object
- .available_options ⇒ Object
- .category ⇒ Object
- .description ⇒ Object
- .details ⇒ Object
- .example_code ⇒ Object
- .is_supported?(platform) ⇒ Boolean
- .output ⇒ Object
- .return_type ⇒ Object
Class Method Summary collapse
- .get_plist!(folder, target, configuration = nil) ⇒ Object
- .get_project!(xcodeproj_path_or_dir) ⇒ Object
- .get_target!(project, target_name) ⇒ Object
- .get_version_number_from_build_settings!(target, variable, configuration = nil) ⇒ Object
- .get_version_number_from_plist!(plist_file) ⇒ Object
- .run(params) ⇒ Object
Methods inherited from Fastlane::Action
action_name, author, deprecated_notes, lane_context, method_missing, other_action, return_value, sample_return_value, shell_out_should_use_bundle_exec?, step_text
Class Method Details
.authors ⇒ Object
185 186 187 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 185 def self. ["Liquidsoul", "joshdholtz"] end |
.available_options ⇒ Object
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 157 def self. [ FastlaneCore::ConfigItem.new(key: :xcodeproj, env_name: "FL_VERSION_NUMBER_PROJECT", description: "Path to the Xcode project to read version number from, or its containing directory, optional. If omitted, or if a directory is passed instead, it will use the first Xcode project found within the given directory, or the project root directory if none is passed", optional: true, verify_block: proc do |value| UI.user_error!("Please pass the path to the project or its containing directory, not the workspace path") if value.end_with?(".xcworkspace") UI.user_error!("Could not find file or directory at path '#{File.expand_path(value)}'") unless File.exist?(value) UI.user_error!("Could not find Xcode project in directory at path '#{File.expand_path(value)}'") if File.extname(value) != ".xcodeproj" && Dir.glob("#{value}/*.xcodeproj").empty? end), FastlaneCore::ConfigItem.new(key: :target, env_name: "FL_VERSION_NUMBER_TARGET", description: "Target name, optional. Will be needed if you have more than one non-test target to avoid being prompted to select one", optional: true), FastlaneCore::ConfigItem.new(key: :configuration, env_name: "FL_VERSION_NUMBER_CONFIGURATION", description: "Configuration name, optional. Will be needed if you have altered the configurations from the default or your version number depends on the configuration selected", optional: true) ] end |
.category ⇒ Object
207 208 209 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 207 def self.category :project end |
.description ⇒ Object
149 150 151 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 149 def self.description "Get the version number of your project" end |
.details ⇒ Object
153 154 155 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 153 def self.details "This action will return the current version number set on your project. It first looks in the plist and then for '$(MARKETING_VERSION)' in the build settings." end |
.example_code ⇒ Object
193 194 195 196 197 198 199 200 201 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 193 def self.example_code [ 'version = get_version_number(xcodeproj: "Project.xcodeproj")', 'version = get_version_number( xcodeproj: "Project.xcodeproj", target: "App" )' ] end |
.get_plist!(folder, target, configuration = nil) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 99 def self.get_plist!(folder, target, configuration = nil) plist_files = target.resolved_build_setting("INFOPLIST_FILE", true) plist_files_count = plist_files.values.compact.uniq.count # Get plist file for specified configuration # Or: Prompt for configuration if plist has different files in each configurations # Else: Get first(only) plist value if configuration plist_file = plist_files[configuration] elsif plist_files_count > 1 = plist_files.keys selected = UI.select("What build configuration would you like to use?", ) plist_file = plist_files[selected] elsif plist_files_count > 0 plist_file = plist_files.values.first else return nil end # $(SRCROOT) is the path of where the XcodeProject is # We can just set this as empty string since we join with `folder` below if plist_file.include?("$(SRCROOT)/") plist_file.gsub!("$(SRCROOT)/", "") end # plist_file can be `Relative` or `Absolute` path. # Make to `Absolute` path when plist_file is `Relative` path unless File.exist?(plist_file) plist_file = File.absolute_path(File.join(folder, plist_file)) end UI.user_error!("Cannot find plist file: #{plist_file}") unless File.exist?(plist_file) plist_file end |
.get_project!(xcodeproj_path_or_dir) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 43 def self.get_project!(xcodeproj_path_or_dir) require 'xcodeproj' if File.extname(xcodeproj_path_or_dir) == ".xcodeproj" project_path = xcodeproj_path_or_dir else project_path = Dir.glob("#{xcodeproj_path_or_dir}/*.xcodeproj").first end if project_path && File.exist?(project_path) return Xcodeproj::Project.open(project_path) else UI.user_error!("Unable to find Xcode project at #{project_path || xcodeproj_path_or_dir}") end end |
.get_target!(project, target_name) ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 58 def self.get_target!(project, target_name) targets = project.targets # Prompt targets if no name unless target_name # Gets non-test targets non_test_targets = targets.reject do |t| # Not all targets respond to `test_target_type?` t.respond_to?(:test_target_type?) && t.test_target_type? end # Returns if only one non-test target if non_test_targets.count == 1 return targets.first end = targets.map(&:name) target_name = UI.select("What target would you like to use?", ) end # Find target target = targets.find do |t| t.name == target_name end UI.user_error!("Cannot find target named '#{target_name}'") unless target target end |
.get_version_number_from_build_settings!(target, variable, configuration = nil) ⇒ Object
88 89 90 91 92 93 94 95 96 97 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 88 def self.get_version_number_from_build_settings!(target, variable, configuration = nil) target.build_configurations.each do |config| if configuration.nil? || config.name == configuration value = config.resolve_build_setting(variable) return value if value end end return nil end |
.get_version_number_from_plist!(plist_file) ⇒ Object
135 136 137 138 139 140 141 142 143 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 135 def self.get_version_number_from_plist!(plist_file) return '$(MARKETING_VERSION)' if plist_file.nil? plist = Xcodeproj::Plist.read_from_path(plist_file) UI.user_error!("Unable to read plist: #{plist_file}") unless plist return '${MARKETING_VERSION}' if plist["CFBundleShortVersionString"].nil? plist["CFBundleShortVersionString"] end |
.is_supported?(platform) ⇒ Boolean
189 190 191 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 189 def self.is_supported?(platform) [:ios, :mac].include?(platform) end |
.output ⇒ Object
179 180 181 182 183 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 179 def self.output [ ['VERSION_NUMBER', 'The version number'] ] end |
.return_type ⇒ Object
203 204 205 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 203 def self.return_type :string end |
.run(params) ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'fastlane/lib/fastlane/actions/get_version_number.rb', line 10 def self.run(params) xcodeproj_path_or_dir = params[:xcodeproj] || '.' xcodeproj_dir = File.extname(xcodeproj_path_or_dir) == ".xcodeproj" ? File.dirname(xcodeproj_path_or_dir) : xcodeproj_path_or_dir target_name = params[:target] configuration = params[:configuration] # Get version_number project = get_project!(xcodeproj_path_or_dir) target = get_target!(project, target_name) plist_file = get_plist!(xcodeproj_dir, target, configuration) version_number = get_version_number_from_plist!(plist_file) # Get from build settings (or project settings) if needed (ex: $(MARKETING_VERSION) is default in Xcode 11) if version_number =~ /\$\(([\w\-]+)\)/ version_number = get_version_number_from_build_settings!(target, $1, configuration) || get_version_number_from_build_settings!(project, $1, configuration) # ${MARKETING_VERSION} also works elsif version_number =~ /\$\{([\w\-]+)\}/ version_number = get_version_number_from_build_settings!(target, $1, configuration) || get_version_number_from_build_settings!(project, $1, configuration) end # Error out if version_number is not set if version_number.nil? UI.user_error!("Unable to find Xcode build setting: #{$1}") end # Store the number in the shared hash Actions.lane_context[SharedValues::VERSION_NUMBER] = version_number # Return the version number because Swift might need this return value return version_number end |