Bzlmod 이전 가이드

문제 신고하기 소스 보기

WORKSPACE의 단점으로 인해 Bzlmod는 향후 Bazel 출시에서 기존 WORKSPACE 시스템을 대체할 예정입니다. 이 가이드에서는 프로젝트를 Bzlmod로 마이그레이션하고 외부 종속 항목을 가져오기 위한 WORKSPACE를 삭제하는 방법을 설명합니다.

WORKSPACE 대 Bzlmod

Bazel의 WORKSPACE와 Bzlmod는 구문이 다르지만 유사한 기능을 제공합니다. 이 섹션에서는 특정 WORKSPACE 기능에서 Bzlmod로 마이그레이션하는 방법을 설명합니다.

Bazel 작업공간의 루트 정의

WORKSPACE 파일은 Bazel 프로젝트의 소스 루트를 표시하며, Bazel 버전 6.3 이상에서는 이 책임이 MODULE.bazel로 대체됩니다. Bazel 버전 6.3 이전의 경우에도 작업공간 루트에 다음과 같은 주석이 달린 WORKSPACE 또는 WORKSPACE.bazel 파일이 계속 있어야 합니다.

  • 워크스페이스

    # This file marks the root of the Bazel workspace.
    # See MODULE.bazel for external dependencies setup.
    

bazelrc에서 Bzlmod 사용 설정

.bazelrc를 사용하면 Bazel을 실행할 때마다 적용되는 플래그를 설정할 수 있습니다. Bzlmod를 사용 설정하려면 --enable_bzlmod 플래그를 사용하고 이를 common 명령어에 적용하여 모든 명령어에 적용합니다.

  • .bazelrc

    # Enable Bzlmod for every Bazel command
    common --enable_bzlmod
    

작업공간의 저장소 이름 지정

  • 워크스페이스

    workspace 함수는 작업공간의 저장소 이름을 지정하는 데 사용됩니다. 이렇게 하면 작업공간의 타겟 //foo:bar@<workspace name>//foo:bar로 참조할 수 있습니다. 지정되지 않은 경우 작업공간의 기본 저장소 이름은 __main__입니다.

    ## WORKSPACE
    workspace(name = "com_foo_bar")
    
  • Bzlmod

    @<repo name> 없이 //foo:bar 구문을 사용하여 동일한 작업공간의 타겟을 참조하는 것이 좋습니다. 그러나 이전 구문이 필요한 경우 module 함수로 지정된 모듈 이름을 저장소 이름으로 사용하면 됩니다. 모듈 이름이 필요한 저장소 이름과 다른 경우 module 함수의 repo_name 속성을 사용하여 저장소 이름을 재정의할 수 있습니다.

    ## MODULE.bazel
    module(
        name = "bar",
        repo_name = "com_foo_bar",
    )
    

외부 종속 항목을 Bazel 모듈로 가져오기

종속 항목이 Bazel 프로젝트인 경우 Bzlmod도 채택되면 Bazel 모듈로 종속될 수 있어야 합니다.

  • 워크스페이스

    WORKSPACE에서는 일반적으로 http_archive 또는 git_repository 저장소 규칙을 사용하여 Bazel 프로젝트의 소스를 다운로드합니다.

    ## WORKSPACE
    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    
    http_archive(
        name = "bazel_skylib",
        urls = ["https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz"],
        sha256 = "66ffd9315665bfaafc96b52278f57c7e2dd09f5ede279ea6d39b2be471e7e3aa",
    )
    load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
    bazel_skylib_workspace()
    
    http_archive(
        name = "rules_java",
        urls = ["https://github.com/bazelbuild/rules_java/releases/download/6.1.1/rules_java-6.1.1.tar.gz"],
        sha256 = "76402a50ae6859d50bd7aed8c1b8ef09dae5c1035bb3ca7d276f7f3ce659818a",
    )
    load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains")
    rules_java_dependencies()
    rules_java_toolchains()
    

    위에서 볼 수 있듯이 사용자가 종속 항목의 매크로에서 전이 종속 항목을 로드해야 하는 일반적인 패턴입니다. bazel_skylibrules_java가 모두 platform에 종속된다고 가정하고 platform 종속 항목의 정확한 버전은 매크로의 순서에 따라 결정됩니다.

  • Bzlmod

    Bzlmod를 사용할 경우 Bazel Central Registry 또는 맞춤 Bazel 레지스트리에서 종속 항목이 제공되는 한 bazel_dep 지시어를 사용하여 종속 항목을 사용할 수 있습니다.

    ## MODULE.bazel
    bazel_dep(name = "bazel_skylib", version = "1.4.2")
    bazel_dep(name = "rules_java", version = "6.1.1")
    

    Bzlmod는 MVS 알고리즘을 사용하여 Bazel 모듈 종속 항목을 전이적으로 확인합니다. 따라서 필요한 최대 platform 버전이 자동으로 선택됩니다.

