Xcode 4: обновление CFBundleVersion на каждой сборке с использованием версии коммита Git-репо - PullRequest
6 голосов
/ 11 июня 2011

Я использую Xcode 4 в сочетании с Git и хотел бы увеличить CFBundleVersion в Info.plist для каждой сборки.Значение ключа CFBundleVersion должно быть обновлено до номера последнего коммита, который я сделал в репозитории Git.

Я нашел этот скрипт Python, который работает хорошо, но, к сожалению, не обновляетсяInfo.plist в моем проекте XCode - он просто обновляет Info.plist в «BUILT_PRODUCTS_DIR».

Есть ли у кого-нибудь идеи, как заставить Xcode 4 получить версию последнего коммита и поместить эту информациюв Info.plist проекта?

Спасибо!

Ответы [ 3 ]

7 голосов
/ 15 июня 2011

Строка версии должна иметь формат [xx]. [Yy]. [Zz], где x, y, z - числа.

Я справляюсь с этим, используя git tag, чтобы задать конкретные значения коммитов для значков тегов x и y (например, 0,4), а затем на этапе сборки скрипта z получает количество коммитов с момента последнего тега, возвращаемое git describe.

Вот сценарий, который я адаптировал из этого . Его можно добавить прямо к цели в качестве фазы сборки (shell is /usr/bin/env ruby):

# 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}'"
1 голос
/ 02 августа 2013

Это прекрасно работает для меня

#!/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
0 голосов
/ 10 августа 2012

@ damian Спасибо за скрипт, он хорошо работает.

Но после этого у меня возникла следующая проблема. Каждый раз после коммита, когда я собираю проект, у меня появляются изменения в git. У меня было решение игнорировать файл plist, но я этого не хочу.

Теперь я добавляю ваш скрипт в хук pre-commit в git вместо фазы сборки xcode. Единственная проблема в том, что мой скрипт не может получить PROJECT_DIR и INFOPLIST_FILE, поэтому мне пришлось писать их жестко в кодировке scipt. Я не мог найти, как получить переменные env из проекта xcode.

Хорошо работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...