티스토리 뷰

반응형


안녕하세요 :) Zedd입니다.

오늘은! 여러가지를 알아볼건데요. 제가 지금 Build Configuration을 추가하는 작업을 하고 있는데, 음..그러니까 Build Configuration의 정확한 정의를 모르겠는거에요.

아무튼 Build Configuration을 공부하다가, 지금 제가 굉장히..근본적인 개념을 잘 모른다고 판단했고, 이 글을 쓰게 되었습니다!


Xcode에는 여러가지 개념들이 있는데요, 



Project, Target..


또, Scheme


암튼 굉장히 복잡하다면 복잡한 구조를 가지고 있습니다.

오늘 각각 이게 뭘 의미하는지 공부해보려고합니다.


애플에서 친절하게도! 이것들을 설명한 링크가 있습니다. 

https://developer.apple.com/library/archive/featuredarticles/XcodeConcepts


그냥 이걸보면서 공부할거에요.

제가 쪼끔 추가하면서..

순서는 위 링크와 동일하게 설명할게요!

먼저 Target입니다.



Target



"A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace."

ㅋㅋ..

일단 간단하게 Target이 뭔지 말하자면, 

Xcode에서 Build를 실행하여 생성되는 최종 제품(?)(end product)입니다. 

여기서 말하는 최종제품은 앱이 될 수도 있고, 프레임워크가 될 수도 있고, Unit Test번들일 수도 있어요. 

예제를 한번 봅시다.



위 프로젝트는 RxSwift 프로젝트의 RxExample인데, Target에 보면, 저렇게 최종제품으로 앱이 있는 것을 볼 수 있습니다.

Unit Test번들도 있네요.

프레임워크도 볼까요? 


제가 얼마전에 만든 Framework.



여기서 보면, Target이 프레임워크인 것을 볼 수 있습니다.


감이오시나요? 


Target은 또 하나의 특징이 있는데, 

프로젝트에는 하나 이상의 Target이 포함 될 수 있으며, 각 Target은 하나의 제품(one product)을 생성합니다. 



자 이렇게 하나의 프로젝트안에 여러개의 Target이 있는 것을 볼 수 있죠?



Target이 뭔지 정말 감만 잡은거고, 이제 위에서 잠깐 언급했던

"A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace."를 보도록 할게요.

Target은 빌드 할 제품(product)를 지정하며, Project 또는 workspace안에 있는 파일 set에서, product를 build하기 위한 instructions을 포함합니다.

영어반 한글반.......
번역하기 애매해서 그냥 씀
하나씩 봅시다.

Target은 빌드 할 제품(product)를 지정하며 
이건 우리가 위에서 잠깐 본 그런 내용 같네요.

Project 또는 workspace안에 있는 파일 set에서, product를 build하기 위한 instructions을 포함합니다. 
여기서 핵심은 "instructions을 포함한다"..같죠?

해당 product를 빌드하는데 필요한 input을 빌드시스템(소스파일과 그 소스파일을 처리하는 명령(instructions))으로 구성됩니다. 
ㅋㅋㅋ아니 뭐라느거야

더 봅시다....
product building instructions은 Xcode Project Editor에서 볼 수 있는데요,
그것이..!!


Target > Build Setting, Phases의 형태로 있습니다. 얘네들이 사실은 instructions인거죠. 
이렇게 script도 instructions에 포함..


여기까지 이해가 가셨죠? 계속하겠습니다. 

Target은 Project build setting을 상속받습니다. 

자 여기서
"Target은 Project build setting을 상속"


자 아까는 우리가 Target에서 Build Setting이 있는 것을 봤는데, Project를 클릭하니까 또 Build Setting이 있는 것을 볼 수 있네요.

그러니까 Target은 기본적으로 Project Build Setting을 상속받습니다.

하지만, Target level에서 다른 설정을 지정함으로써 Project Setting을 Override할 수 있습니다. 


한번에 하나의 active Target만 있을 수 있으며, Xcode Scheme은 active target을 지정합니다.

우리가 아직 Scheme의 정의에 대해서 잘 모르잖아요? 그러니까 이건 이따가..


계속하겠습니다. 이까지 이해는 가시죠?

애플이 그렇다는거 머 어쩌겠음


"A target and the product it creates can be related to another target."

target은 어떤 제품(product)를 생성한다고 그랬죠?

target이 생성하는 제품이, 또 다른 target과 관련될 수 있습니다.

