Bazel 잠금 파일

<ph type="x-smartling-placeholder"></ph> 문제 신고 소스 보기 1박 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel의 잠금 파일 기능을 사용하면 특정 버전 또는 종속 항목을 정의하는 데 사용됩니다. 그것은 모듈 결정 및 확장의 결과를 저장하여 이를 달성합니다. 평가합니다. lockfile은 재현 가능한 빌드를 촉진하여 일관성을 보장합니다. 개발 환경입니다. 또한 빌드 효율성을 향상합니다. Bazel이 변경 사항에 영향을 받지 않는 해결 프로세스 부분을 건너뜁니다. 사용할 수 있습니다 또한 잠금 파일은 외부 라이브러리의 예상치 못한 업데이트나 브레이킹 체인지를 방지하여 버그 도입 위험을 줄일 수 있습니다

Lockfile 생성

잠금 파일은 작업공간 루트에서 다음 이름으로 생성됩니다. MODULE.bazel.lock 빌드 프로세스 중에 생성되거나 업데이트되므로 특히 모듈 결정 및 확장 프로그램 평가 후에 그렇습니다. 중요한 점은 는 있습니다.

종속 항목에 영향을 미치는 프로젝트에 변경사항이 발생하면 잠금 파일은 자동으로 업데이트됩니다. 이렇게 하면 잠금 파일이 현재 애플리케이션에 필요한 특정 종속 항목 집합에 프로젝트의 결정된 상태를 정확하게 나타내는 종속 항목이 포함됩니다

Lockfile 사용

잠금 파일은 --lockfile_mode(으)로 프로젝트 상태가 기본 애플리케이션의 상태와 다를 때 Bazel의 동작을 lockfile을 실행합니다. 사용 가능한 모드는 다음과 같습니다.

  • update (기본값): 잠금 파일에 있는 정보를 사용하여 다음을 수행합니다. 알려진 레지스트리 파일 다운로드를 건너뛰고 확장 프로그램 재평가 방지 항상 최신 상태를 유지합니다. 정보가 누락되면 lockfile에 추가되어야 합니다. 또한 이 모드에서는 Bazel이 종속 항목을 가져오지 않은 경우 변경할 수 있습니다.
  • refresh: update와 같지만 다음 시점에 변경 가능한 정보가 항상 새로고침됨 약 1시간마다 이 모드로 전환합니다.
  • error: update와 같지만 정보가 누락되거나 오래된 경우 Bazel이 오류와 함께 실패합니다. 이 모드는 잠금 파일 또는 확인 중에 네트워크 요청을 수행합니다. 모듈 확장 프로그램 reproducible가 여전히 네트워크 요청을 수행할 수 있지만 항상 동일한 결과를 생성할 것으로 예상됩니다.
  • off: 잠금 파일이 확인되거나 업데이트되지 않습니다.

Lockfile의 이점

잠금 파일은 여러 가지 이점을 제공하며 다양한 방식으로 활용할 수 있습니다.

  • 재현 가능한 빌드. 특정 버전 또는 종속 항목 캡처 잠금 파일을 통해 빌드가 재현 가능한지 확인할 수 있습니다. 살펴봤습니다 개발자는 프로젝트를 빌드할 때 일관되고 예측 가능한 결과를 얻을 수 있습니다

  • 해상도가 빠르게 증가합니다. Bazel은 잠금 파일을 사용하여 이전 빌드에서 이미 사용된 레지스트리 파일 다운로드 이렇게 하면 특히 다음과 같은 시나리오에서 빌드 효율성이 크게 향상됩니다. 해결하는 데 많은 시간이 걸릴 수 있습니다.

  • 안정성 및 위험 감소. 잠금 파일은 외부 라이브러리의 예기치 않은 업데이트나 브레이킹 체인지를 방지할 수 있습니다. 기준 종속 항목을 특정 버전으로 잠금, 버그 발생 위험 발생하는 업데이트로 인한 피해를 줄일 수 있습니다.

Lockfile 콘텐츠

잠금 파일에는 프로젝트 상태가 변경되었습니다 또한 프로젝트를 구축한 결과, 볼 수 있습니다 lockfile은 두 가지 주요 부분으로 구성됩니다.

  1. 모듈 해상도에 대한 입력인 모든 원격 파일의 해시입니다.
  2. 각 모듈 확장의 경우 잠금 파일에는 모듈 확장 프로그램에 영향을 미치는 입력이 포함됩니다. bzlTransitiveDigest, usagesDigest 및 기타 필드로 표현됩니다. 해당 확장 프로그램을 실행한 결과, <ph type="x-smartling-placeholder">generatedRepoSpecs</ph>

