jeudi 22 mars 2012

Auto-incrémentation des numéros de build pour les versions Release dans Xcode

J'utilise le merveilleux Vol d'essai pour distribuer construit. Une chose que le vol d'essai est un peu pointilleux sur les numéros de build est. Lorsque vous téléchargez une construction, il utilise le numéro de build pour voir si vous téléchargez un remplacement ou une nouvelle construction. Il vous permettra de créer une nouvelle construction, même si vous ne vous souvenez d'incrémenter le numéro de build, mais c'est une étape manuelle supplémentaire, puis vous vous retrouvez avec deux constructions avec le même numéro de build.

Parce que je suis distrait, je voulais automatisé ce processus. Fondamentalement, je voulais incrémenter la version courte chaîne tout moment nous faisons un Archive et incrémenter le bundle construire ID tout moment nous ne une configuration Release construire, mais laisser les numéros de version seul sur les versions Debug.

Malheureusement, plusieurs de nos projets sont celles que nous avons hérité ou repris, donc pas tous les projets utilise la même version système de numérotation. Comment nous 1.0b5 incrément est différent de la façon dont nous incrémenter 1.0.12, ou un simple numéro de build comme le 1058.

La façon dont je m'occupe avec ceci est un script exécuté Phase de construction dans la cible de mon application exécutable qui exécute le script suivant rubis (assurez-vous que vous définissez la "coquille" sur le terrain au /usr/bin/ruby, Et s'assurer que le script est la dernière phase de la construction de l'application). N'hésitez pas à utiliser ce script si vous le souhaitez et de le modifier pour répondre à vos besoins. Si vous l'améliorer, je serais heureux d'intégrer des améliorations de nouveau en lui. Un élément à noter: la façon dont je crée la différence entre archives et d'autres configuration Release construit pourrait être un peu fragile depuis que je suis en s'appuyant sur un schéma de nommage sans-papiers dans une variable d'environnement.

Note: Je suis conscient de agvtool. Je l'ai évité pour deux raisons. Tout d'abord, je voulais plus de contrôle sur les régimes de numérotation, et la deuxième, j'ai essayé d'utiliser agvtool dans un script de compilation de quelques années en arrière, mais à cette époque, il y avait des problèmes lorsque vous heurté les numéros de version d'un projet qui est actuellement ouverte. Ces questions peuvent avoir été résolu, mais je ne veux pas me battre à nouveau cette bataille.

def get_file_as_string(filename)     data = ''     f = File.open(filename, "r")      f.each_line do |line|         data += line     end     return data end   def handle_alpha_beta(old_value, letter, infoplist, start_of_value, end_of_value)     parts = old_value.split(letter)     version_num = parts[0]     alpha_num = parts[1].to_i      alpha_num = alpha_num + 1     new_version = version_num.to_s + letter + alpha_num.to_s     print "Assigning new version: " + new_version + "\n"     new_key = "#{new_version}"      part_1 = infoplist[0, start_of_value - ''.length];     part_2 = new_key      part_3 = infoplist[end_of_value + "".length, infoplist.length - (end_of_value - start_of_value + (new_key.length - 1))]          new_info_plist = part_1 + part_2 + part_3     new_info_plist end  def find_and_increment_version_number_with_key(key, infoplist)      start_of_key = infoplist.index(key)     start_of_value = infoplist.index("", start_of_key) + "".length     end_of_value = infoplist.index("", start_of_value)     old_value = infoplist[start_of_value, end_of_value - start_of_value]      print "Old version for " + key + ": " + old_value + "\n"     print old_value.class.to_s + "\n"     old_value_int = old_value.to_i     print old_value_int.class.to_s + "\n"     if (old_value.index("a") != nil) # alpha         infoplist = handle_alpha_beta(old_value, "a", infoplist, start_of_value, end_of_value)     elsif (old_value.index("b") != nil) # beta         infoplist = handle_alpha_beta(old_value, "b", infoplist, start_of_value, end_of_value)     elsif (old_value.index(".") != nil) # release dot version         parts = old_value.split(".")         last_part = parts.last.to_i         last_part = last_part + 1         parts.delete(parts.last)          new_version = ""         first = true         parts.each do |one_part|             if (first)                 first = false             else                 new_version = new_version + "."             end             new_version = new_version + one_part         end         new_version = new_version.to_s + "." + last_part.to_s         print "New version: " + new_version.to_s + "\n"         new_key = "#{new_version}"         infoplist = "#{infoplist[0, start_of_value - ''.length]}#{new_key}#{infoplist[end_of_value + ''.length, infoplist.length - (end_of_value+1)]}"     elsif (old_value.to_i != nil) # straight integer build number         new_version = old_value.to_i + 1         print "New version: " + new_version.to_s + "\n"         new_key = "#{new_version}"          part_1 = infoplist[0, start_of_value - ''.length]         part_2 = new_key         part_3 = infoplist[end_of_value + "".length, infoplist.length - (end_of_value+1)]         infoplist = part_1 + part_2 + part_3     end      infoplist end    config = ENV['CONFIGURATION'].upcase config_build_dir = ENV['CONFIGURATION_BUILD_DIR']  archive_action = false if (config_build_dir.include?("ArchiveIntermediates"))     archive_action = true end  print "Archive: " + archive_action.to_s + "\n"   print config  if (config == "RELEASE")     print " incrementing build numbers\n"     project_dir = ENV['PROJECT_DIR']     infoplist_file = ENV['INFOPLIST_FILE']     plist_filename = "#{project_dir}/#{infoplist_file}"      infoplist = get_file_as_string(plist_filename)     infoplist = find_and_increment_version_number_with_key("CFBundleVersion", infoplist)     if (archive_action)         infoplist = find_and_increment_version_number_with_key("CFBundleShortVersionString", infoplist)     end     File.open(plist_filename, 'w') {|f| f.write(infoplist) } else     print " not incrementing build numbers" end


Aucun commentaire: