更好的增加内部编号的方法?


133

我一直在使用Shell脚本作为Xcode构建过程的一部分,以增加plist文件中的内部版本号,但是,这会使Xcode 4.2.1频繁崩溃(出现关于目标不属于项目的错误;我猜是plist文件的更改以某种方式使Xcode混乱)。

shell脚本这样做是为了使构建号仅agvtool在文件比plist文件新时才增加(因此,仅构建不会增加值):

if [ -n \"`find ProjDir -newer ProjDir/Project-Info.plist`\" ]; then agvtool -noscm next-version -all; else echo \"Version not incremented\"; fi

有没有办法增加不会破坏Xcode 的内部版本号(在plist文件或其他任何地方)?

最后的编辑:我现在使用刚刚在github上公开的python脚本来做这种事情。它没有很好的文档记录,但应该不难解决。作为奖励,此存储库还包含一个有用的脚本,该脚本可将第三方库自动捆绑到应用程序捆绑包中。


1
如果有人感兴趣:我对脚本进行了一些修改,以使用十六进制数字代替十进制数字-gist.github.com/sascha/5398750
Sascha

1
您可以直接将此脚本添加为预构建操作,而无需调用外部脚本。不要在构建阶段运行此脚本。Xcode将仅每隔一个版本复制更新的plist。
Ed McManus

3
开箱即用时,我遇到了“权限被拒绝”错误,因此我想向其他遇到相同问题的人指出此问答: stackoverflow.com/q/9850936/519030
Jason

该脚本失败,并显示退出代码1。有人可以帮助我吗?
罗伯特·克莱格

@Tander似乎您没有提供plist文件作为脚本的参数。
trojanfoe 2014年

Answers:


29

如果我正确理解了您的问题,您是否要修改Project-Info.plist文件,它是Xcode标准项目模板的一部分?

我问这个的原因是Project-Info.plist通常是在版本控制下,对其进行修改意味着它将被标记为已修改。

如果您满意,那么以下代码段将更新内部版本号并将该文件标记为在此过程中get_build_number已修改,其中有一些脚本(例如,在本示例中为占位符)以获取您可能会增加的内部版本号想要使用:

#!/bin/sh

# get_build_number is a placeholder for your script to get the latest build number
build_number = `get_build_number`

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_number}" ProjDir/Project-Info.plist

PlistBuddy允许您设置plist文件中的任何键,而不仅仅是版本号。您可以创建所需的所有plist文件,并在需要时将它们包括在资源中。然后可以从捆绑软件中读取它们。

至于需要在“关于”窗格和其他位置显示版本的信息,您也可以查看设置CFBundleGetInfoStringCFBundleShortVersionString


我不需要plist文件中的git commit(或标签),所以一个简单的增量系统就可以了(由提供agvtool),但是在构建过程中修改plist的行为经常会中断Xcode(因为删除了它没有的脚本) t一次崩溃(每3个版本左右崩溃一次)。是否可以将版本信息放在另一个plist文件中,并将其包含在捆绑包中,并可以从App进行访问?
trojanfoe 2012年

很棒的脚本-我更喜欢将它与Hugues BR的建议结合起来,仅在存档构建时使用它。保持较低的数量,并忽略发布之间执行的许多开发构建。
2014年

5
什么是get_build_number?那只是一些占位符吗?
chrisp 2014年

是的,get_build_number只是一个占位符-更新了答案以进行澄清。
Monolo '18

72

关于这个问题,我已经弄乱了很多答案,但没有一个让我满意。但是,我终于想出了我真正喜欢的混合物!

有两个步骤,一个在构建阶段的开始,一个在构建阶段的结束。

开始时:

# Set the build number to the count of Git commits
if [ "${CONFIGURATION}" = "Release" ]; then
    buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi

在末尾:

# Set the build number to "DEVELOPMENT"
if [ "${CONFIGURATION}" = "Release" ]; then
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi

查看Xcode中的Info.plist,您会看到版本号为“ DEVELOPMENT”,但是内置的应用程序的内置版本号会不断增加。(只要您始终在同一分支上进行构建即可。)

最后,将版本号设置回恒定字符串,以防止通过构建应用程序更改Info.plist文件。

为什么我喜欢这种方法:

  • 简单
  • 不污染Git版本历史
  • CFBundleVersion是全自动的
  • 我可以随时修改漂亮的版本号

最好将版本号保留在受版本控制的plist文件中,这是最好的方法,尤其是如果每个发行版都有分支,有时需要合并或挑选。谢谢!
马修·菲利普斯

