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.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 파일을 작성하고 필요한 경우 자원에 포함시킬 수 있습니다. 그런 다음 번들에서 읽을 수 있습니다.
정보 창 및 기타 위치에 버전을 표시해야하는 경우 설정 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 프로젝트에서 다음 단계를 완료해야합니다.
- agvtool 사용
대상의 빌드 설정 분할 창으로 이동 한 후 다음과 같이 모든 빌드 구성에 대해 업데이트하십시오.
- 현재 프로젝트 버전을 선택한 값으로 설정하십시오.
Xcode 프로젝트 데이터 파일 project.pbxproj에는 CURRENT_PROJECT_VERSION
프로젝트의 현재 버전을 지정 하는 (현재 프로젝트 버전) 빌드 설정이 포함되어 있습니다. agvtool은 project.pbxproj를 검색합니다 CURRENT_PROJECT_VERSION
. CURRENT_PROJECT_VERSION
존재 하는 경우 계속 실행 하고 실행을 중지합니다. 값은 빌드 번호를 업데이트하는 데 사용됩니다.
- 버전 관리 시스템을 Apple Generic으로 설정하십시오.
기본적으로 Xcode는 버전 관리 시스템을 사용하지 않습니다. 버전 관리 시스템을 Apple Generic으로 설정하면 Xcode가 프로젝트에 모든 agvtool 생성 버전 정보를 포함하게합니다.
- 버전 설정 및 빌드 번호
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