BazelCon 2022는 11월 16~17일에 뉴욕과 온라인에서 개최됩니다.
지금 등록하기

백과사전 테스트

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

테스트 실행 환경의 전체 사양입니다.

배경

Bazel BUILD 언어에는 여러 언어로 자동화된 테스트 프로그램을 정의하는 데 사용할 수 있는 규칙이 포함되어 있습니다.

테스트는 bazel test를 사용하여 실행됩니다.

사용자가 테스트 바이너리를 직접 실행할 수도 있습니다. 이러한 호출은 아래에 설명된 의무를 준수하지 않으므로 허용되지만 보증되지 않습니다.

테스트는 밀폐되어야 합니다. 즉, 선언된 종속 항목이 있는 리소스에만 액세스해야 했습니다. 테스트가 밀폐되지 않으면 기록적으로 재현 가능한 결과를 제공하지 않습니다. 이는 문제의 발견 (테스트가 중단된 변경사항 확인), 출시 엔지니어링 감사 가능성, 테스트 리소스 격리 (심각한 일부 테스트의 경우 DDOS가 아니라 서버를 테스트해야 함)에서 상당한 문제가 될 수 있습니다.

목표

이 페이지의 목표는 Bazel 테스트의 런타임 환경을 공식적으로 수립하는 것입니다. 또한 테스트 실행기와 빌드 시스템에도 요구사항을 적용합니다.

테스트 환경 사양을 사용하면 테스트 작성자가 지정되지 않은 동작에 의존하지 않아도 되므로 테스트 인프라에서 더욱 자유롭게 구현을 변경할 수 있습니다. 이 사양은 제대로 밀폐되고 확정되지 않으며 재진입이 가능하지 않더라도 현재 많은 테스트를 통과할 수 있도록 하는 일부 구멍을 강화합니다.

이 페이지는 표준적이고 권위 있는 것입니다. 이 사양과 테스트 실행기의 구현된 동작이 일치하지 않으면 사양이 우선 적용됩니다.

제안된 사양

키워드 필수 기능

테스트 목적

Bazel 테스트의 목적은 저장소에 체크인된 소스 파일의 일부 속성을 확인하는 것입니다. 이 페이지의 '소스 파일'에는 테스트 데이터, 골든 출력 및 버전 제어하에 유지되는 기타 항목이 포함됩니다. 한 명의 사용자가 유지관리될 것으로 예상되는 불변성을 어설션하기 위한 테스트를 작성합니다. 다른 사용자는 나중에 테스트를 실행하여 불변이 손상되었는지 확인합니다. 밀폐가 아닌 소스 파일에 종속된 테스트가 테스트라면 해당 값이 줄어듭니다. 그 이유는 테스트 통과가 중지될 때 이후 사용자가 변경사항을 잘못 적용했는지 확인할 수 없기 때문입니다.

따라서 테스트의 결과는 다음 항목에만 의존해야 합니다.

  • 테스트에 선언된 종속 항목이 있는 소스 파일
  • 테스트에서 선언된 종속 항목이 있는 빌드 시스템의 제품
  • 테스트 실행기에 의해 동작이 일관되게 보장되는 리소스

현재 이러한 행위는 시행되지 않습니다. 그러나 테스트 실행기는 향후 이러한 시정 조치를 추가할 권리를 보유합니다.

빌드 시스템의 역할

테스트 규칙은 각각 실행 프로그램을 생성해야 한다는 점에서 바이너리 규칙과 유사합니다. 일부 언어의 경우 언어별 하네스를 테스트 코드와 결합하는 스텁 프로그램입니다. 테스트 규칙은 다른 출력도 생성해야 합니다. 테스트 실행기는 기본 테스트 실행 파일 외에도 runfiles 매니페스트가 필요하며, 런타임 시 테스트에 사용할 수 있도록 입력 파일이 필요하며, 테스트의 유형, 크기 및 태그에 관한 정보가 필요할 수 있습니다.

