소개
Bazel을 처음 사용하시나요? 잘 찾아오셨습니다. 먼저 이 첫 번째 빌드 가이드를 따라 Bazel 사용에 대한 간단한 소개를 참조하세요. 이 가이드에서는 Bazel의 컨텍스트에서 사용되고 Bazel의 기본 사항을 안내합니다. 워크플로에 따라 다릅니다. 필요한 도구부터 시작하여 다음 세 가지를 빌드하고 실행합니다. 하고 이러한 프로젝트가 점점 더 복잡해지는 이유와 방법을 배우게 됩니다.
Bazel은 동일한 빌드 시스템으로 다국어 빌드를 지원하므로 이 튜토리얼에서는 C++ 프로젝트를 예시로 사용합니다. 대부분의 언어에 적용되는 일반적인 가이드라인과 절차를 제공합니다.
예상 완료 시간: 30분
기본 요건
아직 설치하지 않았다면 Bazel을 설치하여 시작합니다. 있습니다. 이 튜토리얼에서는 소스 제어에 Git을 사용하므로 최상의 결과를 얻으려면 설치하세요. Git도 마찬가지입니다.
다음으로, 다음 명령어를 실행하여 Bazel의 GitHub 저장소에서 샘플 프로젝트를 검색합니다. 선택한 명령줄 도구에서 다음을 수행합니다.
git clone https://github.com/bazelbuild/examples
이 가이드의 샘플 프로젝트는 examples/cpp-tutorial
에 있습니다.
를 참조하세요.
구조를 살펴보세요.
examples
└── cpp-tutorial
├──stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ └── MODULE.bazel
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── MODULE.bazel
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── MODULE.bazel
파일 세트 세 개가 있으며 각 세트는 이 튜토리얼의 단계를 나타냅니다. 첫 번째 단계에서는 단일 패키지에 있는 단일 타겟을 빌드합니다. 두 번째 단계에서는 바이너리와 라이브러리를 모두 빌드할 수 있습니다 마지막 3단계에서는 여러 패키지로 프로젝트를 빌드하고 여러 개의 타겟이 있습니다
요약: 소개
Bazel (및 Git)을 설치하고 이 튜토리얼에 사용할 저장소를 클론하면 Bazel을 사용한 첫 번째 빌드의 기반을 닦았습니다 다음으로 계속 섹션에서 몇 가지 용어를 정의하고 작업공간.
시작하기
프로젝트를 빌드하려면 먼저 작업공간을 설정해야 합니다. 작업공간 는 프로젝트의 소스 파일과 Bazel의 빌드 출력을 저장하는 디렉터리입니다. 또한 다음과 같은 중요한 파일도 포함되어 있습니다.
MODULE.bazel
파일: 디렉터리와 그 콘텐츠를 다음과 같이 식별합니다. Bazel 작업공간이며 프로젝트 디렉터리의 루트에 상주합니다. 있습니다. 또한 외부 종속 항목을 지정할 수도 있습니다.- 하나 이상의
BUILD
파일은 Bazel에 프로젝트의 여러 부분을 빌드하는 방법에 관해 이야기해 보겠습니다 포드 내의 디렉터리는BUILD
파일이 포함된 작업공간은 패키지를 지원합니다. (패키지에 대해 자세히 알아보기 이 튜토리얼의 뒷부분에서 설명)
향후 프로젝트에서 디렉터리를 Bazel 작업공간으로 지정하려면
MODULE.bazel
라는 빈 파일을 찾을 수 있습니다. 이 목적에서는
튜토리얼에서 볼 수 있듯이 MODULE.bazel
파일이 이미 각 단계에 있습니다.
BUILD 파일 이해
BUILD
파일에는 Bazel에 관한 여러 유형의 안내가 포함되어 있습니다. 각
BUILD
파일에 하나 이상 필요
규칙을 지침 집합으로 사용하고
실행 가능한 바이너리와 같이 원하는 출력을 빌드하는 방법을 Bazel에 알려줍니다.
액세스할 수 있습니다 BUILD
파일에서 빌드 규칙의 각 인스턴스를
타겟이고 구체적인
소스 파일 세트와
종속 항목. 표적은
다른 타겟을 가리키기도 합니다
cpp-tutorial/stage1/main
디렉터리의 BUILD
파일을 확인합니다.
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
이 예에서 hello-world
대상은 Bazel의 기본 제공
규칙 cc_binary
개. 규칙
Bazel에게 자체 포함된 실행 가능 바이너리를
hello-world.cc
> 소스 파일에 종속 항목이 없는 것을
확인할 수 있습니다
요약: 시작하기
이제 몇 가지 주요 용어와 Bazel을 예로 들 수 있습니다 다음 섹션에서는 Cloud Shell에서 프로젝트의 1단계
1단계: 단일 타겟, 단일 패키지
이제 프로젝트의 첫 번째 부분을 빌드할 차례입니다. 시각적으로 참조할 수 있도록 1단계 섹션의 구조는 다음과 같습니다.
examples
└── cpp-tutorial
└──stage1
├── main
│ ├── BUILD
│ └── hello-world.cc
└── MODULE.bazel
다음을 실행하여 cpp-tutorial/stage1
디렉터리로 이동합니다.
cd cpp-tutorial/stage1
다음을 실행합니다.
bazel build //main:hello-world
타겟 라벨에서 //main:
부분은 BUILD
파일의 위치입니다.
그리고 hello-world
은
BUILD
파일
Bazel은 다음과 같은 결과를 생성합니다.
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 2.267s, Critical Path: 0.25s
첫 번째 Bazel 대상을 빌드했습니다. Bazel은 빌드 출력을
bazel-bin
디렉터리에 있습니다.
이제 새로 빌드한 바이너리를 테스트합니다.
bazel-bin/main/hello-world
'Hello world
'이(가) 출력됩니다. 메시지가 표시됩니다.
다음은 1단계의 종속 항목 그래프입니다.
요약: 1단계
이제 첫 번째 빌드를 완료했으므로 구조화되어 있는지 확인합니다 다음 단계에서는 인코더-디코더 아키텍처를 다른 표적이 될 수 있습니다
2단계: 여러 빌드 타겟
소규모 프로젝트는 단일 대상으로 충분하지만 여러 대상을 분할하는 것이 좋습니다. 여러 대상과 패키지로 나누는 것입니다. 이렇게 하면 빠르게 증분 빌드: Bazel은 변경된 내용만 재빌드하고 한 번에 프로젝트의 여러 부분을 빌드하는 방식으로 빌드됩니다. 이 단계에서는 튜토리얼은 대상을 추가하고 다음에서는 패키지를 추가합니다.
다음은 2단계에서 작업하는 디렉터리입니다.
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ └── hello-greet.h
│ └── MODULE.bazel
cpp-tutorial/stage2/main
디렉터리의 BUILD
파일을 확인합니다.
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
],
)
Bazel은 이 BUILD
파일을 사용하여 먼저 hello-greet
라이브러리를 빌드합니다(
Bazel의 내장 cc_library
규칙)이 있으면
hello-world
바이너리 hello-world
타겟의 deps
속성은
hello-world
를 빌드하는 데 hello-greet
라이브러리가 필요하다는 Bazel
바이너리입니다.
이 새 버전의 프로젝트를 빌드하려면 먼저
다음 명령어를 실행하여 cpp-tutorial/stage2
디렉터리로 전환합니다.
cd ../stage2
이제 다음과 같은 익숙한 명령어를 사용하여 새 바이너리를 빌드할 수 있습니다.
bazel build //main:hello-world
다시 한 번 Bazel은 다음과 같은 결과를 생성합니다.
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 2.399s, Critical Path: 0.30s
이제 새로 빌드된 바이너리를 테스트하여 또 다른 'Hello
world
'을 반환할 수 있습니다.
bazel-bin/main/hello-world
이제 hello-greet.cc
를 수정하고 프로젝트를 다시 빌드하는 경우 Bazel만 적용됩니다.
다시 컴파일합니다
종속 항목 그래프를 보면 hello-world
가
hello-greet
라는 추가 입력
요약: 2단계
이제 두 개의 대상을 사용하여 프로젝트를 빌드했습니다. hello-world
타겟 빌드
하나의 소스 파일이며 다른 타겟 (//main:hello-greet
)에 종속됩니다.
두 개의 추가 소스 파일을 빌드합니다. 다음 섹션에서는 한 단계 더 나아가
다른 패키지를 추가합니다.
3단계: 여러 패키지
다음 단계에서는 정보 표시의 레이어를 하나 더 추가하고
실행할 수도 있습니다 이 모듈의 구조와 콘텐츠를
cpp-tutorial/stage3
디렉터리:
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── MODULE.bazel
이제 하위 디렉터리가 두 개 있고 각 디렉터리에 BUILD
가 포함된 것을 확인할 수 있습니다.
파일에서 참조됩니다. 따라서 Bazel에게 작업공간에 이제 lib
와
main
lib/BUILD
파일을 살펴봅니다.
cc_library(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
visibility = ["//main:__pkg__"],
)
main/BUILD
파일에서 다음 코드를 추가하세요.
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
"//lib:hello-time",
],
)
기본 패키지의 hello-world
타겟은 hello-time
타겟에 종속됩니다.
lib
패키지 (즉, 대상 라벨 //lib:hello-time
)에서 - Bazel은
deps
속성을 통해 이를 처리합니다. 이는 종속 항목에 반영된 것을 볼 수 있습니다.
그래프:
빌드에 성공하려면 lib/BUILD
에서 //lib:hello-time
대상을 만들어야 합니다.
가시성 속성을 사용하여 main/BUILD
의 대상에 명시적으로 표시됩니다.
기본적으로 타겟은 동일한 내의 다른 타겟에만 표시되기 때문입니다.
BUILD
파일. Bazel은 대상 가시성을 사용하여 라이브러리와 같은 문제를 방지합니다.
공개 API로 유출되는 구현 세부정보가 포함되어 있습니다.
이제 프로젝트의 최종 버전을 빌드합니다. cpp-tutorial/stage3
(으)로 전환
다음 명령어를 실행합니다.
cd ../stage3
다시 한 번 다음 명령어를 실행합니다.
bazel build //main:hello-world
Bazel은 다음과 같은 결과를 생성합니다.
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 0.167s, Critical Path: 0.00s
이제 이 튜토리얼의 마지막 바이너리에서 최종 Hello world
메시지를 테스트합니다.
bazel-bin/main/hello-world
요약: 3단계
이제 세 가지 대상이 포함된 두 개의 패키지로 프로젝트를 빌드했고 그들 간의 종속 항목을 갖출 수 있으므로 미래에 살펴봤습니다 다음 섹션에서는 Bazel 여정
다음 단계
이제 Bazel을 사용하여 첫 번째 기본 빌드를 완료했지만 이것은 단지 시작합니다 다음은 Bazel을 통해 계속 학습할 수 있는 추가 리소스입니다.
- C++에 계속 집중하려면 일반적인 C++ 빌드 사용 사례를 참조하세요.
- Bazel을 사용하여 다른 애플리케이션을 빌드하려면 자바, Android용 튜토리얼 애플리케이션 또는 iOS 애플리케이션으로 이동합니다.
- 로컬 및 원격 저장소 작업에 대한 자세한 내용은 다음을 참조하세요. 외부 종속 항목.
- Bazel의 다른 규칙에 대한 자세한 내용은 이 참조를 확인하세요. 가이드를 참조하세요.
즐겁게 빌드하세요!