종속 항목을 Bazel 모듈로 재정의

루트 모듈로서 Bazel 모듈 종속 항목을 다양한 방법으로 재정의할 수 있습니다.

자세한 내용은 overrides 섹션을 참조하세요.

예시 저장소에서 몇 가지 사용 예시를 확인할 수 있습니다.

모듈 확장 프로그램으로 외부 종속 항목 가져오기

종속 항목이 Bazel 프로젝트가 아니거나 아직 Bazel 레지스트리에서 사용할 수 없는 경우 use_repo_rule 또는 모듈 확장 프로그램을 사용하여 종속 항목을 도입할 수 있습니다.

  • 워크스페이스

    http_file 저장소 규칙을 사용하여 파일을 다운로드합니다.

    ## WORKSPACE
    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
    
    http_file(
        name = "data_file",
        url = "http://example.com/file",
        sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    )
    
  • Bzlmod

    Bzlmod를 사용하면 MODULE.bazel 파일의 use_repo_rule 지시어를 사용하여 저장소를 직접 인스턴스화할 수 있습니다.

    ## MODULE.bazel
    http_file = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
    http_file(
        name = "data_file",
        url = "http://example.com/file",
        sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    )
    

    내부적으로는 모듈 확장 프로그램을 사용하여 구현됩니다. 단순히 저장소 규칙을 호출하는 것보다 더 복잡한 로직을 실행해야 하는 경우 모듈 확장 프로그램을 직접 구현할 수도 있습니다. 정의를 .bzl 파일로 이동해야 합니다. 이렇게 하면 마이그레이션 기간 동안 WORKSPACE와 Bzlmod 간에 정의를 공유할 수도 있습니다.

    ## repositories.bzl
    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
    def my_data_dependency():
        http_file(
            name = "data_file",
            url = "http://example.com/file",
            sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        )
    

    모듈 확장 프로그램을 구현하여 종속 항목 매크로를 로드합니다. 동일한 .bzl 파일에서 매크로를 정의할 수 있지만 이전 Bazel 버전과의 호환성을 유지하려면 별도의 .bzl 파일에 정의하는 것이 좋습니다.

    ## extensions.bzl
    load("//:repositories.bzl", "my_data_dependency")
    def _non_module_dependencies_impl(_ctx):
        my_data_dependency()
    
    non_module_dependencies = module_extension(
        implementation = _non_module_dependencies_impl,
    )
    

    저장소가 루트 프로젝트에 표시되도록 하려면 MODULE.bazel 파일에서 모듈 확장 프로그램 및 저장소 사용을 선언해야 합니다.

    ## MODULE.bazel
    non_module_dependencies = use_extension("//:extensions.bzl", "non_module_dependencies")
    use_repo(non_module_dependencies, "data_file")
    

모듈 확장 프로그램과 외부 종속 항목의 충돌 해결

프로젝트는 호출자의 입력을 기반으로 외부 저장소를 도입하는 매크로를 제공할 수 있습니다. 하지만 종속 항목 그래프에 여러 호출자가 있고 이 호출자가 충돌을 일으키는 경우에는 어떻게 해야 할까요?

foo 프로젝트가 version를 인수로 사용하는 다음 매크로를 제공한다고 가정해 보겠습니다.

