빌드 번호를 늘리는 더 좋은 방법은 무엇입니까?


133

plist 파일 내에서 빌드 번호를 늘리기 위해 Xcode 빌드 프로세스의 일부로 쉘 스크립트를 사용하고 있지만 Xcode 4.2.1이 자주 충돌합니다 (프로젝트에 속하지 않은 대상에 대한 오류와 함께); plist 파일 의 변경은 Xcode를 혼란스럽게합니다).

쉘 스크립트는 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
관심있는 사람은 다음과 같습니다. 10 진수 대신 16 진수를 사용하도록 스크립트를 약간 수정했습니다.- gist.github.com
Sascha

1
이 스크립트는 사전 빌드 조치로 직접 추가 할 수 있으며 외부 스크립트를 호출 할 필요가 없습니다. 빌드 단계에서이 스크립트를 실행하지 마십시오. Xcode는 다른 빌드마다 업데이트 된 plist 만 복사합니다.
Ed McManus

3
기본적으로 "permission denied"오류가 발생하여이 Q & A가 동일한 경험을 가진 다른 사람을 가리키고 있다고 생각했습니다. stackoverflow.com/q/9850936/519030
Jason

이 스크립트는 종료 코드 1로 실패합니다. 누구든지 도와 줄 수 있습니까?
Robert J. Clegg

@Tander plist 파일을 스크립트의 인수로 제공하지 않는 것 같습니다.
trojanfoe 2014

답변:


29

질문을 올바르게 이해하면 Project-Info.plistXcode의 표준 프로젝트 템플릿의 일부인 파일 을 수정하고 싶 습니까?

내가 묻는 이유는 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 파일을 작성하고 필요한 경우 자원에 포함시킬 수 있습니다. 그런 다음 번들에서 읽을 수 있습니다.

정보 창 및 기타 위치에 버전을 표시해야하는 경우 설정 CFBundleGetInfoString및을 살펴볼 수도 있습니다 CFBundleShortVersionString.


plist 파일 에 git commit (또는 tag)이 필요하지 않으므로 간단한 증가 시스템이 훌륭 agvtool하지만 (제공 된 것처럼 ) 빌드 중에 plist 를 수정하면 Xcode가 자주 중단됩니다 (스크립트를 제거했기 때문에) 3 빌드마다 충돌 할 때 t 충돌 한 번). 버전 정보를 다른 plist 파일에 넣고 번들에 포함되어 있고 앱에서 액세스 할 수 있습니까?
trojanfoe

훌륭한 대본- 아카이브를 보관할 때만 사용하도록 Hugues BR 의 제안 과 함께 사용하는 것이 좋습니다. 숫자를 낮게 유지하고 릴리스 간 많은 개발 빌드가 수행됩니다.
Jay

5
get_build_number는 무엇입니까? 그냥 자리 표시 자일까요?
chrisp

예, get_build_number단지 자리 표시 자입니다. 명확하게 답변을 업데이트했습니다.
Monolo

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 파일이 변경되지 않습니다.

내가이 방법을 좋아하는 이유 :

  • 쉬운
  • 힘내 버전 기록을 오염시키지 않습니다
  • CFBundleVersion은 완전 자동입니다
  • 예쁜 버전 번호는 내가 원할 때마다 수정할 수 있습니다

버전 제어 plist 파일에서 버전 번호를 유지하는 것이 가장 좋은 방법입니다. 특히 릴리스 당 Brach가 있고 때로는 병합하거나 체리 픽해야하는 경우에 그러합니다. 감사!
Matthew Phillips

14
git rev-list --count HEAD대신에 사용할 수 있습니다 git rev-list HEAD | wc -l | tr -d ' '.
kennytm

흠. fastlane다음과 같은 방법으로 자동 빌드를 업로드 하는 경우 다음 오류가 발생합니다. 오류 ITMS-90058 : "이 번들은 유효하지 않습니다. Info.plist 파일에서 CFBundleVersion [DEVELOPMENT] 키 값은 마침표로 구분 된 목록이어야합니다. 음수가 아닌 3 개의 정수입니다. "
fatuhoku

1
정확히 어디로 가야할지 잘 모르겠습니다. 첫 번째 스크립트를 첫 번째 빌드 단계로, 마지막 스크립트를 마지막 빌드 단계로 설정하면 효과가 있습니다.
Wil Gieseler

1
이 솔루션을 사용하여 Info.plist를 커밋 할 수 있습니다. 이것이 요점입니다. Info.plist는 항상 버전 번호가 "DEVELOPMENT"로 설정된 상태로 설정되고 체크인되며, 빌드 프로세스 중에 일시적으로 변경된 후 나중에 "DEVELOPMENT"로 다시 설정되므로 Info.plist는 안정적입니다.
Wil Gieseler 2016 년

