BazelCon 2022는 11월 16~17일에 뉴욕과 온라인에서 개최됩니다.
지금 등록하기

Xcode에서 Bazel로 마이그레이션

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 페이지에서는 Bazel을 사용하여 Xcode 프로젝트를 빌드하거나 테스트하는 방법을 설명합니다. 여기서는 Xcode와 Bazel 간의 차이점을 설명하고, Xcode 프로젝트를 Bazel 프로젝트로 변환하는 단계를 설명합니다. 또한 일반적인 오류를 해결하기 위한 문제 해결 솔루션을 제공합니다.

Xcode와 Bazel의 차이점

  • Bazel을 사용하려면 모든 빌드 대상과 그 종속 항목과 빌드 규칙을 통해 상응하는 빌드 설정을 명시적으로 지정해야 합니다.

  • Bazel을 사용하려면 프로젝트가 작업공간 디렉터리에 있거나 WORKSPACE 파일에서 가져오기로 지정되어야 하는 모든 파일이 필요합니다.

  • Bazel로 Xcode 프로젝트를 빌드할 때 BUILD 파일이 신뢰할 수 있는 소스가 됩니다. Xcode에서 프로젝트를 작업하는 경우 BUILD를 업데이트할 때마다 Tulsi를 사용하여 BUILD 파일과 일치하는 새로운 버전의 Xcode 프로젝트를 생성해야 합니다. 파일을 참고하세요. Xcode를 사용하지 않는 경우 bazel buildbazel test 명령어를 사용하면 빌드 및 테스트 기능을 사용할 수 있지만 이 가이드의 뒷부분에서 설명하는 특정 제한사항이 적용됩니다.

  • 디렉터리 레이아웃 또는 빌드 플래그와 같은 빌드 구성 스키마의 차이로 인해 Xcode가 빌드의 '대규모'를 제대로 인식하지 못할 수 있으므로 일부 Xcode 기능이 작동하지 않을 수 있습니다. 예를 들면 다음과 같습니다.

    • Tulsi에서 변환하기 위해 선택한 대상에 따라 Xcode에서 프로젝트 소스의 색인을 제대로 생성하지 못할 수 있습니다. Xcode는 프로젝트의 소스 코드를 모두 볼 수 없기 때문에 이 코드는 Xcode의 코드 완성 및 탐색에 영향을 줍니다.

    • Bazel이 Xcode에서 이러한 기능에 필요한 출력을 생성하지 않으므로 정적 분석, 주소 새니타이저 및 스레드 새니타이저가 작동하지 않을 수 있습니다.

    • Tulsi로 Xcode 프로젝트를 생성하고 Xcode에서 이 프로젝트를 사용하여 테스트를 실행하면 Xcode에서 Bazel 대신 테스트를 실행합니다. Bazel로 테스트를 실행하려면 bazel test 명령어를 수동으로 실행합니다.

시작하기 전에

시작하기 전에 다음을 수행합니다.

  1. 아직 Bazel을 설치하지 않았다면 설치합니다.

  2. Bazel 및 그 개념에 익숙하지 않은 경우 iOS 앱 가이드를 완료하세요. WORKSPACEBUILD 파일을 비롯하여 Bazel 작업공간은 물론 대상, 빌드 규칙, Bazel 패키지의 개념을 이해해야 합니다.

  3. 프로젝트의 종속 항목 분석 및 이해

프로젝트 종속 항목 분석

Xcode와 달리 Bazel을 사용하려면 BUILD 파일의 모든 대상에 대한 모든 종속 항목을 명시적으로 선언해야 합니다.

외부 종속 항목에 대한 자세한 내용은 외부 종속 항목 작업을 참조하세요.

Bazel로 Xcode 프로젝트 빌드 또는 테스트

Bazel을 사용하여 Xcode 프로젝트를 빌드하거나 테스트하려면 다음을 수행하세요.

  1. WORKSPACE 파일 만들기

  2. (실험용) CocoaPods 종속 항목 통합

  3. BUILD 파일을 만듭니다.

    a. 애플리케이션 타겟 추가

    b. (선택사항) 테스트 대상 추가

    c. 라이브러리 타겟 추가

  4. (선택사항) 빌드 세분화

  5. 빌드 실행

  6. Tulsi를 사용하여 Xcode 프로젝트 생성하기