빌드 시스템은 runfile을 사용하여 코드와 데이터를 제공할 수 있습니다. 동적 링크 사용 등을 통해 테스트 간에 파일을 공유하여 각 테스트 바이너리를 더 작게 만들기 위한 최적화로 사용할 수 있습니다. 빌드 시스템은 생성된 실행 파일이 소스 또는 출력 트리의 절대 위치에 대한 하드코딩 참조가 아닌 테스트 실행기에서 제공하는 runfiles 이미지를 통해 이러한 파일을 로드하도록 해야 합니다.

테스트 실행기 역할

테스트 실행기의 관점에서 각 테스트는 execve()로 호출할 수 있는 프로그램입니다. 테스트를 실행하는 다른 방법이 있을 수 있습니다. 예를 들어 IDE에서 처리 중인 자바 테스트가 실행되도록 허용할 수 있습니다. 그러나 테스트를 독립형 프로세스로 실행하는 결과는 신뢰할 수 있는 것으로 간주해야 합니다. 테스트 프로세스가 완료될 때까지 실행되고 종료 코드가 0인 상태에서 정상적으로 종료되면 테스트가 통과된 것입니다. 다른 결과는 모두 테스트 실패로 간주됩니다. 특히 stdout에 문자열 PASS 또는 FAIL를 작성해도 테스트 실행자에게 유의미한 의미가 없습니다.

테스트를 실행하는 데 시간이 너무 오래 걸리거나, 일부 리소스 한도를 초과하거나, 테스트 실행자가 금지된 동작을 감지하는 경우, 테스트를 종료하고 실행을 실패로 취급할 수 있습니다. 실행기는 테스트 프로세스 또는 테스트의 하위 요소에 신호를 보낸 후에 테스트를 통과한 것으로 보고해서는 안 됩니다.

개별 메서드나 테스트가 아닌 전체 테스트 대상에 완료될 때까지 제한된 시간이 주어집니다. 테스트 시간 제한은 다음 표에 따라 timeout 속성을 기반으로 합니다.

timeout 시간 제한 (초)
short 60
보통 300
long 900
영원한 3600

제한 시간을 명시적으로 지정하지 않는 테스트에는 테스트 size에 따라 다음과 같이 암시됩니다.

크기 암시적 제한 시간 라벨
small short
중간 보통
대형 long
거대한 영원한

명시적인 제한 시간 설정이 없는 '대규모' 테스트는 900초 동안 할당됩니다. 제한 시간이 '짧은 시간'인 '중형' 테스트가 60초 동안 할당됩니다.

timeout와 달리 size일반 정의에 설명된 대로 로컬에서 테스트를 실행할 때 다른 리소스 (예: RAM)의 가정된 최대 사용량을 추가로 결정합니다.

sizetimeout 라벨의 모든 조합이 합법적이므로 'quot;enormous" 테스트의 제한 시간이 'quot;short"'로 선언될 수 있습니다. 매우 끔찍한 일이 빠르게 진행될 것입니다.

테스트는 시간 제한과 상관없이 임의로 빠르게 반환될 수 있습니다. 테스트는 과도한 제한 시간 동안 불이익을 받지는 않지만, 경고가 발행될 수도 있습니다. 일반적으로 결함이 없는 상태가 아니면 제한 시간을 최대한 짧게 설정해야 합니다.

느리다고 알려진 조건에서 수동으로 실행할 때 테스트 제한 시간은 --test_timeout 베이스 플래그로 재정의할 수 있습니다. --test_timeout 값은 초 단위입니다. 예를 들어 --test_timeout=120는 테스트 제한 시간을 2분으로 설정합니다.

테스트 제한 시간에는 다음과 같은 권장 하한값도 있습니다.

timeout 최소 시간 (초)
short 0
보통 30
long 300
영원한 900

예를 들어 "moderate" 테스트가 5.5초 내에 완료되면 timeout = "short" 또는 size = "small"을 설정하는 것이 좋습니다. bazel --test_verbose_timeout_warnings 명령줄 옵션을 사용하면 지정된 크기가 너무 큰 테스트가 표시됩니다.