## repositories.bzl in foo {:#repositories.bzl-foo}
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
def data_deps(version = "1.0"):
    http_file(
        name = "data_file",
        url = "http://example.com/file-%s" % version,
        # Omitting the "sha256" attribute for simplicity
    )
  • 워크스페이스

    WORKSPACE를 사용하면 @foo에서 매크로를 로드하고 필요한 데이터 종속 항목의 버전을 지정할 수 있습니다. @foo에 종속되지만 다른 버전의 데이터 종속 항목이 필요한 또 다른 종속 항목 @bar가 있다고 가정해 보겠습니다.

    ## WORKSPACE
    
    # Introduce @foo and @bar.
    ...
    
    load("@foo//:repositories.bzl", "data_deps")
    data_deps(version = "2.0")
    
    load("@bar//:repositories.bzl", "bar_deps")
    bar_deps() # -> which calls data_deps(version = "3.0")
    

    이 경우 최종 사용자는 필요한 버전을 얻기 위해 WORKSPACE에서 매크로 순서를 신중하게 조정해야 합니다. 이는 종속 항목을 해결하는 합리적인 방법을 제공하지 못하기 때문에 WORKSPACE의 가장 큰 문제점 중 하나입니다.

  • Bzlmod

    Bzlmod를 사용하면 foo 프로젝트의 작성자가 모듈 확장 프로그램을 사용하여 충돌을 해결할 수 있습니다. 예를 들어 모든 Bazel 모듈 중에서 필요한 최대 데이터 종속 항목 버전을 항상 선택하는 것이 합리적이라고 가정해 보겠습니다.

    ## extensions.bzl in foo
    load("//:repositories.bzl", "data_deps")
    
    data = tag_class(attrs={"version": attr.string()})
    
    def _data_deps_extension_impl(module_ctx):
        # Select the maximal required version in the dependency graph.
        version = "1.0"
        for mod in module_ctx.modules:
            for data in mod.tags.data:
                version = max(version, data.version)
        data_deps(version)
    
    data_deps_extension = module_extension(
        implementation = _data_deps_extension_impl,
        tag_classes = {"data": data},
    )
    
    ## MODULE.bazel in bar
    bazel_dep(name = "foo", version = "1.0")
    
    foo_data_deps = use_extension("@foo//:extensions.bzl", "data_deps_extension")
    foo_data_deps.data(version = "3.0")
    use_repo(foo_data_deps, "data_file")
    
    ## MODULE.bazel in root module
    bazel_dep(name = "foo", version = "1.0")
    bazel_dep(name = "bar", version = "1.0")
    
    foo_data_deps = use_extension("@foo//:extensions.bzl", "data_deps_extension")
    foo_data_deps.data(version = "2.0")
    use_repo(foo_data_deps, "data_file")
    

    이 경우 루트 모듈에는 데이터 버전 2.0이 필요한 반면 종속 항목 bar에는 3.0가 필요합니다. foo의 모듈 확장 프로그램은 이 충돌을 올바르게 해결하고 데이터 종속 항목의 버전 3.0를 자동으로 선택할 수 있습니다.

서드 파티 패키지 관리자 통합

마지막 섹션에 이어 모듈 확장 프로그램은 종속 항목 그래프에서 정보를 수집하고 맞춤 로직을 실행하여 종속 항목을 확인하고 저장소 규칙을 호출하여 외부 저장소를 도입하는 방법을 제공하므로 규칙 작성자가 특정 언어의 패키지 관리자를 통합하는 규칙 세트를 개선할 수 있는 좋은 방법을 제공합니다.

모듈 확장 프로그램 사용 방법에 관한 자세한 내용은 모듈 확장 프로그램 페이지를 참고하세요.

다음은 여러 패키지 관리자에서 종속 항목을 가져오기 위해 Bzlmod를 이미 채택한 규칙 세트 목록입니다.

의사 패키지 관리자를 통합하는 최소한의 예는 예시 저장소에서 확인할 수 있습니다.

호스트 머신에서 도구 모음 감지

