2011-06-11 16 views
6

'u kullanarak her derlemede CFBundleVersion'ı güncelle Git Xcode 4'ü Git ile birlikte kullanıyorum ve her derlemede Info.plist'de CFBundleVersion değerini artırmak istiyorum. CFBundleVersion anahtarının değeri Git deposuna yaptığım son işlemin sayısıyla güncellenmelidir.Xcode 4: Git repo commit sürümü

İyi çalışıyor, ancak maalesef Xcode projemde Info.plist'i güncelleştirmeyen that python komut dosyasını buldum - sadece "BUILT_PRODUCTS_DIR" dosyasındaki Info.plist dosyasını güncelleştiriyor.

Xcode 4'ün en son işlemin sürümünü almak ve bu bilgileri projenin Info.plist'ine yerleştirmek için nasıl bir fikir sahibi olur?

Teşekkürler!

cevap

7

Sürüm dizesi, [xx] biçiminde olmalıdır. [Yy]. [Zz] Burada x, y, z sayılardır.

Özel işlemlerin x ve y (ör. 0.4) için anlamlı etiket numaraları ve sonra bir kod oluşturma aşaması yoluyla verilmesi için kullanarak bu sorunu ele alıyorum, z git describe tarafından döndürülen son etiketten beri işlem sayısını alır .

this one'dan uyarladığım komut dosyası. Düz bir yapı aşaması olarak hedefin (shell/usr/bin/env ruby olan) eklenebilir: komut için teşekkür ederiz @damian

# add git tag + version number to Info.plist 
version = `/usr/bin/env git describe`.chomp 

puts "raw version "+version 
version_fancy_re = /(\d*\.\d*)-?(\d*)-?/ 
version =~ version_fancy_re 
commit_num = $2 
if ($2.empty?) 
commit_num = "0" 
end 
fancy_version = ""+$1+"."+commit_num 
puts "compatible: "+fancy_version 

# backup 
source_plist_path = File.join(ENV['PROJECT_DIR'], ENV['INFOPLIST_FILE']) 
orig_plist = File.open(source_plist_path, "r").read; 
File.open(source_plist_path+".bak", "w") { |file| file.write(orig_plist) } 

# put in CFBundleVersion key 
version_re = /([\t ]+<key>CFBundleVersion<\/key>\n[\t ]+<string>).*?(<\/string>)/ 
orig_plist =~ version_re 
bundle_version_string = $1 + fancy_version + $2 
orig_plist.gsub!(version_re, bundle_version_string) 

# put in CFBundleShortVersionString key 
version_re = /([\t ]+<key>CFBundleShortVersionString<\/key>\n[\t ]+<string>).*?(<\/string>)/ 
orig_plist =~ version_re 
bundle_version_string = $1 + fancy_version + $2 
orig_plist.gsub!(version_re, bundle_version_string) 

# write 
File.open(source_plist_path, "w") { |file| file.write(orig_plist) } 
puts "Set version string to '#{fancy_version}'" 
+0

, Damian teşekkür ederiz! – Patrick

0

iyi çalışıyor.

Fakat o zamandan sonra sorunu takip ettim. Projeyi oluşturduğumda bir taahhütten sonra her zaman git'de değişiklikler yapıyorum. Plist dosyasını görmezden gelmek için bir çözüm buldum ama bunu istemiyorum.

Şimdi, xcode oluşturma aşaması yerine komut dosyasını pre-commit hook'a gitiyorum. Bununla ilgili tek sorun, script'imin PROJECT_DIR ve INFOPLIST_FILE öğelerini alamamasıdır, bu yüzden bunları kodlanmış olarak kodlanmış olarak yazmak zorunda kaldım. Bir xcode projesinden env değişkenlerini nasıl alacağımı bulamadım.

O iyi çalışıyor :)

+1

Yapmak isteyebileceğiniz şey, plist'inizi bir şablon olarak repo'unuza yerleştirmek, repo'nuzdaki gerçek plist'i göz ardı etmek ve daha sonra da yapım zamanı oluşturmaktır. Bu şekilde, depoda otomatik olarak oluşturulmuş içerikleriniz yok. – Grav

1

Bu benim için mükemmel çalışıyor

#!/usr/bin/ruby 

require 'rubygems' 
    begin 
     require 'Plist' 
     rescue LoadError => e 
     puts "You need to install the 'Plist' gem: [sudo] gem install plist" 
    exit 1 
end 

raise "Must be run from Xcode" unless ENV['XCODE_VERSION_ACTUAL'] 

GIT = "/usr/bin/env git" 
PRODUCT_PLIST = File.join(ENV['BUILT_PRODUCTS_DIR'], ENV['INFOPLIST_PATH']) 
HASH = `#{GIT} log -1 --pretty=format:%h` 
BUNDLE_VERSION = "CFBundleVersion" 

if File.file?(PRODUCT_PLIST) and HASH 

    # update product plist 
    `/usr/bin/plutil -convert xml1 \"#{PRODUCT_PLIST}\"` 
    info = Plist::parse_xml(PRODUCT_PLIST) 
    if info 
     info[BUNDLE_VERSION] = HASH 
     info["GCGitCommitHash"] = HASH 
     info.save_plist(PRODUCT_PLIST) 
    end 
    `/usr/bin/plutil -convert binary1 \"#{PRODUCT_PLIST}\"` 

    # log 
    puts "updated #{BUNDLE_VERSION} to #{HASH}" 
    puts "HEAD: #{HASH}" 
end