테스트 크기 및 시간 제한은 여기의 사양에 따라 BUILD 파일에 지정됩니다. 지정하지 않으면 테스트 크기가 기본적으로 '원본'으로 설정됩니다.

테스트의 기본 프로세스가 종료되었지만 일부 하위 요소가 여전히 실행 중인 경우 테스트 실행기는 실행 완료를 간주하여 기본 프로세스에서 관찰된 종료 코드를 기반으로 성공 또는 실패로 집계해야 합니다. 테스트 실행자가 잘못된 프로세스를 종료할 수 있습니다. 테스트는 이러한 방식으로 프로세스를 유출해서는 안 됩니다.

테스트 샤딩

테스트는 테스트 샤딩을 통해 병렬화할 수 있습니다. 테스트 샤딩을 사용 설정하려면 --test_sharding_strategyshard_count을 참고하세요. 샤딩을 사용 설정하면 테스트 실행기가 샤드당 한 번씩 실행됩니다. 환경 변수 TEST_TOTAL_SHARDS는 샤드 수이고 TEST_SHARD_INDEX는 0부터 시작되는 샤드 색인입니다. 실행기는 이 정보를 사용하여 실행할 테스트(예: 라운드 로빈 전략)를 선택합니다. 일부 테스트 실행기에서는 샤딩을 지원하지 않습니다. 실행기가 샤딩을 지원하면 TEST_SHARD_STATUS_FILE에서 지정된 파일의 최종 수정일을 만들거나 업데이트해야 합니다. 그렇지 않으면 Bazel이 샤딩을 지원하지 않는다고 가정하고 추가 실행기를 실행하지 않습니다.

초기 조건

테스트를 실행할 때 테스트 실행기는 특정 초기 조건을 설정해야 합니다.

테스트 실행기는 argv[0]에서 테스트 실행 파일 경로를 사용하여 각 테스트를 호출해야 합니다. 이 경로는 테스트의 현재 디렉터리 아래에 있어야 합니다(runfiles 트리에 있는 아래 참조). 테스트 실행기는 사용자가 명시적으로 요청하지 않는 한 다른 인수를 테스트에 전달해서는 안 됩니다.

초기 환경 블록은 다음과 같이 구성됩니다.

