Bazel 잠금 파일

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

Bazel의 잠금 파일 기능을 사용하면 특정 버전 또는 종속 항목을 정의하는 방법을 배웁니다. 그것은 모듈 결정 및 확장의 결과를 저장하여 이를 달성합니다. 평가해야 합니다 잠금 파일은 재현 가능한 빌드를 촉진하여 일관성을 보장합니다. 살펴보겠습니다 또한 빌드 효율성을 향상합니다. 프로젝트에 변경사항이 없으면 Bazel이 해결 프로세스를 건너뜁니다. 종속 항목이 포함됩니다 또한 잠금 파일은 외부 라이브러리에 예기치 않은 업데이트나 브레이킹 체인지가 발생할 수 있으므로 위험이 줄어듭니다

Lockfile 생성

잠금 파일은 작업공간 루트에서 다음 이름으로 생성됩니다. MODULE.bazel.lock 빌드 프로세스 중에 생성되거나 업데이트되므로 특히 모듈 결정 및 확장 프로그램 평가 후에 그렇습니다. 잠금 파일 MODULE 파일, 플래그, 버전 2를 포함하여 프로젝트의 현재 상태를 오버라이드 및 기타 관련 정보를 확인할 수 있습니다 중요한 점은 종속 항목이 포함됩니다.

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

Lockfile 사용

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

  • update (기본값): 프로젝트 상태가 lockfile과 일치하면 확인 결과가 lockfile에서 즉시 반환됩니다. 그렇지 않으면 실행되며 잠금 파일은 현재 있습니다.
  • error: 프로젝트 상태가 lockfile과 일치하면 해결 결과는 다음과 같습니다. 잠금 파일에서 반환됩니다. 그렇지 않으면 Bazel이 프로젝트와 잠금 파일 간의 변형입니다. 이 모드는 특히 프로젝트의 종속 항목을 유지하고자 할 때 유용합니다. 변경되지 않으며 차이는 오류로 취급됩니다.
  • off: 잠금 파일이 전혀 확인되지 않습니다.

Lockfile의 이점

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

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

  • 효율적인 해상도 건너뛰기. 이 잠금 파일을 사용하면 Bazel이 확인 프로세스를 종료한 이후 프로젝트 종속 항목에 변경사항이 확인할 수 있습니다 이렇게 하면 특히 빌드 효율성이 해결하는 데 시간이 오래 걸릴 수 있는 시나리오

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

Lockfile 콘텐츠

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

  1. 모듈 해상도의 입력(예: moduleFileHash, flags, localOverrideHashes, 해상도의 출력을 생성합니다. moduleDepGraph입니다.
  2. 각 모듈 확장의 경우 잠금 파일에는 모듈 확장 프로그램에 영향을 미치는 입력이 포함됩니다. transitiveDigest로 표현되고 이 확장 프로그램을 실행한 결과 다른 이름: generatedRepoSpecs

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

{
  "lockFileVersion": 1,
  "moduleFileHash": "b0f47b98a67ee15f9.......8dff8721c66b721e370",
  "flags": {
    "cmdRegistries": [
      "https://bcr.bazel.build/"
    ],
    "cmdModuleOverrides": {},
    "allowedYankedVersions": [],
    "envVarAllowedYankedVersions": "",
    "ignoreDevDependency": false,
    "directDependenciesMode": "WARNING",
    "compatibilityMode": "ERROR"
  },
  "localOverrideHashes": {
    "bazel_tools": "b5ae1fa37632140aff8.......15c6fe84a1231d6af9"
  },
  "moduleDepGraph": {
    "<root>": {
      "name": "",
      "version": "",
      "executionPlatformsToRegister": [],
      "toolchainsToRegister": [],
      "extensionUsages": [
        {
          "extensionBzlFile": "extension.bzl",
          "extensionName": "lockfile_ext"
        }
      ],
      ...
    }
  },
  "moduleExtensions": {
    "//:extension.bzl%lockfile_ext": {
      "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
      "generatedRepoSpecs": {
        "hello": {
          "bzlFile": "@@//:extension.bzl",
          ...
        }
      }
    }
  }
}

모듈 파일 해시

moduleFileHashMODULE.bazel 파일 콘텐츠의 해시를 나타냅니다. 만약 변경사항이 발생할 경우 해시 값이 다릅니다.

플래그

Flags 객체는 확인 결과에 영향을 줄 수 있는 모든 플래그를 저장합니다.

로컬 재정의 해시

루트 모듈에 local_path_overrides가 포함된 경우 이 섹션은 해시를 저장합니다. 이 사본은 로컬 저장소에 있는 MODULE.bazel 파일의 일부입니다. 또한 변경사항을 이 종속 항목에 적용됩니다

모듈 종속 항목 그래프

moduleDepGraph는 사용할 수 있습니다. 모든 모듈의 종속 항목 그래프를 형성함 리소스를 정의합니다

모듈 확장 프로그램

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

이 맵의 각 항목은 사용된 확장 프로그램에 해당하며 확인할 수 있습니다 각 항목의 해당 값에는 다음과 같은 정보가 표시됩니다.

  1. transitiveDigest는 확장 프로그램 구현의 다이제스트 및 전이 .bzl 파일
  2. generatedRepoSpecs: 나타냅니다.

확장 프로그램 결과에 영향을 줄 수 있는 또 다른 요인은 사용량입니다. 잠금 파일에 저장되지는 않지만 비교 시 용도가 고려됩니다. 잠금 파일에 있는 확장 프로그램의 현재 상태를 전달합니다.

권장사항

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

  • 정기적으로 잠금 파일을 업데이트하여 프로젝트 종속 항목의 변경사항을 반영하거나 구성할 수 있습니다 이렇게 하면 후속 빌드가 종속 항목을 업데이트해야 합니다

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

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