38

나는이 반짝임을 사용했다. 예상대로 작동합니다. 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

XCode 5 : 편집기 (메뉴 막대) → 빌드 단계 추가 → 복사 파일 추가 빌드 단계 :
Jonny

@trojanfoe :이 스크립트를 post commit hook으로 실행할 수 있습니다. 이 시나리오에서는 코드를 리 포지션 할 때만 빌드 번호가 증가합니다. LostInTheTrees에서 아래 답변은 당신이하고 싶은 더 많은 것입니다.
Alix

@Alix가 링크 한 쉘 스크립트는 이제 여기에 게시 된 것과 다릅니다. 아카이브 빌드를 수행 할 때만 빌드 번호를 늘리려면 위의 Alix 스크립트를 기반으로 만든 gist를 사용할 수 있습니다. 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

어떤 방법이 가장 좋은지 모르겠지만, 누군가가 그것을 검색하는 경우를 대비하여 Apple의 답변을 게시 할 것입니다 ...

Apple의 Q & A 게시물 에 따르면 :

agvtool을 사용하여 버전 및 빌드 번호 자동화

버전 및 빌드 번호 키는 각각 애플리케이션의 마케팅 및 내부 버전을 지정합니다. agvtool은 이러한 숫자를 다음으로 높은 숫자 또는 특정 숫자로 자동 증가시킬 수있는 명령 줄 도구입니다.

빌드 번호는 응용 프로그램의 출시 또는 출시되지 않은 버전을 식별합니다. 응용 프로그램의 Info.plist에 CFBundleVersion(번들 버전) 으로 저장됩니다 .

Xcode 프로젝트에서 다음 단계를 완료해야합니다.

  1. agvtool 사용

대상의 빌드 설정 분할 창으로 이동 한 후 다음과 같이 모든 빌드 구성에 대해 업데이트하십시오.

  • 현재 프로젝트 버전을 선택한 값으로 설정하십시오.

Xcode 프로젝트 데이터 파일 project.pbxproj에는 CURRENT_PROJECT_VERSION프로젝트의 현재 버전을 지정 하는 (현재 프로젝트 버전) 빌드 설정이 포함되어 있습니다. agvtool은 project.pbxproj를 검색합니다 CURRENT_PROJECT_VERSION. CURRENT_PROJECT_VERSION존재 하는 경우 계속 실행 하고 실행을 중지합니다. 값은 빌드 번호를 업데이트하는 데 사용됩니다.

  • 버전 관리 시스템을 Apple Generic으로 설정하십시오.

기본적으로 Xcode는 버전 관리 시스템을 사용하지 않습니다. 버전 관리 시스템을 Apple Generic으로 설정하면 Xcode가 프로젝트에 모든 agvtool 생성 버전 정보를 포함하게합니다.

버전 관리 시스템을 Apple Generic으로 설정

  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

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"과 같은 형식의 문자열입니까?
chrisp

1
마지막으로 누군가가 올바르게하고 :) 왜 내 dev 장치에서 실행되는 각각의 모든 빌드에 관심이 있습니까? 릴리스 (및 테스터 릴리스)는 "음, 왼쪽으로 2px 이동"빌드가 아니라 카운트입니다.
Uvesten April

7

스크립트 주셔서 감사합니다. 잘 작동합니다.

내 Info.plist는 공백이 포함 된 이름의 하위 디렉토리에 있으므로 plist 경로 주위에 따옴표로 실행 스크립트를 수정해야했습니다.

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

셸 스크립트와 같은 방식으로 모든 경로를 따옴표로 묶습니다.

#!/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

이 답변을 보면 몇 시간을 저축했을 것입니다! 또한 빌드 번호에는 소수점이 없어야합니다. 그렇지 않으면 BASH가 중단됩니다.
Brenden

6

현재 사용중인 스크립트는 위 의 Alix를 기반으로 합니다. 아래의 내 적응은 릴리스 / 아카이브 빌드에서 자동 증가 만 수행하는 확인을 추가합니다.

이러한 변경이 없으면 각 개발자가 고유 한 속도로 빌드 번호를 증가 시키므로 버전 제어 충돌이 발생합니다. 그리고 git history가 불필요하게 빌드 번호가 항상 변경되어 불필요하게 오염된다는 사실.

# 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

자동 수정 사용을 권장합니다 .