변수 상태
HOME $TEST_TMPDIR 권장
LANG unset 필수항목
LANGUAGE unset 필수항목
LC_ALL unset 필수항목
LC_COLLATE unset 필수항목
LC_CTYPE unset 필수항목
LC_MESSAGES unset 필수항목
LC_MONETARY unset 필수항목
LC_NUMERIC unset 필수항목
LC_TIME unset 필수항목
LD_LIBRARY_PATH 공유 라이브러리가 포함된 디렉터리의 콜론으로 구분된 목록 선택항목
JAVA_RUNFILES $TEST_SRCDIR 지원 중단됨
LOGNAME $USER 필수항목
PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:. 권장
PWD $TEST_SRCDIR/workspace-name 권장
SHLVL 2 권장
TEST_INFRASTRUCTURE_FAILURE_FILE 쓰기 가능한 디렉터리의 비공개 파일에 대한 절대 경로입니다. 이 파일은 취약한 테스트 실패를 보고하기 위한 일반적인 메커니즘이 아니라 테스트 인프라에서 발생한 오류를 보고하는 용도로만 사용해야 합니다. 이 컨텍스트에서 테스트 인프라는 테스트와 관련이 없지만 오작동으로 인해 테스트 실패를 일으킬 수 있는 시스템 또는 라이브러리로 정의됩니다. 첫 번째 줄은 장애를 일으킨 테스트 인프라 구성요소의 이름이며, 두 번째 줄은 실패를 사용자가 읽을 수 있는 설명입니다. 추가 행은 무시됩니다.) 선택항목
TEST_LOGSPLITTER_OUTPUT_FILE 쓰기 가능한 디렉터리의 비공개 파일에 대한 절대 경로 (Logsplitter protobuffer 로그 작성에 사용됨) 선택항목
TEST_PREMATURE_EXIT_FILE 쓰기 가능한 디렉터리의 비공개 파일에 대한 절대 경로 (exit() 호출을 호출하는 데 사용됨) 선택항목
TEST_RANDOM_SEED --runs_per_test 옵션을 사용하면 TEST_RANDOM_SEED는 개별 테스트 실행마다 run number(1부터 시작)로 설정됩니다. 선택항목
TEST_RUN_NUMBER --runs_per_test 옵션을 사용하면 TEST_RUN_NUMBER는 개별 테스트 실행마다 run number(1부터 시작)로 설정됩니다. 선택항목
TEST_TARGET 테스트 중인 타겟의 이름 선택항목
TEST_SIZE 테스트 size 선택항목
TEST_TIMEOUT 테스트 timeout(초) 선택항목
TEST_SHARD_INDEX 샤드 색인(sharding를 사용하는 경우) 선택항목
TEST_SHARD_STATUS_FILE sharding 지원을 나타내는 터치 경로 선택항목
TEST_SRCDIR runfiles 트리의 기본 경로를 가리키는 절대 경로 필수항목
TEST_TOTAL_SHARDS shard count, sharding가 사용된 경우 선택항목
TEST_TMPDIR 비공개 쓰기 가능 디렉터리의 절대 경로 필수항목
TEST_WORKSPACE 로컬 저장소 작업공간 이름 선택항목
TEST_UNDECLARED_OUTPUTS_DIR (비공개되지 않은 테스트 출력 작성에 사용되는) 비공개 쓰기 가능 디렉터리의 절대 경로입니다. 선택항목
TEST_UNDECLARED_OUTPUTS_ANNOTATIONS_DIR 비공개 쓰기 가능 디렉터리의 절대 경로입니다 (선언되지 않은 테스트 출력 주석 .part.pb 파일을 작성하는 데 사용됨). 선택항목
TEST_WARNINGS_OUTPUT_FILE 쓰기 가능한 디렉터리의 비공개 파일에 대한 절대 경로 (테스트 타겟 경고를 작성하는 데 사용됨) 선택항목
TESTBRIDGE_TEST_ONLY --test_filter 값(지정된 경우) 선택항목
TZ UTC 필수항목
USER getpwuid(getuid())->pw_name 필수항목
XML_OUTPUT_FILE 테스트 결과 XML 출력 파일의 위치입니다. XML 스키마는 JUnit 테스트 결과 스키마를 기반으로 합니다. 선택항목
BAZEL_TEST 테스트 실행 파일이 bazel test에 의해 구동되고 있음을 나타냅니다. 필수항목

환경에는 추가 항목이 포함될 수 있습니다. 테스트는 위에 나열되지 않은 환경 변수의 존재, 부재 또는 값에 의존해서는 안 됩니다.

초기 작업 디렉터리는 $TEST_SRCDIR/$TEST_WORKSPACE입니다.

현재 프로세스 ID, 프로세스 그룹 ID, 세션 ID, 상위 프로세스 ID가 지정되지 않았습니다. 프로세스는 프로세스 그룹 리더 또는 세션 리더일 수 있습니다. 프로세스에 제어 터미널이 있을 수도 있고 없을 수도 있습니다. 프로세스에 실행 중인 하위 프로세스가 0개 이상 있을 수 있습니다. 테스트 코드가 제어권을 획득할 때 프로세스에 여러 스레드가 있어서는 안 됩니다.

파일 설명자 0 (stdin)은 읽기를 위해 열려 있지만 연결되지 않은 파일은 지정되지 않습니다. 테스트는 여기에서 읽을 수 없습니다. 파일 설명자 1(stdout)과 2(stderr)는 쓰기 작업을 위해 열려 있지만 연결된 항목이 지정되지 않았습니다. 터미널, 파이프, 일반 파일 또는 문자를 쓸 수 있는 모든 항목이 될 수 있습니다. 공개 파일 표의 항목을 공유할 수 있습니다(즉, 독립적으로 탐색할 수 없음). 테스트는 다른 열려 있는 파일 설명자를 상속해서는 안 됩니다.

