클라이언트/서버 구현

문제 신고 소스 보기 Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel 시스템은 장기 실행 서버 프로세스로 구현됩니다. 이를 통해 한 빌드에서 다음 빌드로의 BUILD 파일, 종속 항목 그래프, 기타 메타데이터 캐싱과 같이 일괄 처리 중심 구현에서는 불가능한 여러 최적화를 실행할 수 있습니다. 이렇게 하면 증분 빌드 속도가 개선되고 buildquery와 같은 여러 명령어가 로드된 패키지의 동일한 캐시를 공유할 수 있으므로 쿼리가 매우 빠릅니다.

bazel를 실행하면 클라이언트를 실행하는 것입니다. 클라이언트는 기본 워크스페이스 디렉터리의 경로와 사용자 ID에 따라 기본적으로 결정되는 출력 기반을 기반으로 서버를 찾습니다. 따라서 여러 워크스페이스에서 빌드하면 여러 출력 기반이 생성되므로 여러 Bazel 서버 프로세스가 생성됩니다. 출력 기반이 다르므로 (사용자 ID가 다름) 동일한 워크스테이션의 여러 사용자가 동일한 워크스페이스에서 동시에 빌드할 수 있습니다.

클라이언트가 실행 중인 서버 인스턴스를 찾을 수 없는 경우 새 인스턴스를 시작합니다. 이렇게 하려면 출력 기반이 이미 있는지 확인합니다. 즉, 블레이즈 보관 파일이 이미 압축 해제되었음을 의미합니다. 출력 기반이 없으면 클라이언트는 보관 파일의 파일의 압축을 풀고 mtime를 9년 후의 날짜로 설정합니다. 설치가 완료되면 클라이언트는 설치 조작이 발생하지 않았는지 확인하기 위해 압축을 푼 파일의 mtime가 먼 날짜와 동일한지 확인합니다.

서버 프로세스는 일정 시간 (기본적으로 3시간, 시작 옵션 --max_idle_secs를 사용하여 수정 가능) 동안 비활성 상태가 되면 중지됩니다. 대부분의 경우 서버가 실행 중이라는 사실은 사용자에게 표시되지 않지만 이 점을 염두에 두는 것이 좋습니다. 예를 들어 여러 디렉터리에서 많은 자동 빌드를 실행하는 스크립트를 실행하는 경우 유휴 서버가 많이 쌓이지 않도록 하는 것이 중요합니다. 이렇게 하려면 작업이 완료되면 서버를 명시적으로 종료하거나 짧은 제한 시간을 지정하면 됩니다.

Bazel 서버 프로세스의 이름은 ps x 또는 ps -e f의 출력에 bazel(dirname)로 표시되며 여기서 dirname은 워크스페이스 디렉터리의 루트를 포함하는 디렉터리의 기본 이름입니다. 예를 들면 다음과 같습니다.

ps -e f
16143 ?        Sl     3:00 bazel(src-johndoe2) -server -Djava.library.path=...

이렇게 하면 특정 워크스페이스에 속한 서버 프로세스를 더 쉽게 찾을 수 있습니다. (ps의 다른 특정 옵션을 사용하면 Bazel 서버 프로세스의 이름이 java로 지정될 수 있습니다.) Bazel 서버는 shutdown 명령어를 사용하여 중지할 수 있습니다.

bazel를 실행할 때 클라이언트는 먼저 서버가 적절한 버전인지 확인합니다. 그렇지 않으면 서버가 중지되고 새 서버가 시작됩니다. 이렇게 하면 장기 실행 서버 프로세스 사용이 적절한 버전 관리를 방해하지 않습니다.