Xcode는 info.plist에서 확장 될 값을 제공 할 수 있도록 헤더 파일 (빌드 타임 자체에서 자동 생성 될 수 있고 자동으로 생성 될 수 있음)을 허용합니다. 자동 수정 웹 사이트 에서이를 설정하기위한 연습을 찾을 수 있습니다 .

자동 수정에는 이러한 상황 헤더 파일에 맞춰진 출력 유형이 있습니다.


1
Autorevision필요에 따라 빌드 번호가 충돌하지 않는 것으로 보입니까?
trojanfoe

하나만 새로운 커밋을 빌드한다고 가정하면 VCS_NUM찾고있는 것이어야합니다 ( 예제 참조autorevision.h ).
dak180

Vienna-Info.plistVienna-All.xcconfig 는 xcode 프로젝트에서이를 설정할 수있는 좋은 예입니다.
dak180

4

이러한 솔루션 중 일부의 문제점은 Launch Services 가 번들 버전에서 4 개의 5 자리 숫자 만 인식한다는 것 입니다. 수천 개의 빌드 번호가있는 프로젝트가 있으므로 덜 중요한 숫자 중 일부를 사용하고 싶었습니다.

이 Perl 스크립트는 현재 대상에 대한 것만이 아니라 프로젝트의 모든 Info.plists를 증가 시키므로 빌드 번호는 모두 잠금 단계로 유지됩니다. 또한 패치 자리 하나와 부 자리 숫자 두 개를 사용하므로 빌드 1234에는 버전 1.23.4가 제공됩니다. 빌드 전 동작으로 사용하므로 빌드 한 모든 프로젝트에 적용됩니다.

대본은 꽤 무차별 적이지만 저에게는 효과적입니다.

#!/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 빌드입니다. 대부분의 프로젝트에 충분해야합니까?
Jay

@Jay 나는 분명히 그것을 네 자리로 잘못 읽었습니다. 죄송합니다. (개발 스타일의 조정과 재건을 많이 포함 그래도, 만약, 당신이 10 만 프로젝트에 대한 개발의 년 후에 빌드에 도달 할 수 있다고 생각할 수 없습니다.)
브렌트 로얄 - 고든

@ BrentRoyal-Gordon True-릴리스 구성에 대해서만 빌드를 늘리기 위해 빌드 스크립트를 조정했습니다. 10 년 이상의 레거시 제품을 사용해도 10k 빌드 근처에 도달 한 적이 없더라도 좋은 느낌이 듭니다. 새로운 코코아 프로젝트로 헤드 룸의 부하 ;-)
Jay

4

Apple의 일반 버전 관리를 사용할 수 있습니다 . 기본적으로 agvtool next-version -all.xcproj 파일을 호스팅하는 디렉토리 내에서 호출 하면됩니다. 자세한 내용은 위의 URL을 확인하십시오.


3
이 솔루션의 문제점은 프로젝트의 스크립트 내에서 agvtool을 호출하면 빌드가 취소된다는 것입니다. 이에 대한 해결 방법을 찾을 수 없다면 좋은 해결책이 아닙니다.
Dan Loewenherz

3

바탕 윌 Gieseler의 솔루션 , 내가 만들고 싶어 한 변화가 있었다. 그의 솔루션은 git commit의 수를 빌드 번호에 넣습니다. 유용하지만 여전히 그 빌드를 만든 실제 커밋을 찾는 데 어려움이 있습니다. 빌드 번호가 단조 증가했는지 여부는별로 신경 쓰지 않았으므로 주어진 바이너리를 생성하는 커밋에 더 쉽게 액세스 할 수 있도록 요구 사항을 삭제했습니다.

이를 위해 첫 번째 스크립트를 다음과 같이 수정했습니다.

# 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의 짧은 버전을 10 진수로 변환합니다. 16 진수 문자는 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 history를 깨끗하게 유지합니다.


그래서 git info가에 기록 될 때 어떻게 작동 Info.plist합니까? 그 자체는 git에 의해 추적됩니까?
trojanfoe

@trojanfoe 답변 맨 위에서 언급했듯이이 답변은 Wil Gieseler의 솔루션에 대한 적응입니다. 따라서 동일한 빌드 후 스크립트가 필요합니다. 나는 그것을 대답에 명시 적으로 추가했습니다.
ravron

2

수정 된 절차를 시도했지만 작동하지 않았습니다.

  1. Xcode 4.2.1은 .xcodeproj의 xcuserdata 하위 디렉토리를 변경합니다

  2. 자식은 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이 작동하기 전에 몇 번이나 맞았는지는 흥미 롭습니다.
trojanfoe

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가 즐거우 셨기를 바랍니다.

