Bazel은 다양한 옵션을 허용합니다. 일부 옵션은 자주 변경되지만(예: --subcommands
) 일부 빌드는 여러 빌드(예: --package_path
)에서 동일하게 유지됩니다. 모든 빌드(및 기타 명령어)에 이러한 변경되지 않은 옵션을 지정하지 않으려면 구성 파일(.bazelrc
)에 옵션을 지정할 수 있습니다.
.bazelrc
파일은 어디에 있나요?
Bazel이 다음 위치에서 아래 표시된 순서대로 선택적 구성 파일을 찾습니다. 옵션은 이 순서로 해석되므로 충돌이 발생하면 이후 파일의 옵션이 이전 파일의 값을 재정의할 수 있습니다. 이러한 파일 중 하나를 제어하는 모든 옵션은 시작 옵션이므로 bazel
이후 및 명령어 (build
, test
등) 전에 발생해야 합니다.
시스템 RC 파일(
--nosystem_rc
가 없는 경우)경로:
- Linux/macOS/Unixes:
/etc/bazel.bazelrc
- Windows의 경우:
%ProgramData%\bazel.bazelrc
이 파일이 없어도 오류는 아닙니다.
다른 시스템 지정 위치가 필요한 경우
//src/main/cpp:option_processor
의BAZEL_SYSTEM_BAZELRC_PATH
값을 재정의하여 커스텀 Bazel 바이너리를 빌드해야 합니다. 시스템 지정 위치에는 Unix의${VAR_NAME}
또는 Windows의%VAR_NAME%
과 같은 환경 변수 참조가 포함될 수 있습니다.- Linux/macOS/Unixes:
작업공간 RC 파일(
--noworkspace_rc
가 없는 경우)경로: 작업공간 디렉터리의
.bazelrc
(기본WORKSPACE
파일 옆)이 파일이 없어도 오류는 아닙니다.
홈 RC 파일(
--nohome_rc
가 있는 경우 제외)경로:
- Linux/macOS/Unixes:
$HOME/.bazelrc
- Windows의 경우:
%USERPROFILE%\.bazelrc
(존재하는 경우) 또는%HOME%/.bazelrc
이 파일이 없어도 오류는 아닙니다.
- Linux/macOS/Unixes:
사용자 지정 RC 파일(
--bazelrc=file
로 지정된 경우)이 플래그는 선택사항이지만 여러 번 지정할 수도 있습니다.
/dev/null
는 모든 추가--bazelrc
이 무시된다는 것을 나타냅니다. 이는 출시 빌드에서와 같이 사용자 rc 파일의 검색을 사용 중지하는 데 유용합니다.예를 들면 다음과 같습니다.
--bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc
x.rc
및y.rc
를 읽습니다.- 이전
/dev/null
로 인해z.rc
는 무시됩니다.
이 선택적 구성 파일 외에도 Bazel은 전역 rc 파일을 찾습니다. 자세한 내용은 글로벌 bazelrc 섹션을 참고하세요.
.bazelrc
구문 및 시맨틱스
모든 UNIX 'rc' 파일과 마찬가지로 .bazelrc
파일은 행 기반 문법이 있는 텍스트 파일입니다. #
(댓글)로 시작하는 빈 줄과 줄은 무시됩니다. 각 줄에는 단어 셸이 포함되며 이는 일련의본 셸과 동일한 규칙에 따라 토큰화됩니다.
가져오기
import
또는 try-import
로 시작하는 줄은 특수합니다. 이를 사용하여 다른 'rc' 파일을 로드합니다. 작업공간 루트를 기준으로 하는 경로를 지정하려면 import %workspace%/path/to/bazelrc
을 작성합니다.
import
와 try-import
의 차이점은 import
된 파일이 누락되거나 읽을 수 없는 경우 Bazel이 실패한다는 것입니다. try-import
된 파일에서는 그렇지 않습니다.
우선순위 가져오기:
- 가져온 파일의 옵션은 import 문 앞에 지정된 옵션보다 우선합니다.
- import 문 다음에 지정된 옵션이 가져온 파일의 옵션보다 우선합니다.
- 나중에 가져온 파일의 옵션이 이전에 가져온 파일보다 우선 적용됩니다.
옵션 기본값
bazelrc의 줄 대부분은 기본 옵션 값을 정의합니다. 각 행의 첫 번째 단어는 이러한 기본값이 적용되는 경우를 지정합니다.
startup
: 명령어 앞에 오는 시작 옵션이며bazel help startup_options
에 설명되어 있습니다.common
: 이를 지원하는 모든 Bazel 명령어에 적용되어야 하는 옵션입니다. 명령어가 이러한 방식으로 지정된 옵션을 지원하지 않는 경우 이 옵션은 일부 다른 Bazel 명령어에 대해 유효하면 무시됩니다. 이는 옵션 이름에만 적용됩니다. 현재 명령어가 지정된 이름의 옵션을 허용하지만 지정된 값을 지원하지 않는 경우 실패합니다.always
: 모든 Bazel 명령어에 적용되는 옵션입니다. 이 방법으로 지정된 옵션을 지원하지 않는 명령어는 실패합니다.command
: Bazel 명령어(옵션이 적용되는build
또는query
)입니다. 이러한 옵션은 지정된 명령어에서 상속된 모든 명령어에도 적용됩니다. 예를 들어test
는build
에서 상속받습니다.
이러한 각 줄은 두 번 이상 사용할 수 있으며 첫 번째 단어 다음에 오는 인수는 한 줄에 표시된 것처럼 결합됩니다. ('Swiss 군용 칼' 명령줄 인터페이스가 있는 또 다른 도구인 CVS 사용자는 .cvsrc
의 문법과 유사한 구문을 찾을 수 있습니다. 예를 들어 다음과 같습니다.
build --test_tmpdir=/tmp/foo --verbose_failures
build --test_tmpdir=/tmp/bar
다음과 같이 결합됩니다.
build --test_tmpdir=/tmp/foo --verbose_failures --test_tmpdir=/tmp/bar
따라서 유효 플래그는 --verbose_failures
및 --test_tmpdir=/tmp/bar
입니다.
옵션 우선순위:
- 명령줄의 옵션은 항상 rc 파일의 옵션보다 우선합니다.
예를 들어 rc 파일에
build -c opt
이 표시되지만 명령줄 플래그가-c dbg
이면 명령줄 플래그가 우선 적용됩니다. rc 파일 내에서 우선순위는 구체성의 영향을 받습니다. 더 구체적인 명령어의 행이 덜 구체적인 명령어의 행보다 우선합니다.
구체성은 상속에 의해 정의됩니다. 일부 명령어는 다른 명령어에서 옵션을 상속하므로 상속 명령어가 기본 명령어보다 더 구체적입니다. 예를 들어
test
는build
명령어에서 상속되므로 모든bazel build
플래그는bazel test
에 유효하고 동일한build
에 관한test
줄이 없으면 모든build
줄이bazel test
에도 적용됩니다. rc 파일의 내용은 다음과 같습니다.test -c dbg --test_env=PATH
build -c opt --verbose_failures
그러면
bazel build //foo
는-c opt --verbose_failures
를 사용하고bazel test //foo
는--verbose_failures -c dbg --test_env=PATH
를 사용합니다.상속 (특이도) 그래프는 다음과 같습니다.
- 모든 명령어는
common
에서 상속됩니다. - 다음 명령어가
build
에서 상속되고 더 구체적입니다.test
,run
,clean
,mobile-install
,info
,print_action
,config
,cquery
,aquery
coverage
가test
에서 상속됨
- 모든 명령어는
동일한 명령어에 대해 동일한 명령어에 대한 옵션을 지정하는 두 줄은 파일 내에 나타나는 순서대로 파싱됩니다.
이 우선순위 규칙은 파일 순서와 일치하지 않으므로 rc 파일 내의 우선순위 순서를 따르면 가독성이 높아집니다. 맨 위에 있는
common
옵션으로 시작하고 맨 아래에 있는 가장 구체적인 명령어로 끝납니다. 이렇게 하면 옵션을 읽는 순서가 옵션이 적용되는 순서와 동일하므로 더 직관적입니다.
rc 파일의 한 줄에 지정된 인수에는 빌드 타겟의 이름과 같이 옵션이 아닌 인수가 포함될 수 있습니다. 이러한 옵션은 동일한 파일에 지정된 옵션과 마찬가지로 명령줄의 동위 요소보다 우선순위가 낮으며 항상 옵션이 아닌 인수의 명시적 목록 앞에 추가됩니다.
--config
옵션 기본값을 설정하는 것 외에도 rc 파일을 사용하여 옵션을 그룹화하고 일반적인 그룹화를 간략하게 제공할 수 있습니다. 이렇게 하려면 명령어에 :name
접미사를 추가하면 됩니다. 이러한 옵션은 기본적으로 무시되지만 --config=name
옵션이 있는 경우(예: 명령줄 또는 .bazelrc
파일에) 재귀적으로 다른 구성 정의 내에서도 포함됩니다. command:name
에 의해 지정된 옵션은 위에 설명된 우선순위에 따라 적용 가능한 명령어에 대해서만 확장됩니다.
--config=foo
는 rc 파일에 정의된 옵션으로 '제자리에 배치'되어 구성에 지정된 옵션이 --config=foo
옵션과 동일한 우선순위를 갖게 됩니다.
이 구문은 startup
를 사용하여 시작 옵션을 설정하는 것으로 확장되지 않습니다. .bazelrc에서 startup:config-name --some_startup_option
설정은 무시됩니다.
예
다음은 ~/.bazelrc
파일의 예입니다.
# Bob's Bazel option defaults
startup --host_jvm_args=-XX:-UseParallelGC
import /home/bobs_project/bazelrc
build --show_timestamps --keep_going --jobs 600
build --color=yes
query --keep_going
# Definition of --config=memcheck
build:memcheck --strip=never --test_timeout=3600
Bazel의 동작을 제어하는 기타 파일
.bazelignore
다른 빌드 시스템을 사용하는 관련 프로젝트와 같이 Bazel이 무시할 작업공간 내에 디렉터리를 지정할 수 있습니다. 작업공간의 루트에 .bazelignore
라는 파일을 배치하고 Bazel이 무시할 디렉터리를 한 줄에 하나씩 추가합니다. 항목은 작업공간 루트를 기준으로 합니다.
전역 bazelrc 파일
Bazel은 다음 순서에 따라 bazelrc 파일을 선택적으로 읽습니다.
- 시스템 rc-file은
etc/bazel.bazelrc
에 있습니다. $workspace/tools/bazel.rc
에 Workspace rc-file이 있습니다.$HOME/.bazelrc
에 홈 rc 파일이 있습니다.
여기에 나열된 각 bazelrc 파일에는 이를 사용 중지하는 데 사용할 수 있는 해당 플래그 (예: --nosystem_rc
, --noworkspace_rc
, --nohome_rc
)가 있습니다. 또한 --ignore_all_rc_files
시작 옵션을 전달하여 Bazel이 모든 bazelrcs를 무시하도록 할 수 있습니다.