Xcode에서 Bazel로 마이그레이션

문제 신고 소스 보기 1박 · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

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

Xcode와 Bazel의 차이점

  • Bazel에서는 모든 빌드 대상과 해당 빌드 대상을 명시적으로 종속 항목, 그리고 빌드 규칙을 통해 해당 빌드 설정을 볼 수 있습니다.

  • Bazel을 사용하려면 프로젝트가 종속된 모든 파일이 있어야 합니다. 작업공간 디렉터리 내에 있거나 WORKSPACE에서 가져오기로 지정되었습니다. 파일에서 참조됩니다.

  • Bazel을 사용하여 Xcode 프로젝트를 빌드할 때 BUILD 파일이 소스 저장소입니다 Xcode에서 프로젝트를 수행하는 경우 다음을 사용하여 BUILD 파일과 일치하는 새 Xcode 프로젝트의 버전 rules_xcodeproj BUILD 파일을 업데이트할 때마다 BUILD 파일의 특정 변경사항 대상에 종속 항목을 추가하는 것과 같은 개발 속도를 높일 수 있습니다. Xcode를 사용하지 않는 경우 bazel buildbazel test 명령어는 빌드 및 테스트 기능을 제공합니다. 이 가이드의 뒷부분에서 설명하는 특정 제한사항이 적용됩니다.

시작하기 전에

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

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

  2. Bazel과 그 개념에 익숙하지 않다면 iOS 앱 튜토리얼 Bazel을 이해하고 있어야 합니다. WORKSPACEBUILD 파일을 비롯한 여러 작업공간에 대한 빌드 규칙, Bazel 패키지의 개념과

  3. 프로젝트의 종속 항목을 분석하고 이해합니다.

프로젝트 종속 항목 분석

Xcode와 달리 Bazel은 런타임에서 모든 종속 항목을 BUILD 파일의 모든 타겟

외부 종속 항목에 대한 자세한 내용은 외부 종속 항목 사용

Bazel을 사용하여 Xcode 프로젝트 빌드 또는 테스트

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

  1. WORKSPACE 파일 만들기

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

  3. BUILD 파일을 만듭니다.

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

    b. (선택사항) 테스트 타겟 추가

    c. 라이브러리 타겟 추가

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

  5. 빌드 실행

  6. rules_xcodeproj로 Xcode 프로젝트 생성

1단계: WORKSPACE 파일 만들기

새 디렉터리에 WORKSPACE 파일을 만듭니다. 이 디렉터리는 Bazel이 됩니다. 작업공간 루트를 선택합니다. 프로젝트가 외부 종속 항목을 사용하지 않는 경우 이 파일은 비어 있습니다. 프로젝트가 프로젝트 디렉터리에서 다음과 같은 외부 종속 항목을 WORKSPACE에 지정합니다. 파일에서 참조됩니다.

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

swift_bazel을 사용하여 SwiftPM 종속 항목을 Bazel 작업공간에 통합하려면 다음 안내를 따르세요. 다음 튜토리얼에 설명된 대로 Bazel 패키지로 변환해야 합니다.

3단계: BUILD 파일 만들기

작업공간과 외부 종속 항목을 정의한 후에는 다음을 수행해야 합니다. Bazel에 프로젝트 구성 방식을 알려주는 BUILD 파일을 만듭니다. 만들기 Bazel 작업공간의 루트에 있는 BUILD 파일을 열고 다음을 수행하도록 구성합니다. 초기 빌드를 수행합니다.

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

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

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

  • bundle_id - 바이너리입니다.

  • provisioning_profile - Apple 개발자의 프로비저닝 프로필 계정 (iOS 기기용으로 빌드하는 경우)

  • families (iOS만 해당) - iPhone, iPad, 또는 둘 다일 수 있습니다.

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

  • minimum_os_version - 앱이 실행되는 macOS 또는 iOS의 애플리케이션을 지원합니다 이렇게 하면 Bazel이 수정할 수 있습니다

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