초기 umask는 022 또는 027입니다.

대기 중인 알람 또는 인터벌 타이머는 없습니다.

차단된 신호의 초기 마스크는 비어 있습니다. 모든 신호는 기본 작업으로 설정됩니다.

Soft 및 하드의 초기 리소스 한도는 다음과 같이 설정해야 합니다.

리소스 한도
RLIMIT_AS 무제한
RLIMIT_CORE 미지정
RLIMIT_CPU 무제한
RLIMIT_DATA 무제한
RLIMIT_FSIZE 무제한
RLIMIT_LOCKS 무제한
RLIMIT_MEMLOCK 무제한
RLIMIT_MSGQUEUE 미지정
RLIMIT_NICE 미지정
RLIMIT_NOFILE 1024 이상
RLIMIT_NPROC 미지정
RLIMIT_RSS 무제한
RLIMIT_RTPRIO 미지정
RLIMIT_SIGPENDING 미지정
RLIMIT_STACK 무제한 또는 2044KB <= rlim <= 8192KB

초기 프로세스 시간 (times()에서 반환됨) 및 리소스 사용률(getrusage()에서 반환됨)이 지정되지 않습니다.

초기 예약 정책 및 우선순위는 지정되지 않습니다.

호스트 시스템의 역할

테스트 실행기가 직접 제어하는 사용자 컨텍스트의 측면 외에도, 테스트를 실행하는 운영체제가 테스트 실행이 유효하려면 특정 속성을 충족해야 합니다.

파일 시스템

테스트에서 관찰된 루트 디렉터리는 실제 루트 디렉터리일 수도 있고 그렇지 않을 수도 있습니다.

/proc가 마운트됩니다.

모든 빌드 도구는 로컬 설치에서 사용되는 /usr 아래의 절대 경로에 있어야 합니다.

/home로 시작하는 경로를 사용하지 못할 수 있습니다. 테스트는 이러한 경로에 액세스해서는 안 됩니다.

/tmp는 쓰기 가능하지만 테스트에서는 이러한 경로를 사용해서는 안 됩니다.

테스트에서는 어떤 상수 경로만 사용할 수 있다고 가정해서는 안 됩니다.

테스트는 마운트된 파일 시스템에 시간이 사용 설정되어 있다고 가정해서는 안 됩니다.

사용자 및 그룹

사용자 루트, 사용자, 단위 테스트가 있어야 합니다. 루트, 아무도, eng 그룹이 있어야 합니다.

테스트는 루트가 아닌 사용자로 실행되어야 합니다. 실제 사용자 ID와 유효 사용자 ID는 그룹 ID와 같아야 합니다. 그 외에도 현재 사용자 ID, 그룹 ID, 사용자 이름, 그룹 이름이 지정되지 않습니다. 보조 그룹 ID 집합은 지정되지 않습니다.

현재 사용자 ID와 그룹 ID에는 getpwuid()getgrgid()을 사용하여 가져올 수 있는 해당 이름이 있어야 합니다. 보조 그룹 ID의 경우도 마찬가지입니다.

현재 사용자는 홈 디렉터리가 있어야 합니다. 쓰기가 불가능할 수 있습니다. 테스트에서 작성하려고 시도해서는 안 됩니다.

네트워킹

호스트 이름이 지정되지 않았습니다. 점이 포함되거나 포함되지 않을 수 있습니다. 호스트 이름을 확인하면 현재 호스트의 IP 주소를 제공해야 합니다. 첫 번째 점을 완료한 후 호스트 이름을 잘라내야 합니다. 호스트 이름 localhost는 이를 확인해야 합니다.

기타 리소스

