菜鸟教程小白 发表于 2022-12-13 14:27:41

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


                                            <p><p>我最近使用一个脚本来增加与 git 提交相关的项目的内部版本号,我遇到了一个无限循环。</p>

<p>我构建,然后内部版本号被更改,然后我提交,因为 info.plist 被更改,那么内部版本号将在我下次构建时更改,所以我必须再次提交它,因为 info.plist 被更改,那你就知道会发生什么了。</p>

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

<p>ps。由于我与其他人合作过这个项目,因此每次构建时手动更改编号或颠簸它很难维护编号。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>是的,这是一个经典问题。我使用了类似的技术,但我没有将内部版本号与 git 提交相关联,而是检测与 <em>version 文件</em>(一个简单文件)的修改时间相关的源树中文件的更改保存版本和内部版本号)。如果有变化,我会修改内部版本号。</p>

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

<pre><code>#!/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 ]
#
# [email protected], 2014.
#

import sys, os, subprocess, re

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

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

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

    plistbuddy = &#39;/usr/libexec/Plistbuddy&#39;
    if not os.path.exists(plistbuddy):
      print(&#34;{0} does not exist&#34;.format(plistbuddy))
      return False

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

    print(&#34;Updated {0} with v{1} ({2})&#34;.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 &gt; verstat.st_mtime:
            print(&#34;{0} is newer than {1}&#34;.format(filename, vername))
            return True

    return False

def upver(vername):
    (version, build) = read_verfile(vername)
    if version == None or build == None:
      print(&#34;Failed to read version/build from {0}&#34;.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(&#34;Incremented to build {0}&#34;.format(build))
      write_verfile(vername, version, build)
      print(&#34;Written {0}&#34;.format(vername))
    else:
      print(&#34;Staying at build {0}&#34;.format(build))

    return (version, build)

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

    if len(sys.argv) &lt; 3:
      print(&#34;Usage: {0} buildnum.ver Info.plist [... Info.plist]&#34;.format(sys.argv))
      sys.exit(1)
    vername = sys.argv

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

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

    sys.exit(0)
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何通过使用 git 提交号作为 xcode 内部版本号来避免无限循环,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/35407266/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/35407266/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何通过使用 git 提交号作为 xcode 内部版本号来避免无限循环