Bazel의 Apple 빌드 규칙 지원 iOS 및 macOS에서 라이브러리 기반 단위 테스트 실행 및 애플리케이션 기반 테스트할 수 있습니다. iOS의 애플리케이션 기반 테스트 또는 Bazel이 테스트 출력을 빌드하지만 테스트는 Xcode 내에서 실행해야 합니다. Rules_xcodeproj로 생성된 프로젝트를 통해 로그인할 수 있습니다 다음과 같이 테스트 타겟을 추가합니다.

  • macos_unit_test: macOS에서 라이브러리 기반 및 애플리케이션 기반 단위 테스트를 실행합니다.

  • ios_unit_test 드림 을 사용하여 iOS에서 라이브러리 기반 단위 테스트를 실행할 수 있습니다. iOS가 필요한 테스트의 경우 시뮬레이터를 사용하면 Bazel이 테스트 출력을 빌드하지만 테스트를 실행하지는 않습니다. 다음을 수행해야 합니다. rules_xcodeproj로 Xcode 프로젝트 생성 Xcode 내에서 테스트를 실행할 수 있습니다.

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

최소한 minimum_os_version 속성 값을 지정합니다. 동안 기타 패키징 속성(예: bundle_identifierinfoplists) 가장 일반적으로 사용되는 값으로 기본 설정하므로 이러한 기본값이 호환 가능해야 합니다. 필요에 따라 조정할 수 있습니다 iOS를 사용해야 하는 테스트의 경우 시뮬레이터에서는 ios_application 타겟 이름을 test_host 속성

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

objc_library 추가 각 Objective-C 라이브러리 및 swift_library의 타겟 대상입니다.

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

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

  • 테스트 라이브러리 타겟을 테스트 타겟의 종속 항목으로 추가합니다.

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

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

를 통해 개인정보처리방침을 정의할 수 있습니다.

다양한 유형의 애플리케이션에 대한 기존 예시를 rules_apple 예제 디렉토리에 입력합니다. 예를 들면 다음과 같습니다.

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

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

bazel build //:<application_target>

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

프로젝트가 크거나 성장함에 따라 프로젝트를 여러 개로 분할하는 것이 좋습니다. Bazel 패키지 이렇게 확대된 세분성은 다음과 같은 이점을 제공합니다.

  • 빌드 성과 증분 증가

  • 빌드 작업의 병렬화 증가

  • 향후 사용자를 위한 더 나은 유지관리

  • 대상과 패키지 전반에 걸쳐 소스 코드 가시성에 대한 향상된 제어 이 구현 세부정보 유출이 포함된 라이브러리 등의 문제 방지 공개 API로 옮길 수 있습니다

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

  • 각 라이브러리를 자체 Bazel 패키지에 넣습니다. 먼저 종속 항목을 최소화하고 종속 항목 트리 위로 이동해야 합니다.

  • BUILD 파일을 추가하고 대상을 지정할 때 이러한 새 대상을 종속된 대상의 deps 속성입니다.

  • glob() 함수는 패키지 경계를 넘지 않으므로 의 패키지 중 glob()와 일치하는 파일이 늘어나면 줄어듭니다.

  • BUILD 파일을 main 디렉터리에 추가할 때 BUILD 파일도 해당 test 디렉터리로 이동합니다.

  • 패키지 전반에 걸쳐 적절한 공개 상태 제한을 적용합니다.

  • BUILD 파일이 크게 변경될 때마다 프로젝트를 빌드하고 수정합니다. 빌드 오류를 즉시 알려줍니다

5단계: 빌드 실행

완전히 마이그레이션된 빌드를 실행하여 오류나 경고 없이 완료되도록 합니다. 모든 애플리케이션을 실행하고 타겟을 개별적으로 테스트하여 소스를 보다 쉽게 찾을 수 있습니다. 발생하는 모든 오류에 대비합니다.

예를 들면 다음과 같습니다.

bazel build //:my-target

6단계: rules_xcodeproj로 Xcode 프로젝트 생성

Bazel을 사용하여 빌드할 때 WORKSPACEBUILD 파일이 소스가 됩니다. 확인할 수 있습니다 Xcode에서 이를 인식하도록 하려면 rules_xcodeproj를 사용하는 Bazel 호환 Xcode 프로젝트

문제 해결

선택한 Xcode 버전과 동기화되지 않으면 Bazel 오류가 발생할 수 있습니다. 업데이트 적용 시점과 같은 시간을 예로 들 수 있습니다 다음과 같은 경우 시도해 볼 수 있습니다. Xcode에서 오류 발생(예: 'Xcode 버전을 Apple CROSSTOOL 사용"

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

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

  sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
  sudo xcodebuild -license
  bazel sync --configure
  • 그래도 문제가 해결되지 않으면 bazel clean --expunge를 실행해 볼 수도 있습니다.
를 통해 개인정보처리방침을 정의할 수 있습니다.