테스트에는 CPU 코어가 하나 이상 부여됩니다. 다른 항목은 사용할 수 있지만 보장되지는 않습니다. 이 코어의 다른 성능 측면은 지정되지 않습니다. 테스트 규칙에 'quot;cpu:n" (n은 양의 숫자) 태그를 추가하면 예약을 더 많은 수의 CPU 코어로 늘릴 수 있습니다. 머신의 총 CPU 코어가 요청된 것보다 적은 경우에도 Bazel이 여전히 테스트를 실행합니다. 테스트에서 샤딩을 사용하면 각 개별 샤드는 여기에 지정된 CPU 코어 수를 예약합니다.

테스트에서 하위 프로세스를 만들 수 있지만 프로세스 그룹 또는 세션을 만들 수는 없습니다.

테스트에서 사용할 수 있는 입력 파일 수에는 제한이 있습니다. 이 한도는 변경될 수 있지만 현재 수만 개의 입력 범위에 있습니다.

시간 및 날짜

현재 시간과 날짜가 지정되지 않았습니다. 시스템 시간대가 지정되지 않았습니다.

X Windows는 사용이 불가능할 수 있습니다. X 서버가 필요한 테스트는 Xvfb를 시작해야 합니다.

파일 시스템과의 상호작용 테스트

테스트 환경 변수에 지정된 모든 파일 경로는 달리 명시되지 않는 한 로컬 파일 시스템의 특정 위치를 가리킵니다.

테스트는 $TEST_TMPDIR$TEST_UNDECLARED_OUTPUTS_DIR로 설정된 디렉터리 내에서만 파일을 만들어야 합니다 (설정된 경우).

이러한 디렉터리는 기본적으로 비어 있습니다.

테스트에서 이러한 디렉터리를 삭제, chmod 또는 변경하려고 시도해서는 안 됩니다.

이러한 디렉터리는 심볼릭 링크일 수 있습니다.

$TEST_TMPDIR/.의 파일 시스템 유형은 지정되지 않습니다.

테스트에서 .part 파일을 $TEST_UNDECLARED_OUTPUTS_ANNOTATIONS_DIR에 작성하여 선언되지 않은 출력 파일에 주석을 달 수도 있습니다.

드물지만 /tmp에 테스트가 생성되어야 할 수 있습니다. 예를 들어 UNIX 도메인 소켓의 경로 길이 제한은 일반적으로 /tmp 아래에 소켓을 만들어야 합니다. Bazel은 이러한 파일을 추적할 수 없습니다. 테스트 자체가 밀폐되어야 하므로 고유 경로를 사용하여 다른 테스트 및 비테스트 프로세스 동시 실행 충돌을 방지하고 /tmp에서 만든 파일을 정리해야 합니다.

JUnit4 TemporaryFolder 또는 Go TempDir와 같은 인기 테스트 프레임워크에는 /tmp에 임시 디렉터리를 만드는 고유한 방법이 있습니다. 이러한 테스트 프레임워크에는 /tmp에서 파일을 정리하는 기능이 포함되어 있으므로 TEST_TMPDIR 외부에서 파일을 만들더라도 사용할 수 있습니다.

테스트는 runfiles 메커니즘 또는 특히 입력 파일을 사용할 수 있도록 실행 환경의 다른 부분을 통해 입력에 액세스해야 합니다.

테스트는 자체 실행 파일의 위치에서 추론된 경로에서 빌드 시스템의 다른 출력에 액세스해서는 안 됩니다.

runfiles 트리에 일반 파일, 기호화된 링크 또는 혼합이 포함되어 있는지는 지정되지 않습니다. runfiles 트리에는 디렉터리에 대한 심볼릭 링크가 포함될 수 있습니다. 테스트는 실행 파일 트리 내에서 .. 구성요소를 포함하는 경로를 사용하지 않아야 합니다.

실행 파일 트리 내의 디렉터리, 파일 또는 심볼릭 링크 (심볼릭 링크를 순회하는 경로 포함)는 쓰기가 불가능해야 합니다. 초기 작업 디렉터리에 쓰기가 불가능해야 합니다. 테스트는 실행 파일의 일부가 쓰기 가능하거나 현재 사용자가 소유한다고 가정해서는 안 됩니다 (예: chmodchgrp가 실패할 수 있음).

