【问题标题】:How to auto-increment Bundle Version in Xcode 4?如何在 Xcode 4 中自动增加捆绑版本?
【发布时间】:2011-09-11 07:56:27
【问题描述】:

我试图弄清楚如何在我的 Xcode 4 项目中自动增加 Bundle 版本号(用于临时和发布版本)。我在网上找到了一些声称可以执行此操作的脚本,但我不确定是将它们放在“前置操作”还是“后置操作”中。我也不确定我应该在 plist 中放置什么值;然后脚本将更改的数字或变量?

到目前为止,我尝试过的所有选项似乎都不起作用,因此我们将不胜感激。

以下是我尝试使用的最新脚本:

conf=${CONFIGURATION}
arch=${ARCHS:0:4}
# Only increase the build number on Device and AdHoc/AppStore build
if [ $conf != "Debug" ] && [ $conf != "Release" ] && [ $arch != "i386" ]
then
buildPlist=${INFOPLIST_FILE}
buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBuildVersion" $buildPlist)
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBuildNumber" $buildPlist)
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBuildNumber $buildNumber" $buildPlist
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildVersion.$buildNumber" $buildPlist
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildVersion.$buildNumber" $buildPlist
fi

【问题讨论】:

  • Xcode 环境变量在 Xcode4 的 pre/post-action 中不可用(请参阅 openradar.appspot.com/9111439openradar.appspot.com/9194286)。所以你可以安装最新版本的 Xcode。
  • 很抱歉没有提到 Pre-actions/Post-actions 不是构建系统的一部分。如果您想在每次启动新的构建过程时更新构建号,请从 Post-action 运行您的脚本。您还可以查看以下步骤(充其量可能是一种解决方法) 1. cmd + , 2. 选择“行为”选项卡 3. 从左窗格 3.1 中选择“构建成功”项。检查右窗格中的“运行”选项,然后选择将增加内部版本号的脚本。如果您的构建成功,这次 buildNumber 将增加。注意:首选项适用于您的所有 Xcode 项目。

标签: ios xcode build xcode4


【解决方案1】:

1,将 CFBundleVersion 设置为 1.0.1 或类似 x.x.x

2、添加构建阶段以运行shell脚本autoVersion.sh

3、保存下面名为autoVersion.sh的脚本

#!/bin/sh
# Auto Increment Version Script
# set CFBundleVersion to 1.0.1 first!!!
# the perl regex splits out the last part of a build number (ie: 1.1.1) and increments it by one
# if you have a build number that is more than 3 components, add a '\.\d+' into the first part of the regex.
buildPlist=${INFOPLIST_FILE}
newVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$buildPlist" | /usr/bin/perl -pe 's/(\d+\.\d+\.)(\d+)/$1.($2+1)/eg'`
#echo $newVersion;
/usr/libexec/PListBuddy -c "Set :CFBundleVersion $newVersion" "$buildPlist"

4、运行shell:cp autoVersion.sh ~/Documents/ and chmod 777 ~/Documents/autoVersion.sh

5,构建并享受它。 :)

perl 代码来自:https://gist.github.com/1436598

【讨论】:

  • 感谢您的实用工具! ,您实际上可以将其放入项目的根目录并使用shell /bin/sh ,将其称为“$SRCROOT/autoversion.sh”(带引号),因此该项目是可移植的
【解决方案2】:

您可能会发现以下帖子对您有所帮助:

来自 iPhone 开发的 Xcode 中发布版本的自动递增版本号 杰夫·拉马尔奇 http://iphonedevelopment.blogspot.com/2011/07/auto-incrementing-build-numbers-for.html