1단계: WORKSPACE 파일 만들기

새 디렉터리에 WORKSPACE 파일을 만듭니다. 이 디렉터리는 Bazel 작업공간 루트가 됩니다. 프로젝트가 외부 종속 항목을 사용하지 않는 경우 이 파일은 비어 있을 수 있습니다. 프로젝트가 프로젝트 디렉터리 중 하나에 없는 파일이나 패키지에 의존하는 경우 이러한 외부 종속 항목을 WORKSPACE 파일에 지정합니다.

2단계: (실험용) CocoaPods 종속 항목 통합

CocoaPods 종속 항목을 Bazel 작업공간에 통합하려면 CocoaPods 종속 항목 변환에 설명된 대로 CocoaPods 종속 항목을 Bazel 패키지로 변환해야 합니다.

3단계: BUILD 파일 만들기

작업공간 및 외부 종속 항목을 정의한 후에는 Bazel에 프로젝트 구조를 알리는 BUILD 파일을 만들어야 합니다. Bazel 작업공간의 루트에서 BUILD 파일을 만들고 다음과 같이 프로젝트의 초기 빌드를 수행하도록 구성합니다.

팁: 패키지 및 기타 Bazel 개념에 대한 자세한 내용은 작업공간, 패키지, 대상을 참조하세요.

3a단계: 애플리케이션 타겟 추가

macos_application 또는 ios_application 규칙 대상을 추가합니다. 이 타겟은 각각 macOS 또는 iOS 애플리케이션 번들을 빌드합니다. 대상에서 최소한 다음을 지정합니다.

  • bundle_id - 바이너리의 번들 ID (역방향 DNS 경로와 앱 이름)입니다.

  • provisioning_profile - Apple Developer 계정의 프로비저닝 프로필 (iOS 기기 기기용 빌드 시)

  • families (iOS만 해당) - iPhone, iPad 또는 둘 다를 위한 애플리케이션 빌드 여부.

  • infoplists - 최종 Info .plist 파일에 병합할.plist 파일 목록입니다.

  • minimum_os_version - 애플리케이션이 지원하는 macOS 또는 iOS의 최소 버전입니다. 그러면 Bazel이 올바른 API 수준으로 애플리케이션을 빌드합니다.

3b단계: (선택사항) 테스트 대상 추가

Bazel의 Apple 빌드 규칙은 macOS에서 애플리케이션 기반 테스트를 비롯해 iOS 및 macOS에서 라이브러리 기반 단위 테스트를 실행하도록 지원합니다. iOS의 애플리케이션 기반 테스트나 두 플랫폼의 UI 테스트에서 Bazel은 테스트 출력을 빌드하지만 테스트는 Tulsi로 생성된 프로젝트를 통해 Xcode 내에서 실행해야 합니다. 다음과 같이 테스트 대상을 추가합니다.

  • macOS에서 라이브러리 기반 및 애플리케이션 기반 단위 테스트를 실행하려면 macos_unit_test.

  • ios_unit_test: iOS에서 라이브러리 기반 단위 테스트를 실행합니다. iOS 시뮬레이터가 필요한 테스트의 경우 Bazel은 테스트 출력을 빌드하지만 테스트를 실행하지 않습니다. Tulsi로 Xcode 프로젝트를 생성하고 Xcode 내에서 테스트를 실행해야 합니다.

  • ios_ui_test: Xcode를 사용하여 iOS 시뮬레이터에서 사용자 인터페이스 테스트를 실행하는 데 필요한 출력을 빌드합니다. Tulsi로 Xcode 프로젝트를 생성하고 Xcode 내에서 테스트를 실행해야 합니다. Bazel은 기본적으로 UI 테스트를 실행할 수 없습니다.