Bazel 빌드 규칙은 호스트 머신에서 사용할 수 있는 도구 모음을 감지해야 할 때 저장소 규칙을 사용하여 호스트 머신을 검사하고 도구 모음 정보를 외부 저장소로 생성합니다.

  • 워크스페이스

    셸 도구 모음을 감지하는 다음 저장소 규칙이 지정된 경우

    ## local_config_sh.bzl
    def _sh_config_rule_impl(repository_ctx):
        sh_path = get_sh_path_from_env("SH_BIN_PATH")
    
        if not sh_path:
            sh_path = detect_sh_from_path()
    
        if not sh_path:
            sh_path = "/shell/binary/not/found"
    
        repository_ctx.file("BUILD", """
    load("@bazel_tools//tools/sh:sh_toolchain.bzl", "sh_toolchain")
    sh_toolchain(
        name = "local_sh",
        path = "{sh_path}",
        visibility = ["//visibility:public"],
    )
    toolchain(
        name = "local_sh_toolchain",
        toolchain = ":local_sh",
        toolchain_type = "@bazel_tools//tools/sh:toolchain_type",
    )
    """.format(sh_path = sh_path))
    
    sh_config_rule = repository_rule(
        environ = ["SH_BIN_PATH"],
        local = True,
        implementation = _sh_config_rule_impl,
    )
    

    WORKSPACE에서 저장소 규칙을 로드할 수 있습니다.

    ## WORKSPACE
    load("//:local_config_sh.bzl", "sh_config_rule")
    sh_config_rule(name = "local_config_sh")
    
  • Bzlmod

    Bzlmod를 사용하면 지난 섹션에서 @data_file 저장소를 도입하는 것과 비슷한 모듈 확장 프로그램을 사용하여 동일한 저장소를 도입할 수 있습니다.

    ## local_config_sh_extension.bzl
    load("//:local_config_sh.bzl", "sh_config_rule")
    
    sh_config_extension = module_extension(
        implementation = lambda ctx: sh_config_rule(name = "local_config_sh"),
    )
    

    그런 다음 MODULE.bazel 파일의 확장 프로그램을 사용합니다.

    ## MODULE.bazel
    sh_config_ext = use_extension("//:local_config_sh_extension.bzl", "sh_config_extension")
    use_repo(sh_config_ext, "local_config_sh")
    

도구 모음 및 실행 플랫폼 등록

마지막 섹션에 따라 도구 모음 정보 (예: local_config_sh)를 호스팅하는 저장소도 도입한 후에는 도구 모음을 등록할 수 있습니다.

  • 워크스페이스

    WORKSPACE를 사용하여 다음과 같은 방법으로 도구 모음을 등록할 수 있습니다.

    1. 도구 모음을 .bzl 파일에 등록하고 WORKSPACE 파일에 매크로를 로드할 수 있습니다.

      ## local_config_sh.bzl
      def sh_configure():
          sh_config_rule(name = "local_config_sh")
          native.register_toolchains("@local_config_sh//:local_sh_toolchain")
      
      ## WORKSPACE
      load("//:local_config_sh.bzl", "sh_configure")
      sh_configure()
      
    2. 또는 WORKSPACE 파일에 직접 도구 모음을 등록하세요.

      ## WORKSPACE
      load("//:local_config_sh.bzl", "sh_config_rule")
      sh_config_rule(name = "local_config_sh")
      register_toolchains("@local_config_sh//:local_sh_toolchain")
      
  • Bzlmod

    Bzlmod에서는 register_toolchainsregister_execution_platforms API를 MODULE.bazel 파일에서만 사용할 수 있습니다. 모듈 확장 프로그램에서는 native.register_toolchains를 호출할 수 없습니다.

    ## MODULE.bazel
    sh_config_ext = use_extension("//:local_config_sh_extension.bzl", "sh_config_extension")
    use_repo(sh_config_ext, "local_config_sh")
    register_toolchains("@local_config_sh//:local_sh_toolchain")
    