target(A)이 build하기 위해서 다른 target(B)의 output을 필요로 하는 경우에, 

A Target은 B Target에 의존한다고 합니다.


아무튼 이런경우가 있을거 아니에요?

Xcode는 이런 두 target이, 그러니까 A랑 B가 같은 workspace안에 있는 경우, 

Xcode가 알아서 이러한 dependency(종속성)을 발견한다고 해요. 

그리고 이러한 경우, Xcode는 알아서!!! 필요한 순서대로 product를 build한다고 합니다!!!!!!!

이러한 관계를 implicit dependency(암묵적인..종속성..?)라고 한대요.


build Setting에서 명시적으로(explicit. 위에서 나온 implicit와 반대죠?) target 종속성들을 지정할 수 있으며, 

Xcode가 implicit dependency을 가질것으로 예상 할 수 있는 두개의 target이 실제로는 종속되지 않았음을 지정할 수도 있대요.

오아ㅏㅏㅏㅏㅏㅏㅏ신기해


애플이 예를 하나 들어줬는데요, 같은 workspace안에서 / 해당 라이브러리에 대해 링크되는 라이브러리와 / 앱을 / 둘 다 빌드 할 수 있어요. 

Xcode는 이 관계를 발견하고, 자동으로 라이브러리를 먼저 빌드합니다. 하지만 만약에 실제로 workspace에 내장된 라이브러리 버전이 아닌, 다른 버전의 라이브러리와 링크되길 원한다면, 이 implicit dependency을 대체하는 explicit dependency를 build setting에서 만들면 되겠죠.

ㅇㅋ?


자 여기까지가 Target에 대한 내용이 끝인데요, Target을 공부하고 나서 저는 궁금증이 들었어요 

음..그러니까 제가 지금 개발중인 서비스가 dev, inhouse, production이렇게 configuration이 나눠져있는데, 

악 그러니까...보통 이렇게 앱을 나눈다고 표현해야하나..? 암튼 이렇게 할때는 configuration을 사용하고, target은 사용 안한다고.......암튼 그렇게 들었거든요? 

근데 물론 target으로 나눌수도 있어요. 근데 그게 권장되지않는다라고 지인이 말해줬어요.....

dev, inhouse, production나눌때는 configuration을 써야하ㄴ.....

암튼!!! 근데 그러니까 제가 target을 공부하고 느낀점은, 



패브릭의 구조상 build phases에 script를 추가해야하는데, 

내가 만약에 dev는 패브릭을 적용 안하고싶고 production만 패브릭을 적용하고 싶다고 할게요.

그럼 이게 target에 instructions으로 들어가는거잖아요.

그럼 target마다 이 instructions이 다른거고, 즉 target으로 dev, inhouse, production을 나누는게 더 직관적이지 않나? 라는 생각을 했어요.

그러니까 dev target은 이 패브릭 스크립트가 없고, production target은 패브릭 스크립트가 있는거죠.


그래서 target으로 나누는게 더 직관적인데? 라고 생각했어요. 그러니까 딱 제 경우에서요!! dev에서는 패브릭을 적용 안하고싶은데, production에서는 적용하고싶을 때!! 이 경우에는 target이 더 직관적이지 않나?라고 생각했어요. 이해가심..?

실제로 https://www.appcoda.com/using-xcode-targets/ target으로 나누는 사람도 있음. 


근데 패브릭에 가보면, dev, inhouse, production 이렇게 나눠져서 그 크래쉬리틱스가 잘 들어오고 있는거에요!!!!!!!!!!!! 지금 target이 같고..configuration이 다른건데, 어떻게 다르게 들어올 수 있ㅈㅣ? 패브릭 key가 똑같은데 어떻게......


해서 알고봤더니 패브릭은 bundle identifier로 구분해서 그게 가능했던거 ㅎ

그럼 run script를 dev에는 적용안하고 production에만 적용할려면 어떻게 해야하는거지..?

아무튼 제가 지금 말한걸 이해 못하시는 분들이 많으실거같은데, 제 지인만 이소리를 이해할듯...zz


제가 든 궁금증이 이해가 안간다면 그냥 패스해주세요. :D


만약 이해가 간다면, 제 궁금증에 댓글을 달아주세요.

Q : target으로 나누는거랑 configuration이랑 나누는거랑 뭐가 다른건지? 어떤게 베스트인건지? 그렇다면 그 이유는?

