개요
이번 프로젝트를 하면서 유난히 Github에서 .xcodeproj 파일로 인해 PR Merge 이후 develop 브랜치에서 팀원마다 프로젝트 파일에 대한 문제가 지속적으로 생겼다. 분명 Merge를 할 때 conflict를 다 처리를 했는데도 지속적으로 이러한 문제가 생겼다.
그래서 이번 포스팅을 통해서 대체 왜 프로젝트 파일이 충돌되는지, 앞으로 어떻게 처리할 것인지에 대해서 다뤄볼까 한다.
.xcodeproj 파일
우리가 프로젝트를 만들면 친절하게 Xcode에서는 프로젝트 파일을 생성해 준다. 아마 Github로 Swift 프로젝트를 관리해보신 경험이 있으시다면 아시겠지만, 해당 프로젝트 파일을 깊게 보시면 자주 문제를 일으키는 어떤 파일을 볼 수 있다. 바로 .pbxproj 파일이다.
.pbxproj 파일
해당 파일은 매우 다양한 역할을 갖고 있었으며, 역할에 대한 내용은 아래와 같다.
- 프로젝트 설정: 컴파일러 설정, 링커 옵션, 개발 환경 설정 등 프로젝트 전반의 구성을 정의
- 타깃 설정: App, Library, Test target 등 빌드 타깃에 대한 설정을 지님
- 파일 참조: 프로젝트에 포함된 소소 코드, 리소스 파일, 라이브러리 등의 파일 경로와 관계를 관리
- 빌드 단계: 소스 코드 컴파일, 리소스 복사, 스크립트 실행 등 빌드 프로세스의 각 단계를 정의
.pbproj 파일은 Key-Value 형태로 되어 있다. 다양한 UUID를 사용하여 프로젝트의 각 구성 요소를 참조하고, 그 값이 .pbproj에 나열된다.
일반적인 상황에서 이 파일의 관리는 Xcode에서 자동적으로 해준다. 하지만 우리는 가끔 이 파일을 수동적으로 관리해야 된다. 그럴때는 UUID의 순서가 옳게 위치했는지 확인을 해야된다.
이런 내용을 알고나서 현재 진행중인 프로젝트에서 일어나는 파일 충돌 문제에 대하여 몇가지 이유를 유추를 해보았다. UUID의 순서가 근본적인 문제이고, 이를 발생시키는 여러가지 이유에는
- merge conflict를 잘못 처리
- Xcode 버전 호환성
- git 설정 문제
첫번째 경우였다면 팀원 모두에게 동일 증상이어야 된다 생각했고, 3번의 경우도 잘못된 설정이 없었다. 그렇다면 2번이 가장 큰 요인이지 않을까 싶으며 이와 관련된 부분을 좀 더 조사해 보았다.
Xcode의 버전은 무슨 관련이 있는건가
Xcode의 버전이 바뀌면서 문제가 될 수 있는것이 무엇일까. 바로 호환성이다. 호환성 문제에는 여러 가지가 있다.
- 빌드 설정의 호환성: 새로운 Xcode 버전은 새로운 API, 빌드 설정을 도입할 수 있고, 이전 버전은 인식하지 못할 수 있다.
- 프로젝트 포맷과 파일 구조: Xcode는 버전이 업데이트될 때 내부적인 파일 포맷이나 프로젝트 구조를 변경할 수 있다 한다. 그렇기에 다른 버전의 Xcode를 사용한다면 이 파일을 올바르게 해석하지 못할 수 있다.
- 사용되는 특성 및 속성: 새로운 Xcode 버전은 때때로 새로운 프로젝트 속성이나 설정을 추가한다. 이런 부분은 전 버전의 Xcode에서 호환되지 않을 수 있다.
이렇게 Xcode의 버전은 협업에서 프로젝트 파일을 관리하는데 있어서 무시할 수 없는 요소이다. Xcode 버전 호환성 문제를 해결하기 위해서는
- 팀 내 Xcode 버전 통일
- 변경사항이 Xcode 호환성에 문제가 없는지 검토
이와 같은 부분을 고려해야 된다.
앞으로 어떻게 관리할것인가
지속적으로 팀 간 Xcode버전을 관리하고, 다들 섬세하게 .xcodeproj의 merge conflict를 잘하기로 결정했다!... 는 무슨
이런식으로 관리를 해야되는 환경은 개발에 방해되는 환경이라 생각했다. 그렇기에 프로젝트 환경을 관리해주는 툴을 써야겠다 생각했다.
많이 찾아볼 수 있는 프로젝트 관리 툴은 세가지(Xunique, XcodeGen, Tuist)가 있었다. 각각의 툴에는 여러 장단이 있긴 하지만, 우리의 환경에 적합한 툴을 쓰는것이 가장 중요했다. 아마 사용중에 있는 패키지 방식(Cocoapods, SPM, ...)도 중요하고, 팀원들이 사용할 수 있는 언어에 대해서도 중요하게 생각했다.
우리는 이 셋 중 프로젝트 환경에 적합하고, Swift 언어로 관리 환경을 확인할 수 있는 Tuist가 도입하기 적합하다 생각했고 Tuist를 이용하여 프로젝트 관리할 예정이다.
끝내며
사실 프로젝트 충돌을 해결하기 위해 프로젝트 관리 툴을 쓰면 해결된다, .gitattribute를 merge=union하면 된다 등등 말은 해주지만 어디가 어떻게 문제인지 알고 적용을 하는것과 "아 그렇다네"하며 적용하는 것은 큰 차이라 생각하기에 이렇게 알아보게 됐다.
이번에 문제를 해결하기 위해 찾아본 것들을 포스팅하면서 협업시 생기는 문제, 프로젝트 파일의 관리 방식, 트러블이 발생할 수 있는 부분에 대해서 좀 더 세밀하게 알아볼 수 있었고, 프로젝트 관리 툴을 사용하는 이유에 대해서 알 수 있었다.