WORKSPACE, WORKSPACE.bzlmod 및 각 Bazel 모듈의 MODULE.bazel 파일에 등록된 도구 모음과 실행 플랫폼은 도구 모음을 선택할 때 다음 우선순위 순서를 따릅니다 (가장 높은 값에서 가장 낮은 항목 순으로).

  1. 도구 모음 및 실행 플랫폼이 루트 모듈의 MODULE.bazel 파일에 등록되어 있어야 합니다.
  2. WORKSPACE 또는 WORKSPACE.bzlmod 파일에 등록된 도구 모음 및 실행 플랫폼
  3. 루트 모듈의 (전이) 종속 항목인 모듈에 의해 등록된 도구 모음 및 실행 플랫폼
  4. WORKSPACE.bzlmod를 사용하지 않는 경우: WORKSPACE 서픽스에 등록된 도구 모음

로컬 저장소 소개

디버깅을 위해 종속 항목의 로컬 버전이 필요하거나 작업공간의 디렉터리를 외부 저장소로 통합하려면 종속 항목을 로컬 저장소로 도입해야 할 수 있습니다.

  • 워크스페이스

    WORKSPACE에서는 두 가지 기본 저장소 규칙인 local_repositorynew_local_repository로 이를 구현할 수 있습니다.

    ## WORKSPACE
    local_repository(
        name = "rules_java",
        path = "/Users/bazel_user/workspace/rules_java",
    )
    
  • Bzlmod

    Bzlmod를 사용하면 local_path_override를 사용하여 로컬 경로로 모듈을 재정의할 수 있습니다.

    ## MODULE.bazel
    bazel_dep(name = "rules_java")
    local_path_override(
        module_name = "rules_java",
        path = "/Users/bazel_user/workspace/rules_java",
    )
    

    모듈 확장자가 있는 로컬 저장소를 도입할 수도 있습니다. 그러나 모듈 확장에서 native.local_repository를 호출할 수 없습니다. 모든 네이티브 저장소 규칙을 별표표시하기 위해 지속적으로 노력하고 있습니다 (진행 상황은 #18285 확인). 그런 다음 모듈 확장 프로그램에서 해당 Starlark local_repository를 호출할 수 있습니다. 차단 문제인 경우 local_repository 저장소 규칙의 커스텀 버전을 간단히 구현할 수도 있습니다.

대상 결합

WORKSPACE의 bind 규칙은 지원 중단되었으며 Bzlmod에서 지원되지 않습니다. 특수 //external 패키지에서 타겟에 별칭을 제공하기 위해 도입되었습니다. 이에 따른 모든 사용자는 이전해야 합니다.

예를 들어, 영역 1에

## WORKSPACE
bind(
    name = "openssl",
    actual = "@my-ssl//src:openssl-lib",
)

이렇게 하면 다른 대상이 //external:openssl에 종속될 수 있습니다. 다음과 같은 방법으로 다른 방법으로 이전할 수 있습니다.

  • 모든 //external:openssl 사용을 @my-ssl//src:openssl-lib로 바꿉니다.

  • 또는 alias 빌드 규칙 사용

    • 패키지에서 다음 타겟을 정의합니다 (예: //third_party).

      ## third_party/BUILD
      alias(
          name = "openssl",
          actual = "@my-ssl//src:openssl-lib",
      )
      
    • 모든 //external:openssl 사용을 //third_party:openssl로 바꿉니다.

가져오기와 동기화 비교

가져오기 및 동기화 명령어는 외부 저장소를 로컬로 다운로드하고 최신 상태로 유지하는 데 사용됩니다. 빌드에 필요한 모든 저장소를 가져온 후 --nofetch 플래그를 사용하여 오프라인으로 빌드할 수도 있습니다.

  • 워크스페이스

    동기화는 모든 저장소 또는 구성된 특정 저장소 집합에 대해 강제 가져오기를 수행하지만 가져오기는 특정 대상을 가져오는 데 사용됩니다.

  • Bzlmod

    동기화 명령어는 더 이상 적용되지 않지만 가져오기는 다양한 옵션을 제공합니다. 종속 항목 해결 및 모듈 확장 프로그램과 관련된 대상, 저장소, 구성된 저장소 집합 또는 모든 저장소를 가져올 수 있습니다. 가져오기 결과가 캐시되며 가져오기를 강제로 실행하려면 가져오기 프로세스 중에 --force 옵션을 포함해야 합니다.

마이그레이션

이 섹션에서는 Bzlmod 마이그레이션 프로세스에 관한 유용한 정보와 안내를 제공합니다.

WORKSPACE의 종속 항목

마이그레이션의 첫 번째 단계는 어떤 종속 항목이 있는지 이해하는 것입니다. 전이 종속 항목은 *_deps 매크로로 로드되는 경우가 많으므로 WORKSPACE 파일에 정확히 어떤 종속 항목이 추가되었는지 파악하기 어려울 수 있습니다.

작업공간에서 해결된 파일로 외부 종속 항목 검사

다행히 --experimental_repository_resolved_file 플래그가 도움이 될 수 있습니다. 이 플래그는 기본적으로 마지막 Bazel 명령어에서 가져온 모든 외부 종속 항목의 '잠금 파일'을 생성합니다. 자세한 내용은 이 블로그 게시물을 참고하세요.

다음과 같은 두 가지 방법으로 사용할 수 있습니다.

  1. 특정 타겟을 빌드하는 데 필요한 외부 종속 항목의 정보를 가져오기 위해

    bazel clean --expunge
    bazel build --nobuild --experimental_repository_resolved_file=resolved.bzl //foo:bar
    
  2. WORKSPACE 파일에 정의된 모든 외부 종속 항목의 정보를 가져옵니다.

    bazel clean --expunge
    bazel sync --experimental_repository_resolved_file=resolved.bzl
    

    bazel sync 명령어를 사용하면 다음을 포함하여 WORKSPACE 파일에 정의된 모든 종속 항목을 가져올 수 있습니다.

    • bind 사용
    • register_toolchainsregister_execution_platforms 사용

    하지만 프로젝트가 크로스 플랫폼인 경우 일부 저장소 규칙이 지원되는 플랫폼에서만 올바르게 실행될 수 있으므로 특정 플랫폼에서 bazel 동기화가 중단될 수 있습니다.

명령어를 실행하면 외부 종속 항목에 관한 정보가 resolved.bzl 파일에 있어야 합니다.

bazel query로 외부 종속 항목 검사

bazel query를 사용하여 저장소 규칙을 검사할 수 있습니다.

bazel query --output=build //external:<repo name>

이 방법이 더 편리하고 빠르긴 하지만 bazel 쿼리가 외부 종속 항목 버전과 관련되어 있기 때문에 주의해서 사용하세요. Bzlmod로 외부 종속 항목을 쿼리하고 검사하는 작업은 새로운 하위 명령어를 통해 가능합니다.

기본 제공 기본 종속 항목

--experimental_repository_resolved_file로 생성된 파일을 확인하면 WORKSPACE에 정의되지 않은 많은 종속 항목을 찾을 수 있습니다. 이는 Bazel이 실제로 접두사와 접미사를 사용자의 WORKSPACE 파일 콘텐츠에 추가하여 일반적으로 네이티브 규칙 (예: @bazel_tools, @platforms, @remote_java_tools)에 필요한 일부 기본 종속 항목을 삽입하기 때문입니다. Bzlmod를 사용하면 이러한 종속 항목이 다른 모든 Bazel 모듈의 기본 종속 항목인 내장 모듈 bazel_tools와 함께 도입됩니다.

점진적 마이그레이션을 위한 하이브리드 모드

Bzlmod와 WORKSPACE는 함께 작동할 수 있으므로 WORKSPACE 파일에서 Bzlmod로의 종속 항목을 점진적으로 이전할 수 있습니다.

WORKSPACE.bzlmod

마이그레이션 중에 Bazel 사용자는 Bzlmod가 사용 설정된 빌드와 사용 설정되지 않은 빌드 간에 전환해야 할 수 있습니다. 프로세스를 더 원활하게 하기 위해 WORKSPACE.bzlmod 지원이 구현되었습니다.

WORKSPACE.bzlmod의 구문은 WORKSPACE와 정확히 동일합니다. Bzlmod가 사용 설정된 경우 작업공간 루트에도 WORKSPACE.bzlmod 파일이 있는 경우 다음을 실행합니다.

  • WORKSPACE.bzlmod가 적용되고 WORKSPACE의 콘텐츠는 무시됩니다.
  • 프리픽스 또는 서픽스는 WORKSPACE.bzlmod 파일에 추가되지 않습니다.

WORKSPACE.bzlmod 파일을 사용하면 다음과 같은 이유로 더 쉽게 마이그레이션할 수 있습니다.

  • Bzlmod가 사용 중지되면 원래 WORKSPACE 파일에서 종속 항목을 가져오는 방식으로 대체됩니다.
  • Bzlmod가 사용 설정되면 WORKSPACE.bzlmod를 사용하여 마이그레이션할 종속 항목을 더 잘 추적할 수 있습니다.

저장소 공개 상태

Bzlmod는 특정 저장소에서 표시할 다른 저장소를 제어할 수 있습니다. 자세한 내용은 저장소 이름 및 엄격한 deps를 확인하세요.

다음은 WORKSPACE를 고려할 때 다양한 유형의 저장소의 저장소 공개 상태를 요약한 것입니다.

기본 저장소에서 Bazel 모듈 저장소에서 모듈 확장 프로그램 저장소에서 WORKSPACE 저장소에서
기본 저장소 visible 루트 모듈이 직접 종속 항목인 경우 루트 모듈이 모듈 확장 프로그램을 호스팅하는 모듈의 직접 종속 항목인 경우 visible
Bazel 모듈 저장소 직접 deps 직접 deps 모듈 확장 프로그램을 호스팅하는 모듈의 직접 deps 루트 모듈의 직접 deps
모듈 확장 프로그램 저장소 직접 deps 직접 deps 모듈 확장 프로그램을 호스팅하는 모듈의 직접 deps + 동일한 모듈 확장 프로그램에서 생성된 모든 저장소 루트 모듈의 직접 deps
WORKSPACE 저장소 모두 표시 표시 안 됨 표시 안 됨 모두 표시
의 확장 프로그램인 @foo가 명확한 저장소 이름의 확장 프로그램으로도 사용됩니다.

마이그레이션 프로세스

일반적인 Bzlmod 마이그레이션 프로세스는 다음과 같습니다.

  1. WORKSPACE에 있는 종속 항목을 파악합니다.
  2. 프로젝트 루트에 빈 MODULE.bazel 파일을 추가합니다.
  3. WORKSPACE 파일 콘텐츠를 재정의할 빈 WORKSPACE.bzlmod 파일을 추가하세요.
  4. Bzlmod가 사용 설정된 상태로 타겟을 빌드하고 누락된 저장소를 확인합니다.
  5. 해결된 종속 항목 파일에서 누락된 저장소의 정의를 확인합니다.
  6. 모듈 확장 프로그램을 통해 누락된 종속 항목을 Bazel 모듈로 도입하거나 나중에 마이그레이션할 수 있도록 WORKSPACE.bzlmod에 둡니다.
  7. 4로 돌아가서 모든 종속 항목을 사용할 수 있을 때까지 반복합니다.

마이그레이션 도구

시작하려면 대화형 Bzlmod 마이그레이션 도우미 스크립트가 있습니다.

스크립트는 다음 작업을 실행합니다.

  • WORKSPACE 확인 파일을 생성하고 파싱합니다.
  • 확인된 파일의 저장소 정보를 사람이 읽을 수 있는 방식으로 출력합니다.
  • bazel 빌드 명령어를 실행하고 인식된 오류 메시지를 감지하고 이전 방법을 추천합니다.
  • BCR에서 이미 종속 항목을 사용할 수 있는지 확인합니다.
  • MODULE.bazel 파일에 종속 항목을 추가합니다.
  • 모듈 확장 프로그램을 통해 종속 항목을 추가합니다.
  • WORKSPACE.bzlmod 파일에 종속 항목을 추가합니다.

사용하려면 최신 Bazel 출시 버전이 설치되어 있는지 확인하고 다음 명령어를 실행하세요.

git clone https://github.com/bazelbuild/bazel-central-registry.git
cd <your workspace root>
<BCR repo root>/tools/migrate_to_bzlmod.py -t <your build targets>

Bazel 모듈 게시

Bazel 프로젝트가 다른 프로젝트의 종속 항목인 경우 Bazel Central Registry에 프로젝트를 게시할 수 있습니다.

BCR에서 프로젝트를 체크인하려면 프로젝트의 소스 자료실 URL이 필요합니다. 소스 보관 파일을 만들 때는 다음 사항에 유의하세요.

  • 보관 파일이 특정 버전을 가리키는지 확인합니다.

    BCR은 버전이 지정된 소스 보관 파일만 허용할 수 있습니다. Bzlmod는 종속 항목 해결 중에 버전을 비교해야 하기 때문입니다.

  • 보관 파일 URL이 안정적인지 확인합니다.

    Bazel은 해시 값으로 보관 파일의 내용을 확인하므로 다운로드한 파일의 체크섬이 변경되지 않도록 해야 합니다. URL의 출처가 GitHub이면 출시 페이지에 출시 보관 파일을 만들어 업로드하세요. GitHub는 요청 시 생성된 소스 보관 파일의 체크섬을 보장하지 않습니다. 간단히 말해 https://github.com/<org>/<repo>/releases/download/... 형식의 URL은 안정적인 것으로 간주되지만 https://github.com/<org>/<repo>/archive/...는 그렇지 않습니다. 자세한 내용은 GitHub 보관 파일 체크섬 중단을 참조하세요.

  • 소스 트리가 원래 저장소의 레이아웃을 따라야 합니다.

    저장소가 매우 크고 불필요한 소스를 제거하여 크기를 줄인 배포 보관 파일을 만들려면 제거된 소스 트리가 원래 소스 트리의 하위 집합인지 확인하세요. 이렇게 하면 최종 사용자가 archive_overridegit_override를 통해 모듈을 출시 외 버전으로 쉽게 재정의할 수 있습니다.

  • 가장 일반적인 API를 테스트하는 하위 디렉터리에 테스트 모듈을 포함합니다.

    테스트 모듈은 게시할 실제 모듈에 종속되는 소스 보관 파일의 하위 디렉터리에 자체 WORKSPACE 및 MODULE.bazel 파일이 있는 Bazel 프로젝트입니다. 여기에는 가장 일반적인 API를 다루는 예시 또는 몇 가지 통합 테스트가 포함되어야 합니다. 설정 방법을 알아보려면 테스트 모듈을 확인하세요.

소스 보관 파일 URL이 준비되면 BCR 참여 가이드라인에 따라 GitHub pull 요청과 함께 모듈을 BCR에 제출합니다.

저장소에 대해 BCR에 게시 GitHub 앱을 설정하여 모듈을 BCR에 제출하는 과정을 자동화하는 것이 좋습니다.

권장사항

이 섹션에서는 외부 종속 항목을 보다 효율적으로 관리하기 위해 따라야 할 몇 가지 권장사항을 설명합니다.

불필요한 종속 항목을 가져오지 않도록 대상을 여러 패키지로 분할합니다.

테스트용 개발 종속 항목이 필요하지 않은 타겟을 빌드하기 위해 불필요하게 강제로 강제로 가져오는 #12835를 확인합니다. 이는 실제로 Bzlmod에만 국한되지는 않지만 이 방법을 따르면 개발 종속 항목을 올바르게 지정할 수 있습니다.

개발 종속 항목 지정

bazel_depuse_extension 지시어의 dev_dependency 속성을 true로 설정하여 종속 프로젝트에 전파되지 않도록 할 수 있습니다. 루트 모듈로는 --ignore_dev_dependency 플래그를 사용하여 타겟이 여전히 개발 종속 항목 없이 빌드되는지 확인할 수 있습니다.

커뮤니티 이전 진행 상황

Bazel Central Registry를 확인하여 종속 항목을 이미 사용할 수 있는지 확인할 수 있습니다. 그렇지 않은 경우 언제든지 이 GitHub 토론에 참여하여 이전을 차단하는 종속 항목에 찬성 투표하거나 게시할 수 있습니다.

문제 신고하기

Bazel GitHub 문제 목록에서 알려진 Bzlmod 문제를 확인하세요. 언제든지 새로운 문제를 제출하거나 이전을 차단 해제하는 데 도움이 되는 기능 요청을 제출할 수 있습니다.