14
您可以使用git rev-list --count HEAD代替git rev-list HEAD | wc -l | tr -d ' '
kennytm'1

嗯 我发现,如果您使用fastlane这种方式上载自动构建,则会得到:错误ITMS-90058:“此捆绑包无效。Info.plist文件中的CFBundleVersion [DEVELOPMENT]键的值必须是以下位置的句点分隔列表:最多三个非负整数。”
fatuhoku 2015年

1
我不确定应该去哪里,我将第一个脚本作为第一个构建阶段,将最后一个脚本作为最后一个构建阶段,它对我有用。
Wil Gieseler

1
您绝对可以使用此解决方案来提交Info.plist-这就是重点。Info.plist始终以版本号设置为“ DEVELOPMENT”设置并签入,在构建过程中会临时更改,然后再设置为“ DEVELOPMENT”,因此Info.plist稳定。
Wil Gieseler,

38

我已经使用了这个glist。它按预期工作。 https://gist.github.com/sekati/3172554 (所有版权归原始作者所有)

我随时间修改的脚本。

xcode-versionString-generator.sh

xcode-build-number-generator.sh

由于这些要点正在帮助开发人员社区,因此我从中开发了GitHub项目。因此,让我们很好地开发它。这是GitHub项目:https : //github.com/alokc83/Xcode-build-and-version-generator

我已经对两个脚本的代码进行了一些增强。而不是使用下面的方法从GitHub获取最新的

对于版本:

# xcode-version-bump.sh
# @desc Auto-increment the version number (only) when a project is archived for export. 
# @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. Check the checkbox "Run script only when installing"
# 6. Drag the "Run Script" below "Link Binaries With Libraries"
# 7. Insure your starting version number is in SemVer format (e.g. 1.0.0)

# This splits a two-decimal version string, such as "0.45.123", allowing us to increment the third position.
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $3}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"

对于构建:

# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below into new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Ensure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

这将始终增加内部版本号,正如我希望它仅在源文件更改时才增加。这只是我当前使用的脚本,用于较少的安全检查,并且对更改内容的了解较少。
trojanfoe 2014年

XCode 5:编辑器(菜单栏)→添加构建阶段→添加复制文件构建阶段:
Jonny 2014年

@trojanfoe:您可以将此脚本作为post commit钩子运行。在这种情况下,仅当您将代码提交回购时,它才会增加内部版本号。下面从LostInTheTrees中回答是您可能想做的更多事情。
Alix

@Alix链接的shell脚本现在与此处发布的脚本完全不同。要仅在执行存档构建时增加构建号,可以使用我基于上面的Alix脚本制作的要点,非常基于以下内容:gist.github.com/mattpotts/abcffea6d08ad45739ef
Matthew

14

这整个条目非常有帮助。我使用了这个技巧,但是将脚本设置为GIT中的提交后挂钩,因此,每次成功提交后CFBundleVersion都会递增。挂钩脚本位于.git / hooks中。日志保留在项目目录中。

这符合我最基本的标准。我希望能够从GIT中提取一个版本,然后重新构建之前的确切版本。在构建过程中完成的任何增量操作都不会这样做。

这是我的脚本:

#!/bin/sh
#
# post-commit
#
# This script increments the CFBundleVersion for each successful commit
#

plist="./XYZZY/XYZZY-Info.plist"
buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
if [ -z "$buildnum" ]; then
    exit 1
fi
buildnumplus=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnumplus" "$plist"

echo $(date) "- Incremented CFBundleVersion to" $buildnumplus >> hookLog.txt

我有相同的要求,这就是为什么在修改源文件后才将内部版本号增加的原因。我发现它可以很好地工作,并且bump_build_number.sh自创建以来无需更改脚本。
trojanfoe 2013年

14

我不知道哪种方法是最好的,但是我会发布苹果的答案,以防万一有人在搜索...

根据苹果公司的问答环节

使用agvtool自动执行版本和内部版本号

版本号和内部版本号分别指定应用程序的市场版本和内部版本。agvtool是一个命令行工具,可让您自动将这些数字递增到下一个最高数字或特定数字。

内部版本号标识应用程序的未发布或已发布版本。它作为CFBundleVersion(捆绑版)存储在应用程序的Info.plist中。

您必须在Xcode项目中完成以下步骤:

  1. 启用agvtool

导航到目标的“构建设置”窗格,然后为所有构建配置更新它,如下所示:

  • 将“当前项目版本”设置为您选择的值。

