Bzlmod 이전 가이드

7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 모듈 종속 항목을 재정의할 수 있습니다.

자세한 내용은 재정의 섹션을 참조하세요.

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

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

종속 항목이 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")
    

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

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

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

## 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-lib로 바꿉니다.

마이그레이션

이 섹션에서는 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 저장소에서
기본 저장소 표시 루트 모듈이 직접 종속 항목인 경우 루트 모듈이 모듈 확장 프로그램을 호스팅하는 모듈의 직접 종속 항목인 경우 표시
Bazel 모듈 저장소 직접 종속 항목 직접 디핑 모듈 확장 프로그램을 호스팅하는 모듈의 직접 deps 루트 모듈의 직접 deps
모듈 확장 프로그램 저장소 직접 종속 항목 직접 디핑 모듈 확장을 호스팅하는 모듈의 직접 deps + 동일한 모듈 확장 프로그램에서 생성된 모든 저장소 루트 모듈의 직접 종속 항목
WORKSPACE 저장소 모두 표시 표시 안 됨 표시 안 됨 모두 표시 중
의 경우 동일한 저장소 이름인 @bar를 참조하며@foo

마이그레이션 프로세스

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

  1. WORKSPACE에 어떤 종속 항목이 있는지 이해합니다.
  2. 프로젝트 루트에 빈 MODULE.bazel 파일을 추가합니다.
  3. 빈 WORKSPACE.bzlmod 파일을 추가하여 WORKSPACE 파일 콘텐츠를 재정의합니다.
  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이 필요합니다. 소스 보관 파일을 만들 때 다음 사항에 유의하세요.

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

    Bzlmod는 종속 항목 확인 중에 버전 비교를 실행해야 하므로 BCR은 버전이 지정된 소스 보관 파일만 수용할 수 있습니다.

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

    Bazel은 해시 값으로 보관 파일의 콘텐츠를 확인하므로 다운로드한 파일의 체크섬이 변경되지 않도록 해야 합니다. GitHub의 URL인 경우 출시 페이지에서 출시 보관 파일을 만들고 업로드하세요. 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 풀 리퀘스트를 사용하여 BCR에 모듈을 제출합니다.

모듈을 BCR에 제출하는 프로세스를 자동화할 수 있도록 저장소에 Publish to BCR GitHub 앱을 설정하는 것이 좋습니다.

권장사항

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

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

#12835를 확인합니다. 여기서는 필요하지 않은 타겟을 빌드하기 위해 테스트용 개발자 종속 항목을 불필요하게 가져와야 합니다. 실제로 Bzlmod와 관련된 것은 아니지만 이 권장사항을 따르면 개발 종속 항목을 더 쉽게 지정할 수 있습니다.

개발 종속 항목 지정

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

커뮤니티 이전 진행 상황

Bazel Central Registry에서 종속 항목을 이미 사용할 수 있는지 확인할 수 있습니다. 아니면 언제든지 이 GitHub 토론에 참여하여 마이그레이션을 차단하는 종속 항목에 찬성 투표하거나 게시해도 됩니다.

문제 신고

알려진 Bzlmod 문제는 Bazel GitHub 문제 목록을 확인하세요. 이전 차단을 해제하는 데 도움이 될 수 있는 새로운 문제나 기능 요청을 언제든지 제출해 주세요.