developer tip

Xcode의 빌드 구성에 따라 조건부로 파일을 포함하려면 어떻게해야합니까?

copycodes 2020. 10. 26. 08:08
반응형

Xcode의 빌드 구성에 따라 조건부로 파일을 포함하려면 어떻게해야합니까?


Ad-hoc 및 디버그 구성에서 빌드 된 앱에 대한 설정 번들을 포함하고 싶은 대상이 많은 Xcode 프로젝트가 있지만 릴리스 구성에는 포함되지 않습니다.

빌드 단계는 구성에 대한 조건부로 만드는 것을 허용하지 않는 것 같습니다 (분명히 대상에 대한 조건부 일 수 있지만 프로젝트의 대상 수를 두 배로 늘리면 완전히 사용할 수 없게됩니다).

그러면 사용자 지정 빌드 규칙이 작성됩니다. 내 계획은 모든 대상에서 Settings.bundle을 제외하고이를 제품 패키지에 조건부로 복사하는 빌드 규칙을 만드는 것이지만 적용 가능한 예제는 찾기가 정말 어렵습니다.

내가 시작한 빌드 규칙에는 "이름이 일치하는 소스 파일 :"으로 설정된 프로세스 설정과 이름으로 Settings.bundle이 설정되어 있습니다. 사용 설정은 "사용자 지정 스크립트 :"입니다.

내 사용자 지정 스크립트는 다음과 같습니다 (내 bash 스크립트가화물 컬트 수준에 있다는 경고 포함).

if [${CONFIGURATION} = 'Debug'] then
    cp -r ${INPUT_FILE_PATH} ${DERIVED_FILES_DIR}/.
fi

마지막으로 ${DERIVED_FILES_DIR}/Settings.bundle출력 파일로 나열했습니다.

내가 여기 있기 때문에 작동하지 않는 것이 분명합니다. 내 첫 번째 질문은 1) 실제로 실행되고 있는지 2) 어딘가에 어리석은 구문 오류가 없는지 확인하기 위해 실행으로 빌드 규칙의 출력을 볼 수있는 어딘가에 있는지 여부입니다.

또한 출력을 복사 할 적절한 위치 (환경 변수 형식)는 무엇입니까?


나는 마침내 그것을 알아 냈습니다.

설정 번들을 조건부로 포함하려는 각 대상에 대해 소스 목록에서 해당 프로젝트를 선택하고 대상을 선택한 다음 "Build Phases"탭으로 전환합니다.

"Add Build Phase"버튼을 클릭하고 "Add Run Script"를 선택합니다.

그런 다음 스크립트에 다음을 입력하십시오.

if [ "${CONFIGURATION}" == "Debug" ]; then
    cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app"
fi

이 질문에 대한 답변이 이미 있다는 것을 알고 있으며 그 답변은 저에게 매우 도움이되었지만 저만의 수정 된 솔루션도 거기에 던지고 싶었습니다.

내 요구 사항은 릴리스에 포함하지 않는 것이 아니라 다른 빌드 구성에 대해 다른 설정 번들을 갖는 것이 었습니다. 디버그릴리스 구성 만 단순한 접근 방식이라고 가정하면 다음 과 같은 방법을 사용할 수 있습니다.

프로젝트에이 개 설정 번들을 추가라는 이름으로 시작 Settings-debug.bundle하고 Settings-release.bundle다음에서 이러한 파일을 제거 복사 번들 리소스 빌드 단계. 다음 SETTINGS_BUNDLE으로 각 구성에 대해 서로 다른 값을 가진 사용자 정의 빌드 설정을 추가 합니다.

Debug        ${PROJECT_DIR}/relative/path/to/Settings-debug.bundle
Release      ${PROJECT_DIR}/relative/path/to/Settings-release.bundle

다음 으로 Frank의 솔루션에서 수정 된 버전의 스크립트와 함께 Copy Settings Bundle 이라는 실행 스크립트 빌드 단계 ( Copy Bundle Resources 이후)를 추가합니다 .

cp -r "${SETTINGS_BUNDLE}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle"

여기서 차이점은 복사 된 번들의 이름은 소스 이름에 관계없이 항상 Settings.bundle 이라는 것입니다.

그런 다음 설정 번들에만 변경 사항이있을 때 코드 서명 오류를 방지하기 위해 다른 빌드 단계 스크립트를 추가해야합니다. 모든 빌드에서 코드 서명 단계가 발생하도록합니다. 이것은 실행해야합니다 전에 컴파일 소스 파일 빌드 단계. 저는 Force Codesign 이라고 불렀습니다 .

touch "${PROJECT_DIR}/relative/path/to/main.m"

준수 된 소스의 경우 문서화가 잘되지 않은 사용자 정의 빌드 설정을 추가 할 수 있습니다. 파일을 컴파일에서 제외하고 포함 할 수 있습니다.

대상의 빌드 설정으로 이동> + 버튼 탭> 사용자 정의 설정 추가

키는 INCLUDED_SOURCE_FILE_NAMES또는EXCLUDED_SOURCE_FILE_NAMES

값은 공백으로 구분 된 파일 경로 목록입니다.

참조 : http://lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html


Settings.bundle은 릴리스 또는 디버그 구성에 관계없이 항상 대상 영역에 복사됩니다. 따라서 다음 코드가 필요할 수 있습니다.

if [ ${CONFIGURATION} == "Release" ]; then
    rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle
fi

나는 쉘 스크립트 전문가는 아니지만 대괄호와 조건 사이에 공백이 필요하다고 생각합니다. 또한 변수를 인용하면 도움이 될 수 있습니다.

if [ "${CONFIGURATION}" = "Debug" ] then
    cp -r "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}"/.
fi

위치 "$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME"는 OS X 앱 번들의 루트로 사용 합니다.


( Xcode 9.3으로 테스트 됨 )

Xcode에이 기능이 포함 된시기를 찾을 수 없지만 EXCLUDED_SOURCE_FILE_NAMES이제 Build Settings > Build Options > Excluded Source File Names.

따라서 더 이상 User-Defined Setting.

아래 참조 : enter image description here

이 줄을 .pbxproj.enter image description here

참고 URL : https://stackoverflow.com/questions/8496476/how-can-i-conditionally-include-a-file-based-on-build-configuration-in-xcode

반응형