이 페이지는 Bazel에 익숙하다고 가정하고 가이드라인을 제공하며 Bazel의 기능을 최대한 활용하려면 프로젝트를 구성하는 방법에 대한 조언을 참조하세요.
전체 목표는 다음과 같습니다.
- 세분화된 종속 항목을 사용하여 동시 로드 및 성과 증분을 허용하기 위해
- 종속 항목을 잘 캡슐화하기 위해
- 코드의 구조를 잘 잡고 테스트 가능하도록 하기 위함입니다.
- 이해하고 유지관리하기 쉬운 빌드 구성을 만들기 위해
이 가이드라인은 요구사항이 아닙니다. 모든 프로젝트가 이를 준수할 수는 없습니다. 린트의 man 페이지에 따르면 '엄격한 검사로 오류를 전혀 발생시키지 않는 실제 프로그램을 처음으로 작성한 사람에게는 특별한 보상이 제공됩니다.' 하지만 이러한 원칙을 최대한 많이 통합하면 프로젝트를 더 읽기 쉽게 만들고, 오류가 발생할 가능성을 줄이며, 빌드 속도를 높일 수 있습니다.
이 페이지에서는 이 RFC에 설명된 요구사항 수준을 사용합니다.
빌드 및 테스트 실행
프로젝트는 항상 안정적인 브랜치에서 bazel build //...
및 bazel test //...
를 실행할 수 있어야 합니다. 필요한 타겟이지만 특정 상황에서 빌드되지 않는 타겟(예: 특정 빌드 플래그 필요, 특정 플랫폼에서 빌드되지 않음, 라이선스 계약 필요)은 최대한 구체적으로 태그를 지정해야 합니다(예: 'requires-osx
'). 이렇게 태그를 지정하면 '수동' 태그보다 더 세분화된 수준에서 타겟을 필터링할 수 있으며 BUILD
파일을 검사하는 사용자가 타겟의 제한사항을 파악할 수 있습니다.
타사 종속 항목
서드 파티 종속 항목을 선언할 수 있습니다.
MODULE.bazel
파일에서 원격 저장소로 선언합니다.- 또는 작업공간 디렉터리 아래의
third_party/
디렉터리에 파일을 넣습니다.
바이너리에 따라 다름
가능하면 모든 것을 소스에서 빌드해야 합니다. 일반적으로 이는
이렇게 하면 some-library.so
라이브러리에 종속되는 대신
BUILD
파일을 빌드하고 소스에서 some-library.so
를 빌드한 후 여기에 의존합니다.
있습니다.
항상 소스에서 빌드하면 빌드에서 호환되지 않는 플래그나 다른 아키텍처로 빌드되었습니다. 또한 소스에서만 작동하는 적용 범위, 정적 분석, 동적 분석과 같은 일부 기능도 있습니다.
버전 관리
가능하면 항상 헤드에서 모든 코드를 빌드하는 것이 좋습니다. 버전이
대상 이름에 버전을 포함하지 않도록 합니다 (예: //guava
,
(//guava-20.0
가 아님) 이렇게 이름을 지정하면 라이브러리를 더욱 쉽게 업데이트할 수 있습니다 (하나만 선택 가능).
타겟을 업데이트해야 함). 다이아몬드 종속 항목에 대해서도 복원력이 우수합니다.
문제: 한 라이브러리는 guava-19.0
에 종속되고 다른 라이브러리는 guava-20.0
에 종속되는 경우
두 가지 다른 버전에 종속하려고 하는 라이브러리가 될 수 있습니다.
두 타겟을 하나의 guava
라이브러리로 가리키는 혼동을 야기하는 별칭을 만든 경우 BUILD
파일이 혼동을 야기합니다.
.bazelrc
파일 사용
프로젝트별 옵션의 경우 workspace/.bazelrc
의 구성 파일을 사용하세요(bazelrc 형식 참고).
소스 제어에 체크인하지 않으려는 프로젝트의 사용자별 옵션을 지원하려면 다음 줄을 포함합니다.
try-import %workspace%/user.bazelrc
(또는 다른 파일 이름)을 workspace/.bazelrc
에 저장합니다.
그리고 .gitignore
에 user.bazelrc
를 추가합니다.
패키지
빌드 가능한 파일을 포함하는 모든 디렉터리는 패키지여야 합니다. BUILD
파일이 하위 디렉터리의 파일(예: srcs = ["a/b/C.java"]
)을 참조하는 경우 BUILD
파일을 해당 하위 디렉터리에 추가해야 한다는 신호입니다. 오래 걸릴수록
순환 종속 항목이 많아질수록
타겟 범위가 증가하면 그 범위가
업데이트해야 합니다