Bazel 잠금 파일

문제 신고 소스 보기 Nightly · 7.4 .

Bazel의 lockfile 기능을 사용하면 프로젝트에 필요한 소프트웨어 라이브러리 또는 패키지의 특정 버전 또는 종속 항목을 기록할 수 있습니다. 이를 위해 모듈 확인 및 확장 평가의 결과를 저장합니다. 잠금 파일은 재현 가능한 빌드를 승격하여 일관된 개발 환경을 보장합니다. 또한 프로젝트 종속 항목에 변경사항이 없을 때 Bazel이 확인 프로세스를 건너뛸 수 있도록 하여 빌드 효율성을 향상합니다. 또한 lockfile은 예상치 못한 업데이트나 외부 라이브러리의 브레이킹 체인지를 방지하여 안정성을 향상시키므로 버그 유입 위험을 줄일 수 있습니다.

Lockfile 생성

잠금 파일은 작업공간 루트 아래에 MODULE.bazel.lock라는 이름으로 생성됩니다. 빌드 프로세스 중에, 특히 모듈 확인 및 확장 프로그램 평가 후에 생성되거나 업데이트됩니다. 잠금 파일은 MODULE 파일, 플래그, 재정의 및 기타 관련 정보를 포함하여 프로젝트의 현재 상태를 캡처합니다. 중요한 점은 빌드의 현재 호출에 포함된 종속 항목만 포함된다는 것입니다.

프로젝트에서 종속 항목에 영향을 미치는 변경사항이 발생하면 잠금 파일이 새 상태를 반영하도록 자동으로 업데이트됩니다. 이렇게 하면 잠금 파일이 현재 빌드에 필요한 특정 종속 항목 집합에 계속 집중하여 프로젝트의 확인된 종속 항목을 정확하게 나타낼 수 있습니다.

Lockfile 사용

잠금 파일은 --lockfile_mode 플래그로 제어하여 프로젝트 상태가 lockfile과 다른 경우 Bazel의 동작을 맞춤설정할 수 있습니다. 사용 가능한 모드는 다음과 같습니다.

  • update(기본값): 프로젝트 상태가 잠금 파일과 일치하면 잠금 파일에서 즉시 해결 결과가 반환됩니다. 그러지 않으면 확인이 실행되고 현재 상태를 반영하도록 잠금 파일이 업데이트됩니다.
  • error: 프로젝트 상태가 잠금 파일과 일치하면 잠금 파일에서 해결 결과가 반환됩니다. 그러지 않으면 Bazel에서 프로젝트와 잠금 파일 간의 변형을 나타내는 오류를 발생시킵니다. 이 모드는 프로젝트의 종속 항목이 변경되지 않고 차이를 오류로 취급하고 싶을 때 특히 유용합니다.
  • off: 잠금 파일이 전혀 확인되지 않습니다.

잠금 파일 혜택

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

  • 재현 가능한 빌드. 소프트웨어 라이브러리의 특정 버전 또는 종속 항목을 캡처하여 락파일은 다양한 환경에서 시간 경과에 따라 빌드를 재현할 수 있도록 합니다. 개발자는 프로젝트를 빌드할 때 일관되고 예측 가능한 결과를 활용할 수 있습니다.

  • 효율적인 해상도 건너뛰기. 잠금 파일을 사용하면 Bazel이 마지막 빌드 이후 프로젝트 종속 항목에 변경사항이 없는 경우 확인 프로세스를 건너뛸 수 있습니다. 이렇게 하면 특히 해결에 시간이 많이 걸릴 수 있는 시나리오에서 빌드 효율성이 크게 향상됩니다.

  • 안정성 및 위험 감소. 잠금 파일은 예기치 않은 업데이트나 외부 라이브러리의 브레이킹 체인지를 방지하여 안정성을 유지하는 데 도움이 됩니다. 종속 항목을 특정 버전으로 잠그면 호환되지 않거나 테스트되지 않은 업데이트로 인해 버그가 발생할 위험이 줄어듭니다.

잠금 파일 콘텐츠

잠금 파일에는 프로젝트 상태가 변경되었는지 확인하는 데 필요한 모든 정보가 포함되어 있습니다. 여기에는 현재 상태에서 프로젝트를 빌드한 결과도 포함됩니다 잠금 파일은 다음 두 가지 주요 부분으로 구성됩니다.

  1. moduleFileHash, flags, localOverrideHashes와 같은 모듈 해상도의 입력과 해상도의 출력(moduleDepGraph)입니다.
  2. 각 모듈 확장자에 대해, 잠금 파일에는 transitiveDigest로 표시되는 영향을 미치는 입력과 generatedRepoSpecs이라고 하는 해당 확장 프로그램 실행의 출력이 포함됩니다.

다음은 잠금 파일의 구조와 각 섹션에 관한 설명을 보여주는 예입니다.

{
  "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: 현재 입력으로 확장 프로그램을 실행한 결과입니다.

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

권장사항

락파일 기능의 이점을 극대화하려면 다음 권장사항을 고려하세요.

  • 프로젝트 종속 항목 또는 구성의 변경사항을 반영하도록 정기적으로 잠금 파일을 업데이트합니다. 이렇게 하면 후속 빌드가 가장 정확한 최신 종속 항목 집합을 기반으로 합니다.

  • 버전 제어에 잠금 파일을 포함하여 공동작업을 용이하게 하고 모든 팀원이 동일한 잠금 파일에 액세스할 수 있도록 하여 프로젝트 전반에서 일관된 개발 환경을 촉진합니다.

이러한 권장사항을 따르면 Bazel의 락파일 기능을 효과적으로 활용하여 더 효율적이고 안정적이며 공동작업이 가능한 소프트웨어 개발 워크플로를 만들 수 있습니다.