다음은 lockfile의 구조를 보여주는 예입니다. 섹션별 설명:

{
  "lockFileVersion": 10,
  "registryFileHashes": {
    "https://bcr.bazel.build/bazel_registry.json": "8a28e4af...5d5b3497",
    "https://bcr.bazel.build/modules/foo/1.0/MODULE.bazel": "7cd0312e...5c96ace2",
    "https://bcr.bazel.build/modules/foo/2.0/MODULE.bazel": "70390338... 9fc57589",
    "https://bcr.bazel.build/modules/foo/2.0/source.json": "7e3a9adf...170d94ad",
    "https://registry.mycorp.com/modules/foo/1.0/MODULE.bazel": "not found",
    ...
  },
  "selectedYankedVersions": {
    "foo@2.0": "Yanked for demo purposes"
  },
  "moduleExtensions": {
    "//:extension.bzl%lockfile_ext": {
      "general": {
        "bzlTransitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    },
    "//:extension.bzl%lockfile_ext2": {
      "os:macos": {
        "bzlTransitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "usagesDigest": "aLmqbvowmHkkBPve05y....yDNGN7oh7r3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      },
      "os:linux": {
        "bzlTransitiveDigest": "eWDzxG/aLsyY3Ubrto....+Jp4maQvEPxn0pLK=",
        "usagesDigest": "aLmqbvowmHkkBPve05y....yDNGN7oh7r3QIZTZs=",
        ...,
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    }
  }
}

레지스트리 파일 해시

registryFileHashes 섹션에는 모듈 확인 중에 액세스한 원격 레지스트리 해상도 동일한 입력이 주어졌을 때 알고리즘이 완전히 확정적입니다. 이를 통해 재현 가능한 해상도 결과를 보장하는 동시에 잠금 파일에 원격 정보가 과도하게 중복되지 않도록 합니다. 참고: 또한 특정 레지스트리에 특정 모듈을 찾을 수 있지만 우선순위가 낮은 레지스트리가 있습니다 (자세한 내용은 아래의 '찾을 수 없음' 항목 참조). 기본적으로 변경 가능한 이 정보는 bazel mod deps --lockfile_mode=refresh

Bazel은 잠금 파일의 해시를 사용하여 캐시하여 후속 작업 속도를 높여줍니다. 결심합니다.

선택한 Yanked 버전

selectedYankedVersions 섹션에는 야크 처리된 버전의 모듈이 포함되어 있음 모듈 해상도에 따라 선택되었습니다 이렇게 하면 일반적으로 빌드하려고 할 때, 이 섹션은 약화된 버전이 사용 중인 경우에만 비어 있지 않습니다. --allow_yanked_versions 또는 BZLMOD_ALLOW_YANKED_VERSIONS

이 필드가 필요한 이유는 모듈 파일과 비교할 때 약화된 버전 정보가 필요하기 때문입니다. 기본적으로 변경 가능하므로 해시에서 참조할 수 없습니다. 이 정보는 bazel mod deps --lockfile_mode=refresh를 통해 업데이트할 수 있습니다.

모듈 확장 프로그램

moduleExtensions 섹션은 사용된 확장 프로그램만 포함하는 지도입니다. 현재 호출 또는 이전에 호출되었으며 확장 프로그램은 제외됨 더 이상 사용되지 않는 즉, 확장 프로그램이 사용 중이지 않은 경우 종속 항목 그래프에서 더 이상 moduleExtensions에서 삭제됩니다. 있습니다.

확장 프로그램이 운영 체제 또는 아키텍처 유형과 무관한 경우 이 섹션에는 하나의 'general' 입력. 그렇지 않으면 여러 번 OS나 아키텍처 또는 둘 다에 따라 이름이 지정되며, 각 항목마다 해당 세부사항에 대한 확장 프로그램을 평가한 결과에 해당합니다.

확장 프로그램 맵의 각 항목은 사용된 확장 프로그램에 해당하며 파일 이름을 통해 식별할 수 있습니다. 각 항목에는 해당 확장과 관련된 관련 정보가 포함됩니다.

  1. bzlTransitiveDigest는 확장 프로그램 구현의 다이제스트입니다. .bzl 파일이 전이적으로 로드됨
  2. usagesDigest 종속 항목 그래프를 볼 수 있습니다.
  3. 확장 프로그램에 대한 다른 입력을 추적하는 추가로 지정되지 않은 필드 스테이트리스(Stateless) 컨테이너를 실행하는 변수가 있는지 확인해야 합니다
  4. generatedRepoSpecs는 다음으로 만든 저장소를 인코딩합니다. 내선 번호가 표시됩니다.
  5. 선택사항인 moduleExtensionMetadata 필드에는 생성한 특정 저장소가 루트 모듈이 use_repo를 통해 가져옵니다. 이 정보는 bazel mod tidy 명령어.

모듈 확장 프로그램은 reproducible = True가 포함된 메타데이터를 반환합니다. 이렇게 함으로써 그들은 동일한 입력이 주어질 때 항상 동일한 저장소를 만듭니다.

권장사항

잠금 파일 기능의 이점을 극대화하려면 다음 사항을 고려하세요. 관행:

  • 정기적으로 잠금 파일을 업데이트하여 프로젝트 종속 항목의 변경사항을 반영하거나 구성할 수 있습니다 이렇게 하면 후속 빌드가 종속 항목 집합을 포함합니다. 모든 확장 프로그램을 잠그려면 다음 단계를 따르세요. 한 번에 bazel mod deps --lockfile_mode=update를 실행합니다.

  • 공동작업을 용이하게 하기 위해 버전 제어에 잠금 파일을 포함합니다. 모든 팀원이 동일한 잠금 파일에 액세스할 수 있도록 하여 일관성 있는 개발 환경을 구축할 수 있습니다.

  • bazelisk를 사용하여 Bazel을 실행하고 Bazel 버전을 지정하는 버전 제어의 .bazelversion 파일 해당 잠금 파일에 해당합니다. Bazel 자체는 잠금 파일은 Bazel 버전에 따라 다르며 이전 버전과의 호환성 간에도 Bazel 출시 bazelisk를 사용하면 모든 개발자가 lockfile과 일치하는 Bazel 버전

이러한 권장사항을 따르면 lockfile을 효과적으로 활용할 수 있습니다. Bazel의 기능이며 더 효율적이고 안정적이며 공동작업이 용이해집니다. 소프트웨어 개발 워크플로에 대해서도 배웠습니다

병합 충돌

잠금 파일 형식은 병합 충돌을 최소화하도록 설계되었지만 있습니다.

자동 해상도

Bazel은 git 병합 드라이버 이러한 충돌을 자동으로 해결할 수 있습니다.

루트의 .gitattributes 파일에 다음 줄을 추가하여 드라이버를 설정합니다. Git 저장소:

# A custom merge driver for the Bazel lockfile.
# https://bazel.build/external/lockfile#automatic-resolution
MODULE.bazel.lock merge=bazel-lockfile-merge

그런 다음 드라이버를 사용하려는 각 개발자는 다음 단계를 따르세요.

  1. jq (1.5 이상)를 설치합니다.
  2. 다음 명령어를 실행합니다.
jq_script=$(curl https://raw.githubusercontent.com/bazelbuild/bazel/master/scripts/bazel-lockfile-merge.jq)
printf '%s\n' "${jq_script}" | less # to optionally inspect the jq script
git config --global merge.bazel-lockfile-merge.name   "Merge driver for the Bazel lockfile (MODULE.bazel.lock)"
git config --global merge.bazel-lockfile-merge.driver "jq -s '${jq_script}' -- %O %A %B > %A.jq_tmp && mv %A.jq_tmp %A"

수동 해결 방법

registryFileHashesselectedYankedVersions에서 간단한 병합 충돌 양쪽의 모든 항목을 유지하면 필드를 안전하게 해결할 수 있습니다. 있습니다.

다른 유형의 병합 충돌은 수동으로 해결하면 안 됩니다. 다음을 수행합니다.

  1. 잠금 파일의 이전 상태 복원 git reset MODULE.bazel.lock && git checkout MODULE.bazel.lock을(를) 통해
  2. MODULE.bazel 파일의 모든 충돌을 해결합니다.
  3. bazel mod deps를 실행하여 잠금 파일을 업데이트합니다.