[xcode11] Xcode 11이 CFBundleVersion 및 CFBundleShortVersionString을 $ (CURRENT_PROJECT_VERSION) 및 $ (MARKETING_VERSION)으로 변경하지 못하게하는 방법은 무엇입니까?

버전 11 이후, 엑스 코드 내 설정 CFBundleVersion에 가치를 $(CURRENT_PROJECT_VERSION)CFBundleShortVersionString값으로 $(MARKETING_VERSION)내가 목표 설정 (탭 “일반”)의 버전이나 빌드 값을 입력 할 때마다.

입력 한 실제 버전 및 빌드 값은 이제 project.pbxproj 파일에 저장됩니다. 쉘 스크립트를 사용하여 빌드 타임에 값을 수정하기 때문에이 동작을 원하지 않거나 좋아하지 않습니다.

Info.plist 파일에서 올바른 값을 수동으로 설정할 수 있지만 대상 설정에서 버전 또는 빌드 번호를 변경하자마자 Info.plist 파일이 Xcode에 의해 다시 변경됩니다.

Xcode 11 이이 작업을 수행하지 못하게하려면 어떻게합니까?

프로젝트 파일 자체를 변경하기 위해 빌드 스크립트를 수정하면 프로젝트 파일이 변경되는 즉시 Xcode가 빌드를 즉시 취소합니다.



답변

지금까지의 길

내 유스 케이스는 다음과 같습니다.

  1. 버전을 동기화하고 여러 대상에서 번호를 작성하고 있습니다.
  2. 버전을 동기화하고 대상의 버전과 빌드 번호를 Settigns.bundle
  3. CI 서버에서 빌드 번호를 읽고 수정하고 있습니다.

이전에는 대상 빌드 스크립트로 포인트 1과 2를 실행하고 CI 자체에서 사용자 정의 스크립트로 포인트 3을 실행했습니다.

Xcode 빌드 설정 내에 버전 및 빌드를 저장하는 새로운 방법은 더 이상 값을 효과적으로 수정할 수 없기 때문에 스크립트에 문제를 일으켰습니다. 최소한 읽을 수있었습니다.

불행히도 Xcode가 버전 및 빌드 번호를 프로젝트 빌드 설정에 저장하지 못하게하는 합법적 인 방법을 발견 할 수 없었지만 해결 방법을 만들었습니다.

빌드 또는 아카이브가 작성되면에 쓰여진 값 Info.plist이 사용됩니다. 즉, 빌드 시간 동안 값이 대체되므로 동일한 빌드 시간 동안 값을 수정할 수 없습니다.

또한 xcodeprojcli를 사용하여 프로젝트를 수정하려고 시도했지만 프로젝트 변경으로 인해 빌드가 중지 되어이 솔루션이 작동하지 않았습니다.

결국, 내가 시도한 많은 다른 접근법 후에 마침내 Xcode의 새로운 행동을 위반하지 않는 타협을 찾았습니다.

짧은 답변:

타겟이 액션을 미리 같이, 스크립트는 상기 각각의 값을 기록하는 실행 CFBundleShortVersionStringCFBundleVersion타겟으로의Info.plist

진리의 근원으로, 나는의 값을 읽기 위해 엑스 코드 빌드 설정을 사용 MARKETING_VERSION하고 CURRENT_PROJECT_VERSION원하는 대상의합니다.

이런 방식으로 프로젝트 설정에서 값을 수정하면 (다음 빌드 / 아카이브시) Info.plist기존 스크립팅 로직이 계속 작동하는 경우이를 허용합니다.

자세한 답변

빌드 조치시 자원을 수정하는 유일한 방법은 pre-action스크립트를 사용하는 것 입니다. 빌드 스크립트에서 수행하려고하면 변경 사항이 즉시 적용되지 않으며 빌드 / 아카이브 끝에 표시되지 않습니다.

사전 빌드 조치를 추가하려면 구성표 편집으로 이동하십시오.

여기에 이미지 설명을 입력하십시오

그런 다음 빌드 및 아카이브 섹션을 펼치십시오. 에서 드롭 다운을 Pre-action클릭 Provide build and settings from하고 값을 읽으려는 진리의 대상을 선택하십시오.

여기에 이미지 설명을 입력하십시오

다음 스크립트를 추가하십시오.

# 1)
cd ${PROJECT_DIR}

# 2)
exec > Pruvit-Int.prebuild.sync_project_version_and_build_with_info_plists.log 2>&1

# 3)
./sync_project_version_and_build_with_info_plists.sh $MARKETING_VERSION $CURRENT_PROJECT_VERSION

스크립 라인은 다음을 수행합니다.

  1. 실행하기 위해 동기화 스크립트가있는 디렉토리로 이동하십시오.
  2. 사전 조치 중에 로그를 쓸 수 있습니다. 그렇지 않으면 기본적으로 모든 출력이 침묵됩니다.
  3. 제공하여 동기화 스크립트를 실행 MARKETING_VERSIONCURRENT_PROJECT_VERSION

마지막 단계는 제공된 값 MARKETING_VERSIONCURRENT_PROJECT_VERSION해당 대상 및 원하는 때마다 값을 읽는 고유 한 동기화 스크립트를 작성하는 것입니다.

필자의 경우 스크립트는 다음과 같습니다.

#!/bin/bash

#IMPORTANT - this script must run as pre-action of each target's Build and Archive actions

version_number=$1
build_number=$2

echo "version_number is $version_number"
echo "build_number is $build_number"

#update Pruvit/Info.plist
pruvitInfoPlist="Pruvit/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $pruvitInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $pruvitInfoPlist

#update Pruvit/Settings.bundle
settingsPlist="Pruvit/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version_number" $settingsPlist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $build_number" $settingsPlist

#update BadgeCounter/Info.plist
badgeCounterInfoPlist="BadgeCounter/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $badgeCounterInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $badgeCounterInfoPlist

공유 Info.plistSettings.bundle두 앱 대상 사이를 사용 하므로 한 번 업데이트해야합니다.

또한 알림 서비스 확장을 사용합니다.이 서비스 BadgeCounter는 정확히 동일한 버전이어야하며 포함 된 대상과 빌드해야합니다. 그래서 이것도 업데이트합니다.


답변

하지마

이 동작이 변경된 이유가있을 수 있습니다. 나중에 Xcode 기능이이 동작을 기반으로하면 상황이 점점 더 “구축”됩니다.

Xcode를 구부리지 말고 빌드 스크립트가 이러한 값을 검색하는 방법을 변경하십시오.

Xcode 11에서 현재 앱 버전을 스크립트로 읽는 방법

project.pbxproj파일 을 조작해야하는 경우 잘 문서화 된 다음 스타일 plist입니다. plistbuddy이 이전 형식과 호환되는 것을 사용할 수 있습니다 . awk더 복잡한 조작이있는 경우 더 많은 스크립팅과 함께 사용할 수도 있습니다 .

유스 케이스를 이해하면와 함께 가장 높은 버전 번호를 얻은 awk다음 파일에서 찾을 수있는 모든 더 낮은 버전 번호를 업데이트 하는 스크립트를 작성할 수 있습니다 sed.


답변