Bazel 잠금 파일

문제 신고하기 소스 보기

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

잠금 파일 생성

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

종속 항목에 영향을 미치는 프로젝트에서 변경사항이 발생하면 잠금 파일이 자동으로 업데이트되어 새 상태를 반영합니다. 이렇게 하면 lockfile이 현재 빌드에 필요한 특정 종속 항목 세트에 포커스를 유지하여 프로젝트의 해결된 종속 항목을 정확하게 나타낼 수 있습니다.

Lockfile 사용

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

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

Lockfile의 이점

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": {
      "general": {
        "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    },
    "//:extension.bzl%lockfile_ext2": {
      "os:macos": {
        "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      },
      "os:linux": {
        "transitiveDigest": "eWDzxG/aLsyY3Ubrto....+Jp4maQvEPxn0pLK=",
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    }
  }
}

모듈 파일 해시

moduleFileHashMODULE.bazel 파일 콘텐츠의 해시를 나타냅니다. 이 파일이 변경되면 해시 값이 달라집니다.

플래그

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

로컬 재정의 해시

루트 모듈에 local_path_overrides이 포함되어 있으면 이 섹션은 MODULE.bazel 파일의 해시를 로컬 저장소에 저장합니다. 이 종속 항목의 변경사항을 추적할 수 있습니다.

모듈 종속 항목 그래프

moduleDepGraph는 위에 언급된 입력을 사용한 확인 프로세스의 결과를 나타냅니다. 프로젝트를 실행하는 데 필요한 모든 모듈의 종속 항목 그래프를 형성합니다.

모듈 확장 프로그램

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

확장 프로그램이 운영체제나 아키텍처 유형과 관련이 없는 경우 이 섹션에는 '일반' 항목이 하나만 있습니다. 그렇지 않으면 OS, 아키텍처 또는 둘 다에 따라 이름이 지정된 여러 항목이 포함되며 각 항목은 해당 세부사항에 대한 확장 프로그램 평가 결과에 해당합니다.

확장 프로그램 맵의 각 항목은 사용된 확장 프로그램에 해당하며, 포함된 파일과 이름으로 식별됩니다. 각 항목의 상응하는 값에는 확장 프로그램과 연결된 관련 정보가 포함됩니다.

  1. transitiveDigest는 확장 프로그램 구현 및 전이 .bzl 파일의 다이제스트입니다.
  2. generatedRepoSpecs는 현재 입력으로 확장 프로그램을 실행한 결과입니다.

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

권장사항

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

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

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

  • bazelisk를 사용하여 Bazel을 실행하고, lockfile에 해당하는 Bazel 버전을 지정하는 .bazelversion 파일을 버전 제어에 포함합니다. Bazel 자체는 빌드의 종속 항목이므로 잠금 파일은 Bazel 버전에만 적용되며 이전 버전과 호환되는 Bazel 출시 버전 간에도 변경됩니다. bazelisk를 사용하면 모든 개발자가 lockfile과 일치하는 Bazel 버전을 사용할 수 있습니다.

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