10 년 전에 25 개가 넘는 Xcode 프로젝트가있는 작업 공간에서 작업하는 동안 가끔 업데이트를 통해 프로젝트를 유지 관리하는 경우 버전을 자동화하고 문자열 업데이트를 부조리하게 보일 수있는 기회를 얻었습니다.

VersionX :

  • 빌드 유형을 알고 있습니다 (릴리스 / 디버그)
  • 리포지토리에서 빌드시 정보를 수집합니다 (git 지원 포함, hg, svn 또는 사용하는 용도에 따라 사용자 정의 가능)
  • 쉽게 사용자 정의 할 수있는 고급 마케팅 버전 문자열 (App Store에서 규칙을 부과하기 전에 훨씬 더 변형 된)을 제공하므로 git 태그 규칙을 사용하여 "베타"에 대한 기호가 포함 된 문자열을 자동으로 증가시킬 수 있습니다.
  • 버전 및 커밋 정보를 포함하는 인스턴스 변수로 채워진 클래스를 포함합니다. 이는 정보 패널을 채우고 미리 채워진 정보로 로깅 문자열, 충돌 보고서 또는 사용자 이메일 버그 보고서를 구성하는 데 유용합니다.

만드는 것이 재미있었습니다. Xcode 빌드 시스템에 대한 보트로드를 배웠습니다.

다음은 VersionX가 자동으로 생성 할 수있는 멋진 버전 및 빌드 문자열 유형의 예입니다.

VersionX 1.0.1 β7 (c5959a3“청결”)

마케팅 버전 : VersionX 1.0.1 β7 "1.0.1은 커밋에 대한 태그에서 파생 된 반면"Beta 7 "은 커밋 수 또는 빌드 수 (예 :)에 의해 자동으로 생성됩니다.

빌드 버전 : (c5959a3“Clean”) 짧은 커밋 해시를 표시하고 빌드 디렉토리에 커밋되지 않은 변경 사항이 없음을 알려줍니다.

VersionX (GitHub의 소스)-Xcode 프로젝트에서 버전 및 빌드 문자열을 자동으로 증가시키기위한 바로크 시스템입니다.

VersionX 설명서



1

build number다음과 같은 방법으로 갱신 합니다.

$INFO_FILEplist 파일의 경로입니다. 그리고 $build_number이 건물에 대한 새로운 빌드 번호입니다.

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

일반적으로, 내 $build_numberIS는 작곡 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결정하는 계수 major의를 build number. 53프로젝트의 태그가 있으면 53다음 셸 스크립트로 반환 됩니다.

일반적으로 증가하고 있습니다. 그리고 개발자가 게시하기 전에 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

여기 내 해결책이 있습니다. 당신이 나 같은 경우 : 의미 버전 관리와 같이 루비처럼 터미널 친화적입니다.

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:major하거나 rake increment:minor또는 rake 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의 오른쪽에있는 프로젝트 이름을 선택할 때 드롭 다운에서 '구성표 편집 ...'을 선택하십시오. 첫 단계 확인

  2. leftSide 메뉴에서 'Build'옵션을 확장하고 'Post-actions'를 선택 하십시오.

  3. 여기에 프로그램을 성공적으로 빌드 한 후 실행할 원하는 코드 (스크립트)를 추가 할 수 있습니다. 자동화가 완벽하게 작동하도록 약간의 코드를 추가해야하는 곳입니다. >> 1. 새 스크립트 파일을 추가하려면 왼쪽에서 '추가 (+)'버튼을 선택하십시오 >> 2. 이제 드롭 다운에서 '새 스크립트 실행 동작'을 선택 하십시오.

  4. 여기에는 3 개의 필드가 있습니다. 1. 1. 셸이 이미 할당되어 있습니다 >> 2. 이제 '설정을 제공하십시오'에 대한 프로젝트 이름을 선택하십시오. >> 3. 스크립트를 추가 할 수있는 큰 필드가 있습니다.이 코드를 복사하여 붙여 넣으십시오. Check Fourth Step

    PLIST = "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}"PLB = / usr / libexec / PlistBuddy LAST_NUMBER = $ ($ PLB -c "CFBundleVersion 인쇄" "$ PLIST") NEW_VERSION = $ (($ LAST_NUMBER + 1)) $ PLB -c "설정 : CFBundleVersion $ NEW_VERSION" "$ PLIST"

  5. 네 번째 단계를 완료 한 후 '닫기'를 선택하면 창을 닫고 마지막 단계를 수행해야합니다. 프로젝트 파일 메뉴에서 'plist.info'파일로 이동하여 '키'섹션에서 '번들 버전'키가 가장 많이 포함되어 있는지 확인하십시오 숫자 값 확인 다섯 번째 단계

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.