Bzlmod 이전 가이드

문제 신고 소스 보기

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

WORKSPACE 대 Bzlmod

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

Bazel 작업공간의 루트 정의

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

  • Workspace

    # 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

    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

    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 레지스트리에서 사용할 수 없는 경우 모듈 확장 프로그램을 사용하여 도입할 수 있습니다.

  • Workspace

    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를 사용하면 정의를 .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

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

    ## 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 빌드 규칙은 호스트 머신에서 사용 가능한 도구 모음을 감지해야 할 경우 저장소 규칙을 사용하여 호스트 머신을 검사하고 도구 모음 정보를 외부 저장소로 생성합니다.

  • Workspace

    셸 도구 모음을 감지하는 다음 저장소 규칙이 주어집니다.

    ## 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

    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

    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 저장소에서
기본 저장소 visible 루트 모듈이 직접 종속 항목인 경우 루트 모듈이 모듈 확장 프로그램을 호스팅하는 모듈의 직접 종속 항목인 경우 visible
Bazel 모듈 저장소 직접 DEP 직접 DEP 모듈 확장 프로그램을 호스팅하는 모듈의 직접 deps 루트 모듈의 직접 deps
모듈 확장 프로그램 저장소 직접 DEP 직접 DEP 모듈 확장 프로그램을 호스팅하는 모듈의 직접 deps + 동일한 모듈 확장 프로그램에서 생성된 모든 저장소 루트 모듈의 직접 deps
WORKSPACE 저장소 모두 표시됨 표시 안 됨 표시 안 됨 모두 표시됨

마이그레이션 프로세스

일반적인 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 중앙 레지스트리에 프로젝트를 게시할 수 있습니다.

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 토론에 참여하여 이전을 방해하는 종속 항목에 찬성 투표하거나 게시하세요.

문제 신고하기

알려진 Bzlmod 문제는 Bazel GitHub 문제 목록을 참고하세요. 언제든지 새로운 문제나 기능 요청을 제출하여 이전 차단을 해제하세요.