Xcode : 소스 코드를 직접 수정하는 모든 빌드 전에 스크립트 실행
제가 한:
나는 스크립트가 있습니다
- 일부 구성 파일을 읽고 소스 코드 스 니펫 생성
- 관련 Objective-C 소스 파일을 찾고
- 소스 코드의 일부를 1 단계에서 생성 된 코드로 바꿉니다.
특정 타임 스탬프 파일을 메이크 대상으로하고 구성 파일을 대상 소스로하는 메이크 파일 :
SRC = $(shell find ../config -iname "*.txt")
STAMP = $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME).stamp
$(STAMP): $(SRC)
python inject.py
touch $(STAMP)
이 Makefile을 프로젝트 대상의 빌드 단계 스택 맨 위에 "Run Script Build Phase"로 추가했습니다.
어떻게 된 거예요:
스크립트 빌드 단계는 소스를 컴파일하기 전에 실행되었습니다.
그러나 스크립트는 실행 중에 소스 코드를 수정하므로 최신 버전의 빌드 제품을 얻으려면 두 번 빌드해야했습니다 . 내가 상상하는 일은 다음과 같습니다.
- 첫 번째 실행 : Xcode가 종속성 정보 수집 ---> 변경 사항 없음
- 첫 번째 실행 : Xcode는 "Run Script Build Phase"를 실행합니다. ---> 소스가 Xcode의 뒤에서 변경됩니다.
- 첫 번째 실행 : Xcode가 빌드를 완료하고 업데이트 할 필요가 없다고 생각합니다.
- 두 번째 실행 : Xcode는 종속성 정보를 수집합니다 ---> 소스가 변경되었습니다. 다시 빌드해야합니다!
- 두 번째 실행 : Xcode는 Run Script Build Phase를 실행합니다. "---> 모든 것이 최신 상태입니다.
- 두 번째 실행 : Xcode가 컴파일을 진행합니다.
Build Phases에 대한 Xcode 문서를 읽은 후 스크립트가 "Run Script Build Phases"의 출력으로 실행될 때마다 업데이트되는 것으로 알려진 소스 파일을 추가하려고했지만 아무것도 변경되지 않았습니다. 내 프로젝트에서 구성 파일의 수가 다를 수 있으므로 모든 입력 및 출력 파일을 지정하고 싶지 않습니다.
질문:
"스크립트 빌드 단계 실행"중에 변경된 소스 파일을 Xcode에서 어떻게 인식합니까?
편집하다:
- 스크립트 빌드 단계를 다른 빌드 단계보다 먼저 배치했음을 추가했습니다.
지금까지 언급 된 모든 기술은 과잉입니다. 가시성을 위해 steve kim 의 설명을 재현 :
빌드 단계 탭에서 "스크립트 실행"단계를 더 높은 위치 (예 : "소스 컴파일"앞)로 드래그하기 만하면됩니다.
XCode 6에서 테스트 됨
이 솔루션은 아마도 구식 일 것입니다. 대신 더 높은 투표 답변을 참조하십시오.
"외부 대상"사용 :
- 메뉴에서 "Project"> "New Target ..."을 선택합니다.
- "Mac OS X"> "기타"> "외부 대상"을 선택하고 프로젝트에 추가합니다.
- 설정을 열고 스크립트 설정을 입력하십시오.
- 기본 대상 설정의 "일반"탭을 열고 직접 종속성으로 새 대상을 추가하십시오.
이제 새로운 "외부 대상"이 주 대상이 종속성 정보 수집을 시작 하기 전에 실행 되므로 스크립트 실행 중 변경된 사항이 빌드에 포함되어야합니다.
별도의 대상이 필요하지 않은 약간 더 간단한 또 다른 옵션이 있지만 스크립트가 매번 동일한 소스 파일을 수정하는 경향이있는 경우에만 실행 가능합니다.
먼저, Xcode가 대상 앱에 반영된 특정 변경 사항을 확인하기 위해 때때로 두 번 빌드 (또는 깨끗한 빌드를 수행)해야하는 이유에 대해 혼란스러워하는 사람을위한 간략한 설명입니다. Xcode는 생성 한 객체 파일이 없거나 객체 파일의 마지막 수정 날짜가 소스 파일의 마지막 수정 날짜가 첫 번째 빌드 단계의 시작일 때보 다 이전 인 경우 소스 파일을 컴파일합니다 . 프로젝트가 사전 컴파일 빌드 단계에서 소스 파일을 수정하는 스크립트를 실행하는 경우 Xcode는 소스 파일의 마지막 수정 날짜가 변경되었음을 인식하지 못하므로 다시 컴파일하지 않아도됩니다. 프로젝트를 두 번째 빌드 할 때만 Xcode가 날짜 변경을 인식하고 파일을 다시 컴파일합니다.
스크립트가 매번 동일한 소스 파일을 수정하는 경우 간단한 해결책이 있습니다. 다음 과 같이 빌드 프로세스 끝에 Run Script 빌드 단계 를 추가하기 만하면됩니다 .
touch Classes/FirstModifiedFile.m Classes/SecondModifiedFile.m
exit $?
touch
빌드 프로세스가 끝날 때 이러한 소스 파일에서 실행 하면 항상 개체 파일보다 마지막으로 수정 된 날짜가 더 늦게 유지되므로 Xcode는 매번 다시 컴파일합니다.
Xcode 4부터는 생성 된 파일을 빌드 단계의 출력 섹션에 추가하면 해당 설정이 적용되고 ... has been modified since the precompiled header was built
오류 메시지가 생성되지 않는 것처럼 보입니다 .
이것은 스크립트가 매번 소수의 파일 만 생성하는 경우 좋은 옵션입니다.
나는 이것으로 오랫동안 고생했다. 대답은 ento의 "External Target"솔루션을 사용하는 것입니다. 그는이 문제가 발생하는 이유와 실제로 사용하는 방법입니다.
Xcode4 빌드 단계는 plist가 컴파일 될 때까지 실행되지 않습니다. 물론 이것은 plist를 수정하는 사전 빌드 단계가 적용되지 않기 때문에 어리석은 일입니다. 그러나 그것에 대해 생각해 보면 실제로 NEXT 빌드에 적용됩니다. 그래서 일부 사람들은 plist 값의 "캐싱"또는 "작동하려면 2 개의 빌드를 수행해야합니다."라고 말했습니다. 무슨 일이 일어나면 plist가 빌드되고 스크립트가 실행됩니다. 다음에 빌드 할 때 plist는 수정 된 파일을 사용하여 빌드되므로 두 번째 빌드가됩니다.
ento의 솔루션은 실제로 실제 구축 전 단계를 수행하는 한 가지 방법입니다. 불행히도 나는 깨끗한 빌드없이 plist가 업데이트되지 않는다는 것을 발견했고 그것을 고쳤습니다. plist에 데이터 기반 사용자 값이있는 방법은 다음과 같습니다.
- Python 스크립트를 가리키고 일부 인수를 전달하는 외부 빌드 시스템 프로젝트 추가
- 빌드에 사용자 정의 빌드 설정을 추가합니다. 이것들은 당신이 파이썬에 전달하는 인자입니다
- Python 스크립트는 일부 입력 JSON 파일을 읽고 plist 전 처리기 헤더 파일을 빌드하고 기본 앱 plist를 터치합니다.
- 주 프로젝트에는 "preprocess plist files"가 켜져 있고이 전 처리기 파일을 가리 킵니다.
Using touch on the main app plist file causes the main target to generate the plist every time. The reason we pass in build settings as parameters is so our command-line build can override settings:
- Add a user-defined variable "foo" to the prebuild project.
- In your prebuild you can use $(foo) to pass the value into the python script.
- On the command-line you can add foo=test to pass in a new value.
The python script uses base settings files and allows for user-defined settings files to override the defaults. You make a change and immediately it ends up in the plist. We only use this for settings that MUST be in the plist. For anything else it's a waste of effort....generate a json file or something similar instead and load it at run-time :)
I hope this helps...it's been a couple rough days figuring this out.
ReferenceURL : https://stackoverflow.com/questions/976454/xcode-running-a-script-before-every-build-that-modifies-source-code-directly
'Development Tip' 카테고리의 다른 글
Dockerfile에서 WORKDIR의 요점은 무엇입니까? (0) | 2020.12.29 |
---|---|
다른 div 내에서 두 div를 가로로 배치하는 방법 (0) | 2020.12.29 |
Document 개체에서 Window 개체를 가져 오는 방법은 무엇입니까? (0) | 2020.12.29 |
DROP… CREATE 대 ALTER (0) | 2020.12.29 |
JavaScript를 사용하여 F5 및 브라우저 새로 고침 비활성화 (0) | 2020.12.29 |