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

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 스크립트를 사용하여 이런 종류의 작업을 수행합니다 . 잘 문서화되어 있지 않지만 해결하기가 어렵지 않아야합니다. 보너스로이 리포지토리에는 타사 라이브러리를 자동으로 앱 번들로 묶는 유용한 스크립트도 포함되어 있습니다.



답변

질문을 올바르게 이해하면 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.


답변

나는이 질문에 대한 많은 답변을 엉망으로 만들었으며 그중 어느 것도 나를 만족시키지 못했습니다. 그러나 나는 마침내 내가 정말로 좋아하는 혼합물을 생각해 냈습니다!

빌드 단계의 시작과 끝에 하나씩 두 단계가 있습니다.

처음에 :

# 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은 완전 자동입니다
  • 예쁜 버전 번호는 내가 원할 때마다 수정할 수 있습니다

답변

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


답변

이 전체 항목은 매우 도움이되었습니다. 이 트릭을 사용했지만 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


답변

어떤 방법이 가장 좋은지 모르겠지만, 누군가가 그것을 검색하는 경우를 대비하여 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


답변

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;


답변

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

내 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