ios - 如何通过使用 git 提交号作为 xcode 内部版本号来避免无限循环

标签 ios xcode git

我最近使用脚本来增加与 git 提交相关的项目构建号,但我遇到了无限循环。

我构建,然后构建号被更改,然后我提交,因为 info.plist 被更改,然后构建号将在下次构建时更改,所以我必须再次提交,因为 info.plist 已更改,然后你就知道会发生什么了。

有什么办法可以避免这种情况吗?还是有更好的方法来自动增加内部版本号?

附言。因为我和其他人一起工作过这个项目,所以每次构建时手动更改数字或颠簸它很难保持数字。

最佳答案

是的,这是一个经典问题。我使用类似的技术,但我没有将内部版本号与 git 提交相关联,而是检测源树中文件的更改与版本文件(一个简单文件保存版本和内部版本号)。如果有变化,我会修改内部版本号。

这是我使用的 python 脚本。您应该在您的 Xcode 项目中将其作为一个单独的目标,然后使其他目标依赖于该目标。它将根据需要使用新版本/内部版本号更新您的 .plist 文件。它假定源代码树位于版本文件 的位置下方:

#!/usr/bin/env python
#
# Bump build number in Info.plist files if a source file have changed.
#
# usage: bump_buildnum.py buildnum.ver Info.plist [ ... Info.plist ]
#
# andy@trojanfoe.com, 2014.
#

import sys, os, subprocess, re

def read_verfile(name):
    version = None
    build = None
    verfile = open(name, "r")
    for line in verfile:
        match = re.match(r"^version\s+(\S+)", line)
        if match:
            version = match.group(1).rstrip()
        match = re.match(r"^build\s+(\S+)", line)
        if match:
            build = int(match.group(1).rstrip())
    verfile.close()
    return (version, build)

def write_verfile(name, version, build):
    verfile = open(name, "w")
    verfile.write("version {0}\n".format(version))
    verfile.write("build {0}\n".format(build))
    verfile.close()
    return True

def set_plist_version(plistname, version, build):
    if not os.path.exists(plistname):
        print("{0} does not exist".format(plistname))
        return False

    plistbuddy = '/usr/libexec/Plistbuddy'
    if not os.path.exists(plistbuddy):
        print("{0} does not exist".format(plistbuddy))
        return False

    cmdline = [plistbuddy,
        "-c", "Set CFBundleShortVersionString {0}".format(version),
        "-c", "Set CFBundleVersion {0}".format(build),
        plistname]
    if subprocess.call(cmdline) != 0:
        print("Failed to update {0}".format(plistname))
        return False

    print("Updated {0} with v{1} ({2})".format(plistname, version, build))
    return True

def should_bump(vername, dirname):
    verstat = os.stat(vername)
    allnames = []
    for dirname, dirnames, filenames in os.walk(dirname):
        for filename in filenames:
            allnames.append(os.path.join(dirname, filename))

    for filename in allnames:
        filestat = os.stat(filename)
        if filestat.st_mtime > verstat.st_mtime:
            print("{0} is newer than {1}".format(filename, vername))
            return True

    return False

def upver(vername):
    (version, build) = read_verfile(vername)
    if version == None or build == None:
        print("Failed to read version/build from {0}".format(vername))
        return False

    # Bump the version number if any files in the same directory as the version file
    # have changed, including sub-directories.
    srcdir = os.path.dirname(vername)
    bump = should_bump(vername, srcdir)

    if bump:
        build += 1
        print("Incremented to build {0}".format(build))
        write_verfile(vername, version, build)
        print("Written {0}".format(vername))
    else:
        print("Staying at build {0}".format(build))

    return (version, build)

if __name__ == "__main__":
    if os.environ.has_key('ACTION') and os.environ['ACTION'] == 'clean':
        print("{0}: Not running while cleaning".format(sys.argv[0]))
        sys.exit(0)

    if len(sys.argv) < 3:
        print("Usage: {0} buildnum.ver Info.plist [... Info.plist]".format(sys.argv[0]))
        sys.exit(1)
    vername = sys.argv[1]

    (version, build) = upver(vername)
    if version == None or build == None:
        sys.exit(2)

    for i in range(2, len(sys.argv)):
        plistname = sys.argv[i]
        set_plist_version(plistname, version, build)        

    sys.exit(0)

关于ios - 如何通过使用 git 提交号作为 xcode 内部版本号来避免无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35407266/

相关文章:

iOS:如果我的应用程序进入非事件状态,待处理的延迟执行选择器请求会发生什么?

ios - 将 PHLivePhotoView 添加到 Storyboard

xcode - 无法在Xcode 9中对我的Swift文件进行重构

database - csv 到核心数据

linux - 在没有 apt-get 或 yum 的情况下安装 git 或更新 git

ios - native 应用程序的 Azure Active Directory 应用程序角色

objective-c - 有没有办法在不使用 UINavigationController 的情况下更改 iOS 中的 View ?

git - 在 GIT 中撤消删除

git - 为什么pull后master的工作目录不干净?

ios - UITableview 通过滚动复制图像