이 페이지에서는 Bazel을 사용하여 Xcode 프로젝트를 빌드하거나 테스트하는 방법을 설명합니다. Xcode와 Bazel의 차이점을 설명하고 Xcode 프로젝트를 Bazel 프로젝트로 변환하는 단계를 제공합니다. 또한 일반적인 오류를 해결하기 위한 문제 해결 솔루션을 제공합니다.
Xcode와 Bazel의 차이점
Bazel에서는 모든 빌드 대상과 종속 항목, 그리고 빌드 규칙을 통해 상응하는 빌드 설정을 명시적으로 지정해야 합니다.
Bazel에서는 프로젝트가 종속되는 모든 파일이 작업공간 디렉터리 내에 있거나
MODULE.bazel파일에 종속 항목으로 지정되어 있어야 합니다.Bazel을 사용하여 Xcode 프로젝트를 빌드할 때
BUILD파일이 신뢰할 수 있는 소스가 됩니다. Xcode에서 프로젝트를 작업하는 경우BUILD파일과 일치하는 새 버전의 Xcode 프로젝트를 rules_xcodeproj를 사용하여BUILD파일을 업데이트할 때마다 생성해야 합니다. 대상에 종속 항목을 추가하는 것과 같은BUILD파일의 특정 변경사항은 프로젝트를 재생성할 필요가 없으므로 개발 속도를 높일 수 있습니다. Xcode를 사용하지 않는 경우bazel build및bazel test명령어는 이 가이드의 뒷부분에 설명된 특정 제한사항이 있는 빌드 및 테스트 기능을 제공합니다.
시작하기 전에
시작하기 전에 다음을 수행합니다.
Bazel을 설치하지 않았다면 설치합니다.
Bazel 및 그 개념에 익숙하지 않다면 iOS 앱 튜토리얼을 완료하세요.
MODULE.bazel및BUILD파일을 비롯한 Bazel 작업공간과 대상, 빌드 규칙, Bazel 패키지의 개념을 이해해야 합니다.프로젝트의 종속 항목을 분석하고 이해합니다.
프로젝트 종속 항목 분석
Xcode와 달리 Bazel에서는 BUILD 파일의 모든 대상에 대해 모든 종속 항목을 명시적으로 선언해야 합니다.
외부 종속 항목에 관한 자세한 내용은 외부 종속 항목 작업을 참고하세요.
Bazel을 사용하여 Xcode 프로젝트 빌드 또는 테스트
Bazel을 사용하여 Xcode 프로젝트를 빌드하거나 테스트하려면 다음 단계를 따르세요.
-
a. 애플리케이션 대상 추가
c. 라이브러리 대상 추가
1단계: MODULE.bazel 파일 만들기
새 디렉터리에 MODULE.bazel 파일을 만듭니다. 이 디렉터리가
Bazel 작업공간 루트가 됩니다. 프로젝트에서 외부 종속 항목을 사용하지 않는 경우 이 파일
은 비어 있을 수 있습니다. 프로젝트가 프로젝트 디렉터리 중 하나에 없는 파일 또는 패키지에 종속되는 경우
파일에 이러한 외부 종속 항목을 지정합니다.
MODULE.bazel
2단계: (실험용) SwiftPM 종속 항목 통합
3단계: BUILD 파일 만들기
작업공간과 외부 종속 항목을 정의한 후에는 Bazel에 프로젝트 구조를 알려주는
BUILD 파일을 만들어야 합니다. Bazel 작업공간의 루트에
BUILD 파일을 만들고 다음과 같이 프로젝트의
초기 빌드를 실행하도록 구성합니다.
도움말: 패키지 및 기타 Bazel 개념에 관한 자세한 내용은 작업공간, 패키지, 대상을 참고하세요.
3a단계: 애플리케이션 대상 추가
macos_application 또는
ios_application
규칙 대상을 추가합니다. 이 대상은 각각 macOS 또는 iOS 애플리케이션 번들을 빌드합니다.
대상에서 최소한 다음을 지정합니다.
bundle_id- 바이너리의 번들 ID (앱 이름이 뒤따르는 역방향 DNS 경로)provisioning_profile- Apple 개발자 계정의 프로비저닝 프로필 (iOS 기기용으로 빌드하는 경우)families(iOS만 해당) - iPhone, iPad 또는 둘 다에 애플리케이션을 빌드할지 여부infoplists- 최종 Info.plist 파일에 병합할 .plist 파일 목록minimum_os_version- 애플리케이션이 지원하는 최소 버전의 macOS 또는 iOS 이렇게 하면 Bazel이 올바른 API 수준으로 애플리케이션을 빌드할 수 있습니다.
3b단계: (선택사항) 테스트 대상 추가
Bazel의 Apple 빌드 규칙은 모든 Apple 플랫폼에서 단위 테스트 및 UI 테스트 실행을 지원합니다. 다음과 같이 테스트 대상을 추가합니다.
macos_unit_test: macOS에서 라이브러리 기반 및 애플리케이션 기반 단위 테스트를 실행합니다.ios_unit_testiOS에서 라이브러리 기반 단위 테스트를 빌드하고 실행합니다.ios_ui_test: iOS 시뮬레이터에서 사용자 인터페이스 테스트를 빌드하고 실행합니다.
최소한 minimum_os_version 속성의 값을 지정합니다. 다른 패키징 속성(예: bundle_identifier 및 infoplists)은 기본적으로 가장 일반적으로 사용되는 값으로 설정되지만 이러한 기본값이 프로젝트와 호환되는지 확인하고 필요한 경우 조정합니다. iOS
시뮬레이터가 필요한 테스트의 경우 ios_application 대상 이름을
test_host 속성의 값으로 지정합니다.
3c단계: 라이브러리 대상 추가
애플리케이션 또는 테스트가 종속되는 각 Objective-C 라이브러리에 objc_library 대상을 추가하고 각 Swift 라이브러리에
swift_library
대상을 추가합니다.
다음과 같이 라이브러리 대상을 추가합니다.
애플리케이션 라이브러리 대상을 애플리케이션 대상의 종속 항목으로 추가합니다.
테스트 라이브러리 대상을 테스트 대상의 종속 항목으로 추가합니다.
srcs속성에 구현 소스를 나열합니다.hdrs속성에 헤더를 나열합니다.
rules_apple 예시 디렉터리에서 다양한 유형의 애플리케이션에 관한 기존 예시를 직접 찾아볼 수 있습니다. 예를 들면 다음과 같습니다.
빌드 규칙에 관한 자세한 내용은 Bazel용 Apple 규칙을 참고하세요.
이 시점에서 빌드를 테스트하는 것이 좋습니다.
bazel build //:<application_target>
4단계: (선택사항) 빌드 세분화
프로젝트가 크거나 커짐에 따라 여러 Bazel 패키지로 청크하는 것이 좋습니다. 이렇게 세분화하면 다음과 같은 이점이 있습니다.
빌드의 증분성 증가
빌드 작업의 병렬화 증가
향후 사용자를 위한 유지보수 용이성 향상
대상 및 패키지 전반에서 소스 코드 공개 상태를 더 효과적으로 제어 이렇게 하면 구현 세부정보가 포함된 라이브러리가 공개 API로 유출되는 등의 문제를 방지할 수 있습니다.
프로젝트를 세분화하기 위한 도움말:
각 라이브러리를 자체 Bazel 패키지에 넣습니다. 종속 항목이 가장 적은 라이브러리부터 시작하여 종속 항목 트리를 따라 올라갑니다.
BUILD파일을 추가하고 대상을 지정할 때 이러한 새 대상을 종속되는 대상의deps속성에 추가합니다.glob()함수는 패키지 경계를 넘지 않으므로 패키지 수가 증가함에 따라glob()에서 일치하는 파일이 줄어듭니다.main디렉터리에BUILD파일을 추가할 때는 상응하는test디렉터리에도BUILD파일을 추가합니다.패키지 전반에서 적절한 공개 상태 한도를 적용합니다.
BUILD파일에 주요 변경사항이 있을 때마다 프로젝트를 빌드하고 빌드 오류가 발생하면 수정합니다.
5단계: 빌드 실행
완전히 이전된 빌드를 실행하여 오류나 경고 없이 완료되는지 확인합니다. 발생하는 오류의 소스를 더 쉽게 찾으려면 모든 애플리케이션 및 테스트 대상을 개별적으로 실행합니다.
예를 들면 다음과 같습니다.
bazel build //:my-target6단계: rules_xcodeproj로 Xcode 프로젝트 생성
Bazel을 사용하여 빌드할 때 MODULE.bazel 및 BUILD 파일이 빌드에 관한 신뢰할 수 있는 소스
가 됩니다. Xcode에서 이를 인식하도록 하려면
Bazel 호환 Xcode 프로젝트를
rules_xcodeproj
를 사용하여 생성해야 합니다.
문제 해결
업데이트를 적용할 때와 같이 Bazel이 선택한 Xcode 버전과 동기화되지 않으면 Bazel 오류가 발생할 수 있습니다. 예를 들어 'Apple CROSSTOOL을 사용하려면 Xcode 버전을 지정해야 합니다.'와 같이 Xcode에서 오류가 발생하는 경우 시도해 볼 수 있는 몇 가지 방법은 다음과 같습니다.
Xcode를 수동으로 실행하고 이용약관에 동의합니다.
Xcode 선택을 사용하여 올바른 버전을 표시하고 라이선스에 동의하고 Bazel의 상태를 지웁니다.
sudo xcode-select -s /Applications/Xcode.app/Contents/Developersudo xcodebuild -licensebazel sync --configure
- 이 방법이 효과가 없다면
bazel clean --expunge를 실행해 볼 수도 있습니다.