최소한 minimum_os_version 속성 값을 지정하세요. bundle_identifierinfoplists과 같은 다른 패키징 속성은 가장 일반적으로 사용되는 값으로 기본 설정되며, 이러한 기본값이 프로젝트와 호환되는지 확인하고 필요에 따라 조정하세요. iOS 시뮬레이터가 필요한 테스트의 경우 ios_application 대상 이름도 test_host 속성 값으로 지정하세요.

3c단계: 라이브러리 타겟 추가

각 Objective C 라이브러리용 objc_library 타겟과 애플리케이션 및/또는 라이브러리를 보유한 각 Swift 라이브러리의 swift_library 타겟을 추가합니다. 테스트의 영향을 받습니다.

다음과 같이 라이브러리 타겟을 추가합니다.

  • 애플리케이션 라이브러리 대상을 애플리케이션 대상에 종속 항목으로 추가합니다.

  • 테스트 라이브러리 대상을 테스트 대상에 종속 항목으로 추가합니다.

  • srcs 소스에 구현 소스를 나열합니다.

  • hdrs 속성에 헤더를 나열합니다.

빌드 규칙에 대한 자세한 내용은 Bazel을 위한 Apple 규칙을 참조하세요.

이 시점에서 빌드를 테스트하는 것이 좋습니다.

bazel build //:<application_target>

4단계: (선택사항) 빌드 세분화

프로젝트가 크거나 증가하면 여러 Bazel 패키지로 분할하는 것이 좋습니다. 이러한 세부사항을 통해 다음과 같은 이점이 있습니다.

  • 빌드 성과 증분 증가

  • 빌드 작업의 동시 로드 증가

  • 향후 사용자의 유지관리 향상

  • 대상 및 패키지 전체에 걸쳐 소스 코드 가시성을 더 효과적으로 제어합니다. 이렇게 하면 구현 세부정보가 공개 API에 유출되는 라이브러리와 같은 문제가 방지됩니다.

프로젝트 세분화를 위한 팁:

  • 각 라이브러리를 자체 Bazel 패키지에 넣습니다. 최소 종속 항목이 필요한 항목으로 시작하여 종속 항목 트리를 올라가세요.

  • BUILD 파일을 추가하고 타겟을 지정할 때 새 타겟을 타겟의 deps 속성에 추가합니다.

  • glob() 함수는 패키지 경계를 교차하지 않으므로 패키지 수가 증가하면 glob()에서 일치하는 파일이 줄어듭니다.

  • main 파일을 BUILD에 추가할 때 상응하는 test 디렉터리에도 BUILD 파일을 추가합니다.

  • 패키지 전체에 정상 공개 상태 제한을 적용합니다.

  • BUILD 파일이 변경될 때마다 프로젝트를 빌드하고 빌드 오류가 발생하면 수정합니다.

5단계: 빌드 실행

완전 마이그레이션된 빌드를 실행하여 오류 또는 경고 없이 완료될 수 있도록 합니다. 모든 애플리케이션과 테스트 대상을 개별적으로 실행하여 발생하는 오류의 원인을 더 쉽게 찾을 수 있습니다.

예:

bazel build //:my-target

6단계: Tulsi를 사용하여 Xcode 프로젝트 생성

Bazel로 빌드할 때 WORKSPACEBUILD 파일은 빌드에 대한 정보 소스가 됩니다. Xcode에서 이를 인식하도록 하려면 Tulsi를 사용하여 Bazel과 호환되는 Xcode 프로젝트를 생성해야 합니다.

문제해결

Bazel 오류는 업데이트를 적용할 때와 같이 선택한 Xcode 버전과 동기화되지 않을 때 발생할 수 있습니다. Xcode에 오류가 발생하면 'Xcode 버전을 지정해야 Apple CROSSTOOL을 사용해야 합니다'와 같은 작업을 해보세요.

  • Xcode를 수동으로 실행하고 모든 이용약관에 동의합니다.

  • Xcode 선택을 사용하여 올바른 버전을 표시하고 라이선스를 수락하며 Bazel 상태를 삭제합니다.

  sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
  sudo xcodebuild -license
  bazel sync --configure
  • 그래도 문제가 해결되지 않으면 bazel clean --expunge를 실행해 보세요.