Q : configuration으로 나눴다고 했을 때, run script를 나눠서 하고싶으면 어떻게해야하는것인가?


제가 잘 몰라서 너무 어이없는 질문일수도 있...고 이 글을 다 쓰게 되면 정답을 알게 될지도?!

제 질문은 정답을 알려달라는게 아니고, 실제로 target으로 나누는 사람도 있고 configuration으로 나누는 사람도 있..는거 같아요. 


근데 사실 결과는 동일한거 같거든요?



출처 : https://www.appcoda.com/using-xcode-targets/


타겟으로 추가해도 이렇게 나오고..제가 개발하는 서비스는 config로 되어있는데 저렇게 똑같이 나오거든요 선택할 수 있게.


아~~~~~~~~~~~zzzzz지금 지인이랑 이야기하다가 답을 안것 같읍니다...


음..그러니까 제 궁금증을 다 지워야 하나 고민하다가 그냥 놔두기로 했어요. 저랑 똑같은 궁금증을 가지고 있을수도 있으니...제가 궁금증이 생긴 궁극적인 이유(?)라고 해야하나 그 근본부터가 잘못됐어요.

그러니까 target으로 나눈 결과와 configuration으로 나눈 결과가 같다! 얘네를 쓰려는 목적이 같다!!! 라고 제가 전제하고 있어서 이런 오해(?)가 생긴 것 같아요.


결과적으로 말하면 target와 configuration은 (제가 지금 안 바로는) 목적이 다릅니다!

configuration은 하나의 target에 대해, 다른 버전의 앱을 만들 수 있는거죠. 다른 버전이라 함은 위에서 말한 dev, inhouse, production.

그러니까 여기서 핵심은 하나의 target에 대해 configuration을 여러개 만들 수 있는겁니다.

그럼 target은 모냐? 



제 지인이 예를 들어주신게 해외 UI인데요, 내가 국내와는 다른 UI로 해외앱을 내고싶다! 했을 때 이 target을 쓰는거라고 해주셨어요. 또, 무료버전 / 유료버전 구분할때도!!

그러니까 


1. Target을 하나 만들고 == end product가 하나 더 만들어지는거. (app이 만들어짐)

2. 파일 생성 


자 파일을 최종으로 생성하려면 아래 그림이 나옵니다. 



위 그림의 하단에 보시면, Target을 설정할 수 있는 부분이 나옵니다. 

여기서 내 target을 설정해서 이 파일은 어느 target. 즉 프로덕트의 파일이 될거라는걸 명시해줄 수 있는것이죠.


제 궁금증은 진짜루 패스하셔도 됩니다..

Q : configuration으로 나눴다고 했을 때, run script를 나눠서 하고싶으면 어떻게해야하는것인가?

만 궁금해졌네요. 


Target만 공부했는데도...이 개념을 왜....왜..이제서야 안거지...? 싶네요.....

이런걸 제일 먼저 알았어야 하는건ㄷ ㅔ...

Target까지 하고 일단 발행할게요. 글이 엄청나게 길어질듯한 느낌이 드네요.

그럼 마지막으로 궁금증 하나....말하고 가겠습니다.


Q : target으로 해외용앱/국내용앱(또는 무료버전/유료버전)을 만들었다고 했을 때, 배포는 어떻게 되는건가요?..제가 뭐 나라를 나눠서 올려본적이 없어서..



출처: https://www.raywenderlich.com/2404-how-to-create-both-a-paid-and-lite-version-of-an-iphone-app

위 그림에서 볼 수 있다시피 결과적으로 앱이 2개가 생기는거잖아요?..그러면 2번올리나요?.. (해외UI를 다르게 한다고 했을 때) 하나는 한국 하나는 외국으로 지정해서 올리는건가요? 궁금해....


Project도 이어서 공부하도록 할게요. 오늘은 여기까지..


Project



Xcode Project는 모든 파일, 리소스, 하나이상의 software를 빌드하는데 필요한 정보의 repository(저장소)입니다. 

프로젝트에는 product를 만드는 데 사용되는 모든 요소가 포함되어 있으며, 해당 요소간의 관계(relationships)가 유지됩니다.

프로젝트는 product를 build하는 방법을 명시하는 target을 하나 이상 포함합니다.

프로젝트는 프로젝트의 모든 target에 대한 기본 build setting을 정의합니다.(위에서 봤죠?)

(각 target은 프로젝트 build setting을 무시하는 자체 build setting을 가질 수 있습니다.)