【讨论】:

    【解决方案3】:

    与 Alix 的答案相同,但更简单:

    buildNumber=`/bin/date +%Y%m%d%H%M%S`
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
    

    将此作为Run Script 项目添加到Build Phases 上的Target。这也具有monotonically increasing 的优势。

    【讨论】:

      【解决方案4】:

      这可能会对您有所帮助。我在我的项目中使用它。 https://gist.github.com/alokc83/5207294

      #!/bin/sh
      # xcode-build-number-generator.sh
      # @desc Automaticvally create build number every time using curent day, month and year
      # @usage
      # 1. Select: your Target in Xcode
      # 2. Select: Build Phases Tab
      # 3. Select: Add Build Phase -> Add Run Script
      # 4. Paste code below in to new "Run Script" section
      # 5. Drag the "Run Script" below "Link Binaries With Libraries"
      
      
      #Credits 
      # sekati@github for intial direction about automatic versioning
      # http://www.codinghorror.com/blog/2007/02/whats-in-a-version-number-anyway.html (For unferstanding the Software Versoining)
      #Feel free to leave comment or report issues
      
      
      MONTH=`date | awk '{print $2}'`
      
      case "$MONTH" in
        'Jan' )
               MONTHNUMBER=1
           ;;
          'Feb' )
               MONTHNUMBER=2
          ;;
          'Mar' )
          MONTHNUMBER=3
          echo "Month is $MONTHNUMBER"
          ;;
          'Apr' )
               MONTHNUMBER=4
          ;;
          'May' )
               MONTHNUMBER=5
              ;;
          'Jun' )
               MONTHNUMBER=6
              ;;
          'Jul' )
               MONTHNUMBER=7
              ;;
          'Aug' )
               MONTHNUMBER=8
              ;;
          'Sep' )
               MONTHNUMBER=9
              ;;
          'Oct' )
               MONTHNUMBER=10
              ;;
          'Nov' )
               MONTHNUMBER=11
              ;;
          'Dec' )
               MONTHNUMBER=12
              ;;
      esac
      
      DATE=`date | awk '{print $3}'`
      echo "Date = $DATE"
      YEAR=`date | awk '{print $6}'`
      echo "Date = $YEAR"
      
      ### only uncomment section below if testing the format in terminal
      #echo "BuildNumber1 = $MONTH$DATE$YEAR"
      #echo "or BUILD NUMBER = $DATE$MONTH$YEAR"
      #echo "or BUILD NUMBER = $MONTHNUMBER$DATE$YEAR Format is |Month Number Date Year|"
      #echo "or BUILD NUMBER = $DATE$MONTHNUMBER$YEAR format is |Date MonthNumber Year|"
      ############################
      
      #### Uncomment only one one style or last one will be in effect
      #buildNumber=$MONTH$DATE$YEAR
      #buildNumber=$DATE$MONTH$YEAR
      buildNumber=$MONTHNUMBER$DATE$YEAR
      #buildNumber=$DATE$MONTHNUMBER$YEAR
      
      
      echo "Final Build number is $buildNumber"
      ## Below command write buildNumber in the property list
      /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
      

      【讨论】:

        【解决方案5】:

        对于想要将版本递增集成到命令行构建脚本(可能用于持续集成)的任何人,请参阅以下命令:

            # cd into the project folder containing the plist
            cd /Users/waitea/iOS/E.ON/iOS/trunk/Eon
        
            # grab the version numbers
            major_version=$(grep -C 2 CFBundleVersion App-Info.plist | grep -o '[0-9]\+.[0-9]\+.[0-9]\+')
            major_version_min=$(echo $major_version | grep -o '[0-9]\+.[0-9]\+\.')
            minor_version=$(echo $major_version | grep -o '[0-9]\+$')
        
            # increment the minor version
            increment=`expr $minor_version + 1`
            incremented_whole_version="$major_version_min$increment"
        
            # replace the build number in the plist using perl
            /usr/bin/perl -p -i -e "s/$major_version/$incremented_whole_version/g" App-Info.plist
        

        这将增加 x.x.x 样式版本号中最右边的数字。调整正则表达式以适应您的约定。

        花了我一段时间,所以我想我会分享以回馈社区!

        编辑 - 我创建了一个持续集成系统,可以为您完成这项工作

        https://github.com/adamwaite/XcodeProject

        【讨论】:

          【解决方案6】:

          我发现使用分层 xcconfigs 可以解决这个问题。

          使用应用、库和 SDK 处理复杂的构建,您不仅要能够协调每个项目的构建号,还要协调构建号的兼容性。

          您可以创建一个构建管理标头,它实际上是一个带有构建迭代编号(或版本信息,即 beta、dev、rel)的文本文件,并通过每个项目的 xcconfig 导入链导入它。

          此时,您可以有一个目标构建脚本步骤,该步骤将嵌入您的构建/版本控制信息。这也最好通过将文本保存在您的 plist 中并在您的派生文件/构建文件部分上运行 PlistBuddy 来完成。 (这样您的源代码控制更改最小)

          如果您可以编写一个构建执行脚本来处理必要的构建号(或者更好的是,使用像竹这样的系统为您创建文件),您可以将其与您的代码分开。当然,如果您需要这样做并保持跟踪,您可能必须签入更改的内部版本号以允许其增加。

          因此,我能够按照以下方式维护内部版本号: 2.0.3 b34 (3473) 我们有一个内部版本号和一个 SVN 签出构建点。 (请不要混蛋,我是老派)

          Pre/Post 操作更适用于 Uber 通知或流程: 构建开始/失败/等的电子邮件 将完成的项目复制到完成的项目服务器。

          其他一切作为构建脚本效果更好。

          (和往常一样:让脚本阶段调用外部脚本文件。不要将脚本推送到项目中,源代码控制项目文件是地狱)

          希望这会有所帮助。

          【讨论】:

            【解决方案7】:

            FWIW - 这是我目前用来增加内部版本号的方法仅适用于发布版本(包括存档)。在 Xcode 5.1 下运行良好。

            直接在 Xcode 中将 sn-p 复制/粘贴到 Run script 构建阶段:

            buildnum=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$PRODUCT_SETTINGS_PATH")
            
            if [ "$CONFIGURATION" = "Release" ]; then
            buildnum=$((buildnum + 1))
            echo "Build number updated to $buildnum"
            /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildnum" "$PRODUCT_SETTINGS_PATH"
            fi;
            

            【讨论】:

              【解决方案8】:

              如果您使用像“x.x.x”这样的版本系统,您可以添加这个运行脚本。每次构建新版本时,它都会增加版本号 (x.x.x+1):

              if [ "${CONFIGURATION}" != "Debug" ]; then
              
              VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
              
              NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $4}'`
              
              NEWSUBVERSION=$(($NEWSUBVERSION + 1))
              
              NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 "." $3 ".'$NEWSUBVERSION'" }'`
              
              /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"
              
              fi
              

              【讨论】:

                【解决方案9】:

                我还没有为 Xcode 10.1 找到一个很好的解决方案。我修改了一些脚本以达到目标。现在一切正常。

                version=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${INFOPLIST_FILE}")
                build=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}")
                /usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue ${version}" "${CODESIGNING_FOLDER_PATH}/Settings.bundle/Root.plist"
                

                【讨论】:

                  猜你喜欢
                  • 2014-02-02
                  • 2011-11-09
                  • 2011-06-23
                  • 2016-01-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多