이 튜토리얼에서는 Bazel을 사용하여 간단한 iOS 앱을 빌드하는 방법을 설명합니다.
학습할 내용
이 튜토리얼에서는 다음을 수행하는 방법을 알아봅니다.
- Bazel 및 Xcode를 설치하고 샘플 프로젝트를 다운로드하여 환경 설정
- 앱의 소스 코드와 작업공간 디렉터리의 최상위를 식별하는
WORKSPACE
파일이 포함된 Bazel 작업공간을 설정합니다. - 필요한 외부 종속 항목 참조를 포함하도록
WORKSPACE
파일을 업데이트합니다. BUILD
파일 만들기- Bazel을 실행하여 시뮬레이터 및 iOS 기기용 앱 빌드
- 시뮬레이터 및 iOS 기기에서 앱 실행
환경 설정
시작하려면 Bazel과 Xcode를 설치하고 샘플 프로젝트를 가져옵니다.
Bazel 설치
설치 안내에 따라 Bazel과 종속 항목을 설치합니다.
Xcode 설치
Xcode를 다운로드하여 설치합니다. Xcode에는 Bazel이 Apple 애플리케이션을 빌드하는 데 필요한 컴파일러, SDK, 기타 도구가 포함되어 있습니다.
샘플 프로젝트 가져오기
또한 GitHub에서 튜토리얼의 샘플 프로젝트를 가져와야 합니다. GitHub 저장소에는 source-only
및 main
라는 두 개의 브랜치가 있습니다. source-only
브랜치에는 프로젝트의 소스 파일만 포함됩니다. 이 튜토리얼에서는 이 브랜치의 파일을 사용합니다. main
브랜치에는 소스 파일과 완성된 Bazel WORKSPACE
및 BUILD
파일이 모두 포함됩니다. 튜토리얼 단계를 완료한 후 이 브랜치의 파일을 사용하여 작업을 확인할 수 있습니다.
명령줄에 다음을 입력하여 source-only
브랜치의 파일을 가져옵니다.
cd $HOME
git clone -b source-only https://github.com/bazelbuild/examples
git clone
명령어는 $HOME/examples/
라는 디렉터리를 만듭니다. 이 디렉터리에는 Bazel용 샘플 프로젝트가 여러 개 포함되어 있습니다. 이 튜토리얼의 프로젝트 파일은 $HOME/examples/tutorial/ios-app
에 있습니다.
작업공간 설정
작업 영역은 하나 이상의 소프트웨어 프로젝트의 소스 파일과 Bazel이 소프트웨어를 빌드하는 데 사용하는 안내가 포함된 WORKSPACE
파일 및 BUILD
파일이 포함된 디렉터리입니다. 워크스페이스에는 출력 디렉터리에 대한 기호화된 링크도 포함될 수 있습니다.
워크스페이스 디렉터리는 파일 시스템의 어디에나 있을 수 있으며 루트에 WORKSPACE
파일이 있으면 이를 나타냅니다. 이 튜토리얼에서는 워크스페이스 디렉터리가 $HOME/examples/tutorial/
이며 여기에는 이전 단계에서 GitHub 저장소에서 클론한 샘플 프로젝트 파일이 포함되어 있습니다.
편의를 위해 지금 $WORKSPACE
환경 변수를 설정하여 워크스페이스 디렉터리를 참조합니다. 명령줄에 다음을 입력합니다.
export WORKSPACE=$HOME/examples/tutorial
WORKSPACE 파일 만들기
모든 워크스페이스에는 최상위 워크스페이스 디렉터리에 WORKSPACE
라는 텍스트 파일이 있어야 합니다. 이 파일은 비어 있거나 소프트웨어를 빌드하는 데 필요한 외부 종속 항목에 대한 참조를 포함할 수 있습니다.
지금은 작업공간 디렉터리를 식별하는 역할을 하는 빈 WORKSPACE
파일을 만듭니다. 이후 단계에서 외부 종속 항목 정보를 추가하도록 파일을 업데이트합니다.
명령줄에서 다음을 입력합니다.
touch $WORKSPACE/WORKSPACE
open -a Xcode $WORKSPACE/WORKSPACE
그러면 빈 WORKSPACE
파일이 생성되고 열립니다.
WORKSPACE 파일 업데이트
Apple 기기용 애플리케이션을 빌드하려면 Bazel이 GitHub 저장소에서 최신 Apple 빌드 규칙을 가져와야 합니다. 이를 사용 설정하려면 다음 git_repository
규칙을 WORKSPACE
파일에 추가합니다.
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
git_repository(
name = "build_bazel_rules_apple",
remote = "https://github.com/bazelbuild/rules_apple.git",
tag = "0.19.0",
)
git_repository(
name = "build_bazel_rules_swift",
remote = "https://github.com/bazelbuild/rules_swift.git",
tag = "0.13.0",
)
git_repository(
name = "build_bazel_apple_support",
remote = "https://github.com/bazelbuild/apple_support.git",
tag = "0.7.2",
)
git_repository(
name = "bazel_skylib",
remote = "https://github.com/bazelbuild/bazel-skylib.git",
tag = "0.9.0",
)
소스 파일 검토
$WORKSPACE/ios-app/UrlGet
에 있는 앱의 소스 파일을 살펴봅니다. 다시 한번 강조하지만, 지금은 앱의 구조를 익히기 위해 이러한 파일을 살펴보는 것뿐입니다. 이 튜토리얼을 완료하기 위해 소스 파일을 수정할 필요는 없습니다.
BUILD 파일 만들기
명령줄 프롬프트에서 수정할 새 BUILD
파일을 엽니다.
touch $WORKSPACE/ios-app/BUILD
open -a Xcode $WORKSPACE/ios-app/BUILD
규칙 로드 문을 추가합니다.
iOS 타겟을 빌드하려면 Bazel은 빌드가 실행될 때마다 GitHub 저장소에서 빌드 규칙을 로드해야 합니다. 프로젝트에서 이러한 규칙을 사용할 수 있도록 하려면 다음 로드 문을 BUILD
파일의 시작 부분에 추가합니다.
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")
objc_library
규칙은 Bazel 패키지에 빌드되므로 ios_application
규칙만 로드하면 됩니다.
objc_library 규칙 추가
Bazel은 iOS 플랫폼용 앱을 빌드하는 데 사용할 수 있는 여러 빌드 규칙을 제공합니다. 이 튜토리얼에서는 먼저 objc_library
규칙을 사용하여 앱 소스 코드와 Xib 파일에서 정적 라이브러리를 빌드하는 방법을 Bazel에 알려 줍니다. 그런 다음 ios_application
규칙을 사용하여 애플리케이션 바이너리와 .ipa
번들을 빌드하는 방법을 지정합니다.
BUILD
파일에 다음을 추가합니다.
objc_library(
name = "UrlGetClasses",
srcs = [
"UrlGet/AppDelegate.m",
"UrlGet/UrlGetViewController.m",
"UrlGet/main.m",
],
hdrs = glob(["UrlGet/*.h"]),
data = ["UrlGet/UrlGetViewController.xib"],
)
규칙 이름 UrlGetClasses
을 확인합니다.
ios_application 규칙 추가
ios_application
규칙은 애플리케이션 바이너리를 빌드하고 .ipa
번들 파일을 만듭니다.
BUILD
파일에 다음을 추가합니다.
ios_application(
name = "ios-app",
bundle_id = "Google.UrlGet",
families = [
"iphone",
"ipad",
],
minimum_os_version = "9.0",
infoplists = [":UrlGet/UrlGet-Info.plist"],
visibility = ["//visibility:public"],
deps = [":UrlGetClasses"],
)
deps
속성이 위의 BUILD
파일에 추가한 UrlGetClasses
규칙의 출력을 참조하는 방식을 확인합니다.
이제 파일을 저장하고 닫습니다. BUILD
파일을 GitHub 저장소의 main
브랜치에 있는 완성된 예와 비교할 수 있습니다.
앱 빌드 및 배포
이제 앱을 빌드하고 시뮬레이터와 iOS 기기에 배포할 준비가 되었습니다.
빌드된 앱은 $WORKSPACE/bazel-bin
디렉터리에 있습니다.
이 튜토리얼의 완성된 WORKSPACE
및 BUILD
파일은 GitHub 저장소의 기본 브랜치에 있습니다. 추가 도움을 받거나 문제를 해결하려면 완료된 파일과 내 작업을 비교해 보세요.
시뮬레이터용 앱 빌드
현재 작업 디렉터리가 Bazel 워크스페이스 내에 있는지 확인합니다.
cd $WORKSPACE
이제 다음을 입력하여 샘플 앱을 빌드합니다.
bazel build //ios-app:ios-app
Bazel이 샘플 앱을 실행하고 빌드합니다. 빌드 프로세스 중에 출력은 다음과 비슷하게 표시됩니다.
INFO: Found 1 target...
Target //ios-app:ios-app up-to-date:
bazel-bin/ios-app/ios-app.ipa
INFO: Elapsed time: 0.565s, Critical Path: 0.44s
빌드 출력 찾기
.ipa
파일 및 기타 출력은 $WORKSPACE/bazel-bin/ios-app
디렉터리에 있습니다.
시뮬레이터에서 앱 실행 및 디버그
이제 iOS 시뮬레이터를 사용하여 Xcode에서 앱을 실행할 수 있습니다. 먼저 Tulsi를 사용하여 Xcode 프로젝트를 생성합니다.
그런 다음 Xcode에서 프로젝트를 열고 iOS 시뮬레이터를 런타임 스키마로 선택한 후 Run을 클릭합니다.
기기용 앱 빌드
iOS 기기에 설치되고 실행되도록 앱을 빌드하려면 Bazel에 해당 기기 모델에 적절한 프로비저닝 프로필이 필요합니다. 다음 단계를 따르세요.
Apple 개발자 계정으로 이동하여 기기에 적절한 프로비저닝 프로필을 다운로드합니다. 자세한 내용은 Apple 문서를 참고하세요.
프로필을
$WORKSPACE
로 이동합니다.(선택사항)
.gitignore
파일에 프로필을 추가합니다.BUILD
파일의ios_application
타겟에 다음 줄을 추가합니다.provisioning_profile = "<your_profile_name>.mobileprovision",
이제 기기용 앱을 빌드합니다.
bazel build //ios-app:ios-app --ios_multi_cpus=armv7,arm64
이렇게 하면 앱이 팻 바이너리로 빌드됩니다. 특정 기기 아키텍처용으로 빌드하려면 빌드 옵션에서 지정하세요.
특정 Xcode 버전용으로 빌드하려면 --xcode_version
옵션을 사용하세요. 특정 SDK 버전용으로 빌드하려면 --ios_sdk_version
옵션을 사용하세요. 대부분의 시나리오에서는 --xcode_version
옵션으로 충분합니다.
필요한 최소 iOS 버전을 지정하려면 BUILD
파일의 ios_application
빌드 규칙에 minimum_os_version
매개변수를 추가합니다.
Tulsi를 사용하여 명령줄이 아닌 GUI로 앱을 빌드할 수도 있습니다.
기기에 앱 설치
기기에 앱을 설치하는 가장 쉬운 방법은 Xcode를 실행하고 Windows > Devices
명령어를 사용하는 것입니다. 왼쪽 목록에서 연결된 기기를 선택한 다음 'Installed Apps'(설치된 앱) 아래의 Add(추가) 버튼을 클릭하고 빌드한 .ipa
파일을 선택하여 앱을 추가합니다.
앱이 기기에 설치되지 않으면 BUILD
파일 (이전 섹션의 4단계)에 올바른 프로비저닝 프로필을 지정했는지 확인하세요.
앱이 실행되지 않으면 기기가 프로비저닝 프로필에 포함되어 있는지 확인하세요. Xcode의 Devices
화면에 있는 View Device Logs
버튼은 문제가 발생한 원인에 관한 다른 정보를 제공할 수 있습니다.
추가 자료
자세한 내용은 GitHub 저장소의 기본 브랜치를 참고하세요.