Xcode项目数据文件project.pbxproj包含一个CURRENT_PROJECT_VERSION(当前项目版本)构建设置,该设置指定项目的当前版本。agvtool在project.pbxproj中搜索CURRENT_PROJECT_VERSION。如果CURRENT_PROJECT_VERSION存在,它将继续运行,否则将停止运行。其值用于更新内部版本号。

  • 将Versioning System设置为Apple Generic。

默认情况下,Xcode不使用任何版本系统。将Versioning System设置为Apple Generic可确保Xcode将在项目中包含所有由agvtool生成的版本信息。

将版本控制系统设置为Apple通用

  1. 设置您的版本并建立编号

agvtool在应用程序的Info.plist中搜索您的版本和内部版本号。如果它们存在,它将更新它们,否则不执行任何操作。确保CFBundleVersion(捆绑包版本)和CFBundleShortVersionString(捆绑包版本字符串,简称)键存在于Info.plist中,如下图所示:

设置您的版本并建立编号

退出Xcode,然后在运行以下任何命令之前,在终端应用程序中导航到包含.xcodeproj项目文件的目录。.xcodeproj项目文件包含agvtool使用的project.pbxproj。(这是您可以在脚本而不是命令行中运行的部分。)

更新版本号

要将版本号更新为特定版本,请运行

xcrun agvtool new-marketing-version <your_specific_version>

例如:将版本号更新为2.0

xcrun agvtool new-marketing-version 2.0

更新内部版本号

要自动增加内部版本号,请运行

xcrun agvtool next-version -all

要将应用程序的内部版本号设置为特定版本,请运行

xcrun agvtool new-version -all <your_specific_version>

例如:将内部版本号设置为2.6.9

xcrun agvtool new-version -all 2.6.9

奖金:

要查看当前版本号,请运行

xcrun agvtool what-marketing-version

要查看当前的内部版本号,请运行

xcrun agvtool what-version

7
这个问题是agvtool将中止xcode构建,因此无法在构建阶段将其集成为脚本。
Daniel Schlaug '16

1
您难道不可以通过agvtool在计划的构建预操作中进行调整吗?
lottadot

11

FWIW-这是我目前仅用于增加发行版本(包括归档)的版本号的方法。在Xcode 5.1下工作正常。

只需将代码段直接复制/粘贴到Xcode中的“运行”脚本构建阶段即可:

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;

如何增加CFBundleVersion?在Xcode 5.1中,它是一个字符串格式为“ 1.0”吗?
克里斯普

1
最后有人做对了:)为什么我要关心在我的开发设备上运行的每个构建?发布(和发布给测试人员)计数,而不是“ hmm,将2px向左移动”构建。
uvesten

7

感谢您的脚本。效果很好。

我的Info.plist位于名称包含空格的子目录中,因此我必须在plist路径周围用引号将运行脚本修改为:

${PROJECT_DIR}/tools/bump_build_number.sh "${PROJECT_DIR}/${INFOPLIST_FILE}"

和shell脚本,所有路径的引号都用相同的方式引起来:

#!/bin/sh