Xcode 프로젝트 파일에는 다음정보가 들어있습니다. 

- 소스파일에 대한 참조(reference) 

     - 헤더파일 및 구현파일을 포함한 소스코드

Libraries와 frameworks, internal 그리고 external Resource files

- 이미지 파일

- interface Bilder(nib) 파일


- structure navigator에서 소스파일을 구성하는데 사용되는 그룹

- Project-level build configuration. 프로젝트에대해, 둘 이상의 build configuration을 지정할 수 있습니다. 예를들어, 프로젝트의 Debug 및 release build setting이 있을 수 있습니다.

음 이부분이 조금 의외(?)네요. 저는 target당..build configuration이 만들어진다고 이해했는데, 프로젝트 단위였나..?뭐지..?


- 각 target이 지정하는 target(?)

- 프로젝트로 인해 build된 하나의 product에 대한 참조.

- 해당 product를 빌드하는데 필요한 소스파일에 대한 참조

     - 다른 target 및 기타 setting에 대한 종속성(dependencies)을 포함하여 해당 product를 빌드하는데 사용 할 수 있는 build configuration. Project-level의 build setting은 target이 이를 override하지 않을 때 사용됩니다. 


- 프로그램을 디버깅 하거나 테스트 하는데 사용 할 수 있는 실행가능한 환경(executable environment ). 각 실행환경은 다음을 지정합니다.

   - Xcode에서 실행하거나 디버깅 할 때 실행할 실행파일.

   - 실행파일에 전달할 Command-line arguments(있는 경우에만)

   - 프로그램이 실행될 때 설정되는 환경 변수(있는 경우에만)


Project는 독립형(stand alone)이거나 workspace안에 포함될 수 있습니다.

Xcode scheme을 사용하여 주어진 시간에 활성화(active)되는 대상, build configuration 및 executable configuration를 지정할 수 있습니다. 



Build Settings 



 Build Setting은 product 빌드 프로세스의 특정 측면(? particular aspect)을 수행하는 방법에 대한 정보가 들어있는 변수입니다.

예를들어, build setting의 정보는 Xcode가 컴파일러에 전달하는 옵션을 지정할 수 있습니다.


project 또는 target level에서 build setting을 지정 할 수 있습니다. 각 Project-level build setting은 특정 target에 대한 build setting에 의해 명시적으로 override되지 않는 한 모든 target에 적용됩니다. (아~~~~~~~~~~답 나와버렸죠?)


각 target은 하나의 product를 만드는데 필요한 원본 파일을 구성합니다.

build configuration은 특정 방식으로 target product를 빌드하는데 사용되는 build setting set을 지정합니다.

예를들어, product의 Debug 및 Release 빌드에 대해 별도의 build configuration을 갖는것이 일반적입니다.


Xcode의 build setting은 setting title과 setting definition, 두 부분으로 구성됩니다.

setting title은 build setting을 식별하며, 다른 setting내에서 사용될 수 있습니다. build setting definition는 상수이거나 Xcode가 빌드시, build setting의 값을 결정하는데 사용하는 수식(formula)입니다. 


title...? definition..? 그게 어딨단 말이여

확실한건 아닌데!!! 제가 생각해보건데,, 이 왼쪽에 “title”이 setting title이고, 오른쪽에 값들이 definition이 아닐까..하는...추측을...해봅니다...



build setting에는 Xcode user interface에서 build setting을 표시하는데 사용되는 display name도 포함 될 수 있습니다. 

프로젝트 템플릿에서 새 프로젝를 만들 때, Xcode에서 제공하는 기본 build setting외에도, Project 또는 특정 target에 대한 사용자 정의 build setting을 만들 수 있습니다. 조건부(specify conditional) build setting을 지정 할 수도 있습니다. 조건부 build setting의 값은 하나 이상의 선행 조건이 충족되는지 여부에 따라 다릅니다. 예를들어, 이 매커니즘을 사용하면 target architecture를 기반으로, product를 빌드하는데 사용할 SDK를 지정할수도 있습니다. 

반응형

'공부' 카테고리의 다른 글

Xcode Build Configuration 설정하기  (2) 2019.03.21
Multiple Project 만드는 법  (2) 2019.03.20
Git submodule써보기 + 삭제하는 법.  (0) 2019.03.16
Why use Rx?  (4) 2019.03.06
Premiere Pro 기초 ) 자막넣기  (3) 2019.02.22