심볼릭 링크를 통과하는 경로를 포함한 runfile 트리는 테스트 실행 중에 변경하면 안 됩니다. 상위 디렉터리와 파일 시스템 마운트는 runfiles 트리 내에서 경로를 확인하는 결과에 영향을 미치면 안 됩니다.

조기 종료를 포착하기 위해 테스트에서는 시작 시 TEST_PREMATURE_EXIT_FILE로 지정된 경로에 파일을 만들고 종료 시 삭제할 수 있습니다. 테스트가 완료될 때 Bazel이 파일을 발견하면 테스트를 조기 종료하여 실패한 것으로 표시합니다.

태그 규칙

테스트 규칙의 일부 태그에는 특별한 의미가 있습니다. tags 속성에 Bazel 빌드 백과사전도 참조하세요.

태그 의미
exclusive 다른 테스트를 동시에 실행하지 않음
external 테스트에 외부 종속 항목이 있습니다. 테스트 캐싱을 사용 중지하세요.
large test_suite 규칙, 대규모 테스트 모음
manual * :..., :* 또는 :all와 같은 와일드 카드 타겟 패턴에 테스트 타겟을 포함하지 않음
medium test_suite 규칙, 중간 규모의 테스트 도구 모음
small test_suite 규칙, 소규모 테스트 모음
smoke test_suite 규칙: 버전 제어 시스템에 코드 변경사항을 커밋하기 전에 실행해야 한다는 것을 의미합니다.

실행 파일

다음 예시에서는 //foo/bar:unittest로 라벨이 지정된 *_binary() 규칙이 //deps/server:server 규칙의 실시간 종속 항목과 함께 있다고 가정합니다.

위치

대상 //foo/bar:unittest의 runfiles 디렉터리는 $(WORKSPACE)/$(BINDIR)/foo/bar/unittest.runfiles 디렉터리입니다. 이 경로를 runfiles_dir라고 합니다.

종속 항목

runfiles 디렉터리는 *_binary() 규칙의 컴파일 시간 종속 항목으로 선언됩니다. runfiles 디렉터리는 *_binary() 규칙 또는 이 객체의 컴파일 시간 또는 런타임 종속 항목에 영향을 미치는 BUILD 파일 세트에 따라 다릅니다. 소스 파일을 수정해도 runfiles 디렉터리의 구조에 영향을 미치지 않으므로 다시 빌드되지 않습니다.

목차

runfiles 디렉터리에는 다음이 포함됩니다.

  • 런타임 종속 항목에 대한 심볼릭 링크: *_binary() 규칙의 런타임 종속 항목인 각 OutputFile 및 CommandRule은 runfiles 디렉터리에 있는 하나의 심볼릭 링크로 표현됩니다. 심볼릭 링크의 이름은 $(WORKSPACE)/package_name/rule_name입니다. 예를 들어 서버의 심볼릭 링크 이름은 $(WORKSPACE)/deps/server/server이며 전체 경로는 $(WORKSPACE)/foo/bar/unittest.runfiles/$(WORKSPACE)/deps/server/server입니다. 심볼릭 링크의 대상은 절대 경로로 표현되는 OutputFile 또는 CommandRule의 OutputFileName()입니다. 따라서 심볼릭 링크 대상은 $(WORKSPACE)/linux-dbg/deps/server/42/server일 수 있습니다.
  • 하위 실행 파일의 심볼릭 링크: *_binary() C의 런타임 종속 항목인 모든 *_binary() Z의 경우 C의 runfile 디렉터리에 Z 실행 파일에 대한 두 번째 링크가 있습니다. 심볼릭 링크의 이름은 $(WORKSPACE)/package_name/rule_name.runfiles입니다. 심볼릭 링크 타겟은 runfiles 디렉터리입니다. 예를 들어 모든 하위 프로그램은 공통 runfiles 디렉터리를 공유합니다.