if [ $# -ne 1 ]; then
    echo usage: $0 plist-file
    exit 1
fi

plist=$1
dir=$(dirname "$plist")

# Only increment the build number if source files have changed
if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
    buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$plist")
    if [ -z "$buildnum" ]; then
        echo "No build number in $plist"
        exit 2
    fi
    buildnum=$(expr $buildnum + 1)
    /usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "$plist"
    echo "Incremented build number to $buildnum"
else
    echo "Not incrementing build number as source files have not changed"
fi

是的,这很有意义。很高兴您发现它很有用;从那时起,我一直在Xcode 4 {2,3,4,5}下使用,完全没有问题。
trojanfoe 2012年

如果我看到这个答案,我会节省几个小时!另外,请注意,内部版本号不能为小数,否则BASH会出错。
布伦登

6

我当前使用的脚本很大程度上基于上述Alix的。我在下面的改编中添加了一个检查,使其仅对发行版/归档版本进行自动递增。

没有该更改,版本控制就会发生冲突,因为每个开发人员都将以自己的速度增加内部版本号。事实是,git历史会由于构建号始终更改而不必要地受到污染。

# xcode-build-bump.sh
# @desc Auto-increment Xcode target build number every time the project is archived
# @src stackoverflow.com/a/15483906
# @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"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

if [ "Release" != "${CONFIGURATION}" ]
then
    exit 0
fi

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

它也可以作为GitHub gist使用(以稍微容易复制和粘贴的格式)。


5

我建议使用autorevision

Xcode允许头文件(可以在构建时自动生成,而不能在vcs自身中生成)提供在构建时将在info.plist中扩展的值。您可以在自动修订网站上找到设置此设置的演练。

自动修订具有针对这些类型头文件的输出类型,可以在这些情况下提供帮助。


1
Autorevision似乎没有按照要求增加内部版本号?
trojanfoe

假设仅在新提交的基础上进行构建,那么VCS_NUM您应该在其中寻找(请参见autorevision.h示例)。
dak180 2013年

Vienna-Info.plistVienna-All.xcconfig是一个很好的示例,说明了如何在任何xcode项目中进行设置。
dak180

4

这些解决方案中的一些问题是Launch Services仅识别捆绑软件版本中的四个五位数。我有一个内部版本号为数千的项目,因此我想使用一些不太重要的数字。

该Perl脚本会增加项目中的所有Info.plists,而不仅仅是当前目标的Info.plists,因此内部版本号都保持同步。它还使用一个补丁数字和两个小数字,因此版本1234的版本为1234。我将其用作预构建行为,因此它适用于我构建的所有项目。

该脚本是蛮力的,但是对我有用。

#!/usr/bin/perl

use strict;
use warnings;
use v5.12.0;

use Dir::Iterate;

for my $plist_file(grepdir { /-Info.plist$/ } '.') {
    my $build = `/usr/libexec/PlistBuddy -c "Print CFBundleVersion" '$plist_file'`;
    chomp $build;

    next unless $build;

    # Strip dots
    $build =~ s/\.//g;
    $build =~ s/^0//g;

    # Increment
    $build++;

    # Re-insert dots
    $build =~ s/^(\d{0,4}?) (\d{0,2}?) (\d{0,1}?)$/$1.$2.$3/x;

    # Insert zeroes
    $build =~ s{(^|\.)\.}{${1}0.}g;

    system qq(/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build" '$plist_file');
}

您引用的帖子指出' 有效地,LS期望采用以下格式:nnnnn [.nn [.nn]] [X]其中n是数字0-9,方括号表示可选组件,而X是不是字符串以数字开头。X出现时将被忽略。'-因此为99999。对于大多数项目来说应该足够了。
2014年

@杰伊,我显然误读为四位数。哎呀。(不过,如果您的开发风格涉及大量的调整和重建,那么在一个项目上进行了多年的开发后,您可以达到100,000个版本并非不可想象。)
Brent Royal-Gordon

@ BrentRoyal-Gordon True-我已经调整了构建脚本以仅针对发行版配置增加构建。.即使我使用了10年以上的传统产品,即使我可能从未达到过1万次构建,也确实感觉很好新可可项目的头部空间负载;-)
杰伊

4

您可以使用Apple的通用版本控制。基本上,您要做的就是agvtool next-version -all从托管.xcproj文件的目录中调用。有关更多详细信息,请查看上面的网址。


3
该解决方案的问题在于,从项目中的脚本内调用agvtool将取消您的构建。除非您能找到解决方法,否则这不是一个好的解决方案。
Dan Loewenherz

3

Wil Gieseler的解决方案的基础上,我只想做一个更改。他的解决方案将git commits的数量放入内部版本号。有用,但要找到创建该构建的实际提交仍然有些困难。我不太在乎内部版本号是否单调增加,因此我放弃了这一要求,以便可以更轻松地访问生成给定二进制文件的提交。

为此,我将他的第一个脚本修改为以下内容:

# Set the build number to the decimal conversion of the short version of the current git SHA

# Get the short version of the current git SHA in hexadecimal
SHA=$(git rev-parse --short @)
# Uppercase any alphabetic chars in SHA (bc doesn't like lowercase hex numbers)
UPPERCASE_SHA=$(tr '[:lower:]' '[:upper:]' <<< "$SHA")
# Use bc to convert the uppercase SHA from hex to decimal
BUILD_NUM=$(bc <<< "ibase=16;obase=A;$UPPERCASE_SHA")
# Set our build number to that
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUM" "${PROJECT_DIR}/${INFOPLIST_FILE}"

# To convert a build number back to a usable git SHA, run the following, substituting the build number for <build number>
# bc <<< "ibase=10;obase=16;<build number>"

这会将当前git SHA的简短版本转换为十进制。十六进制字符不能很好地满足Apple的内部版本号要求,这就是为什么我必须这样做。要将其转换回去,您只需运行以下命令:

SHA=$(bc <<< "ibase=10;obase=16;<build number>")

在bash中,<build number>您从二进制文件获得的内部版本号在哪里。然后,运行git checkout $SHA,然后就可以了。

如上所述,由于这是Wil Gieseler解决方案的改编,因此,您还需要以下构建后脚本:

# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"

保持您的git历史记录整洁。


那么,如果您将git信息写入Info.plist,而git本身会跟踪git的信息,那么该方法又如何工作呢?
trojanfoe 2015年

@trojanfoe正如我在答案顶部提到的那样,该答案是Wil Gieseler解决方案的改编。因此,它需要使用与此处相同的构建后脚本。我已将其明确添加到答案中。
拉夫隆

2

我尝试了修改后的过程,但没有成功,因为:-

  1. Xcode 4.2.1更改.xcodeproj中的xcuserdata子目录

  2. git记录了Project-Info.plist中的先前更改

以下修改使这些内容被忽略,仅标记真正的更改:

if [ -n "$(find $dir \! -path "*xcuserdata*" \! -path "*.git" -newer $plist)" ]; then

2

您可能只想在存档时执行此操作(例如,上传到TF)。否则,您的版本号可能会很快上升。

在方案(产品/编辑方案/存档/预操作)中,您可以添加仅在存档时才执行的脚本。

另外,您可能希望每次增加应用程序版本时都重置内部版本号。

最后,如果您改用存档,则可以安全地禁用:

# if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
...
# else
    # echo "Not incrementing build number as source files have not changed"
# fi

因为仅当您存档时内部版本号才会增加...

编辑:更正我所说的内容,存档中的预操作会在构建后(但在存档之前)发生,因此构建号将为下一个存档增加。但是您可以创建一个新方案,并在构建中添加此操作(操作)部分。并在要创建新版本时使用此方案


1
是的,它正在迅速上升(目前为5500+),但这对我来说不是问题。这只是一个数字。有趣的是Cmd-B / Cmd-R多少次被击中甚至什么都没有起作用……
trojanfoe12年

2

我使用最新的SVN版本作为内部版本号。如果在构建目录中更改Info.plist,则不会影响源Info.plist:

# use the last SVN revision as the build number:
Info_plist="$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Info.plist"
defaults write "${Info_plist}" CFBundleVersion `svn stat -u | awk '/'"Status against revision:"'/ {print $4}'`

2

我觉得自己找到了我的部落。部落,希望您对VersionX感到满意。

十年前,当我在一个包含25个Xcode项目的工作区中工作时,如果您只维护一个或两个偶尔更新的项目,那么我借此机会使版本自动化并构建字符串更新到某种程度的荒谬。

版本X:

  • 知道构建类型(发布/调试)
  • 在构建时从存储库收集信息(包括git支持,但是可以针对hg,svn或您使用的任何对象进行自定义)
  • 提供了易于定制的高级营销版本字符串(在App Store实施约定之前,版本会有更多变化),因此您可以使用git标签约定自动增加包含“ beta”符号的字符串。
  • 包括一个用实例变量填充的类,该实例变量包含版本和提交信息。这对于填充“关于”面板以及使用预填充信息构造日志记录字符串,崩溃报告或用户电子邮件错误报告很有用。

制作很有趣。我了解了有关Xcode构建系统的内容。

这是一个精美的版本和版本字符串可以自动生成的构建字符串的示例。

版本X 1.0.1β7(c5959a3“清洁”)

市场版本: VersionX 1.0.1β7“ 1.0.1是从提交的标记派生的,而“ Beta 7”是由提交计数或构建计数自动生成的(例如)。

构建版本:(c5959a3“清除”)显示短提交哈希,并通知您该构建目录的未提交更改为零。

VersionX(来自GitHub的源代码)-一个巴洛克式系统,用于自动递增版本并在Xcode项目中构建字符串。

VersionX文档。



1

build number通过以下方法进行更新。

$INFO_FILE是plist文件的路径。并且$build_number是此建筑物的新内部编号。

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_number" "${INFO_FILE}"

通常,我$build_number是由majorminor部分组成。该minor是从何而来的项目信息。因此,我描述了如何生成major零件。

## Composed by `major` and `minor`. 
## `minor` is parsed from project information. It's another story.
## Examples: `21.1`, or `21.1.3`
build_number="${major_number}.${minor_number}"

我有两种策略来决定$build_number

首要策略

这种策略使用git tag次数来决定majorbuild number。如果有53项目标签,它将返回53通过以下shell脚本。

通常,它正在增加。并且它将迫使开发人员在发布之前放置一个git标签。

major_number=$(git tag -l | wc -l | grep -oE "\d+")

第二策略

詹金斯 CI系统决定major部分。它具有一个环境变量BUILD_NUMBER。在CI系统上构建时,它会自动增加。此信息对于在CI系统上跟踪项目历史很有用。

major_number=${BUILD_NUMBER}

1

这是更新的版本。从Xcode 9.3.1,iOS 11开始可以使用。

从您的应用程序目标中单击“构建阶段”,单击+图标以添加新的运行脚本,然后在框中粘贴此代码。

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

进入Info.plist文件,然后将“捆绑软件版本”设置为1,并将“捆绑软件版本字符串,short”设置为1,则应进行设置。

在视图中构建带有Info.plist的项目,您应该看到捆绑软件版本(内部版本号)发生变化。

  • 请注意,从Xcode 9.3.1开始,您将无法从“常规”选项卡中看到这些更改,但是在存档构建时以及在Info.plist中将看到这些更改。

0

这是我的解决方案。如果您像我一样:终端友好,如ruby,如语义版本控制,请尝试一下。

制作一个Rakefile包含以下内容的文件:

require "xcodeproj"
require "versionomy"

XCODEPROJECT = "MyProject.xcodeproj"
INFOPLISTFILE = "MyProject/MyProject-Info.plist"

$UPDATES = [:major,:minor,:tiny]
$UPDATES.each { |part|
  desc "increment #{part} part of version"
  task "increment:#{part}" do |task|
    version=`/usr/libexec/Plistbuddy -c "Print CFBundleVersion" #{INFOPLISTFILE}`.chomp
    version=Versionomy.parse(version)
    version=version.bump(part)

    # I use the same string for CFBundleVersion and CFBundleShortVersionString for now
    `/usr/libexec/PlistBuddy -c "Set :CFBundleVersion #{version}" #{INFOPLISTFILE}`
    `/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString #{version}" #{INFOPLISTFILE}`
    print "version upgraded to #{version}\n"
  end
}

准备: gem install xcodeproj versionomy

运行:rake increment:majorrake increment:minorrake increment:tiny随时随地。


0

我发现使用agvtool自动化版本和内部版本号最方便。

试试这个:

  1. 按照上面链接的Apple文档中的说明进行配置。
  2. 脚本作为预操作添加到项目->编辑方案...->存档(如果需要,还可以添加其他脚本
  3. 设置:从以下位置提供构建设置 <your_app_target>

脚本(第一行是可选的):

exec > ${PROJECT_DIR}/prebuild.log 2>&1
cd ${PROJECT_DIR}
xcrun agvtool next-version -all
cd -

0

让我们以苹果自己的方式做到这一点。每次成功构建后,它将增加内部版本号

我将指导您浏览5张图片,只需仔细阅读即可。

  1. 当您选择位于Stop_build_button右侧的项目名称时,从下拉列表中选择“ Edit Scheme ...”。 检查第一步

  2. 从左侧菜单中展开“构建”选项,然后选择“后操作”。 检查第二步

  3. 在这里,您可以添加成功构建程序后要执行的所需代码(脚本)。在这里,我们必须添加少量代码以使我们的自动化完美运行。>> 1.从左侧选择“添加(+)”按钮以添加新的脚本文件>> 2.现在从下拉菜单中选择“新建运行脚本操作”,然后 单击“第三步”。

  4. 它具有3个字段>> 1.已经为您分配了外壳程序>> 2.现在用于“从中提供构建设置”选择您的项目名称。>> 3.有一个很大的字段可添加您的脚本,只需将代码复制并粘贴到此处即可:检查第四步

    PLIST =“ $ {PROJECT_DIR} / $ {INFOPLIST_FILE}” PLB = / usr / libexec / PlistBuddy LAST_NUMBER = $($ PLB -c“ Print CFBundleVersion”“ $ PLIST”)NEW_VERSION = $((($ LAST_NUMBER + 1))$ PLB -c“设置:CFBundleVersion $ NEW_VERSION”“ $ PLIST”

  5. 完成第4步后,只需选择“关闭”以关闭窗口,我们就要做最后一步,在“项目”文件菜单中转到“ plist.info”文件,并确保“键”部分下的“捆绑版本”键包含最多数值检查第五步

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.