mod 명령어

문제 신고 소스 보기

Bazel 6.3.0에 도입된 mod 명령어는 Bzlmod가 사용 설정된 경우 사용자가 외부 종속 항목 그래프를 이해하는 데 도움이 되는 다양한 도구를 제공합니다. 이를 통해 종속 항목 그래프를 시각화하고, 특정 모듈 또는 모듈의 버전이 그래프에 존재하는 이유를 알아보고, 모듈을 지원하는 저장소 정의를 보고, 모듈 확장 프로그램과 해당 저장소에서 생성하는 저장소의 사용을 검사할 수 있습니다.

문법

bazel mod <subcommand> [<options>] [<arg> [<arg>...]]

사용 가능한 하위 명령어와 각각의 필수 인수는 다음과 같습니다.

  • graph: 루트 모듈부터 프로젝트의 전체 종속 항목 그래프를 표시합니다. 하나 이상의 모듈이 --from에 지정되면 이러한 모듈은 루트 아래에 바로 표시되고 그래프는 루트 아래에서만 확장됩니다 ( 참고).

  • deps <arg>...: graph와 유사하게 지정된 각 모듈의 결정된 직접 종속 항목을 표시합니다.

  • all_paths <arg>...: 루트에서 지정된 <arg>...까지의 모든 기존 경로를 표시합니다. 하나 이상의 모듈이 --from에 지정되면 이러한 모듈은 루트 아래에 바로 표시되며 그래프에는 --from 모듈에서 인수 모듈까지의 기존 경로가 포함됩니다 ( 참고).

  • path <arg>...: all_paths와 동일한 의미 체계를 갖지만 --from 모듈 중 하나에서 인수 모듈 중 하나로 이어지는 단일 경로만 표시합니다.

  • explain <arg>...: 종속 항목 그래프에 지정된 모듈이 표시되는 모든 위치와 이 모듈에 직접 종속된 모듈을 표시합니다. explain 명령어의 출력은 기본적으로 all_paths 명령어의 정리된 버전으로, 1) 루트 모듈, 2) 인수 모듈로 이어지는 루트 모듈의 직접 종속 항목, 3) 인수 모듈의 직접 종속 항목, 4) 인수 모듈 자체가 포함됩니다 ( 참고).

  • show_repo <arg>...: 지정된 저장소의 정의를 표시합니다 (예시 참고).

  • show_extension <extension>...: 지정된 각 확장 프로그램에 관한 정보, 즉 생성된 저장소 목록과 use_repo를 사용하여 이를 가져오는 모듈 목록, 지정된 태그와 use_repo 호출을 포함하는 각 모듈의 확장 프로그램이 사용되는 목록을 표시합니다 ( 참고).

<arg>는 하나 이상의 모듈 또는 저장소를 나타냅니다. 다음 중 하나일 수 있습니다.

  • 리터럴 문자열 <root>: 현재 프로젝트를 나타내는 루트 모듈입니다.

  • <name>@<version>: <version> 버전의 <name> 모듈입니다. 비 레지스트리 재정의가 포함된 모듈의 경우 밑줄 (_)을 <version>로 사용합니다.

  • <name>: <name> 모듈의 현재 모든 버전입니다.

  • @<repo_name>: --base_module 컨텍스트에서 지정된 명확한 이름이 있는 저장소입니다.

  • @@<repo_name>: 지정된 표준 이름이 있는 저장소입니다.

모듈을 지정해야 하는 컨텍스트에서는 확장 프로그램에서 생성된 저장소가 아닌 모듈에 상응하는 저장소를 참조하는 <arg>를 사용할 수 있습니다. 반대로 저장소를 지정해야 하는 컨텍스트에서는 모듈을 참조하는 <arg>가 상응하는 저장소를 대신할 수 있습니다.

<extension><arg><label_to_bzl_file>%<extension_name> 형식이어야 합니다. <label_to_bzl_file> 부분은 저장소 기준 라벨 (예: //pkg/path:file.bzl)이어야 합니다.

다음 옵션은 그래프를 출력하는 하위 명령어 (graph, deps, all_paths, path, explain)에만 영향을 미칩니다.

  • --from <arg>[,<arg>[,...]] 기본값: <root>: graph, all_paths, path, explain에서 그래프가 확장되는 모듈입니다. 자세한 내용은 하위 명령어의 설명을 확인하세요.

  • --verbose default: "false": 출력 그래프에 각 모듈의 버전 해상도에 관한 추가 정보를 포함합니다. 모듈 버전이 확인 중에 변경된 경우, 그 이유가 최소 버전 선택이라면 이를 대체한 버전 또는 원래 버전, 대체된 이유, 새 버전을 요청한 모듈을 표시합니다.

  • --include_unused default: "false": 원래 종속 항목 그래프에 있었지만 모듈 해결 후 사용되지 않은 모듈을 출력 그래프에 포함합니다.

  • --extension_info <mode>: 모듈 확장 프로그램 사용에 관한 정보를 출력 그래프의 일부로 포함합니다 ( 참고). <mode>은 다음 중 하나일 수 있습니다.

    • hidden (기본값): 확장 프로그램에 관한 내용을 표시하지 않습니다.

    • usages: 확장 프로그램이 사용되는 각 모듈 아래에 확장 프로그램을 표시합니다. $<extension> 형식으로 출력됩니다.

    • repos: usages 외에도 각 확장 프로그램 사용에서 use_repo를 사용하여 가져온 저장소를 표시합니다.

    • all: usagesrepos 외에도 어떤 모듈에서도 가져오지 않은 확장 프로그램 생성 저장소도 표시합니다. 이러한 추가 저장소는 출력에서 처음 생성된 확장 프로그램 아래에 표시되며 점선으로 연결된 가장자리로 연결됩니다.

  • --extension_filter <extension>[,<extension>[,...]]: 지정된 경우 출력 그래프에는 지정된 확장 프로그램을 사용하는 모듈과 이러한 모듈로 연결되는 경로만 포함됩니다. --extension_filter=에서와 같이 빈 확장 프로그램 목록을 지정하는 것은 종속 항목 그래프의 모듈에서 사용되는 모든 확장 프로그램을 지정하는 것과 같습니다.

  • --depth <N>: 출력 그래프의 깊이입니다. 깊이가 1이면 루트와 직접 종속 항목만 표시됩니다. 기본값은 explain의 경우 1, deps의 경우 2, 나머지의 경우 무한대입니다.

  • --cycles 기본값: "false": 출력 그래프에 주기 에지를 포함합니다.

  • --include_builtin default: "false": 출력 그래프에 내장 모듈 (예: @bazel_tools)을 포함합니다. 내장 모듈은 다른 모든 모듈에 암시적으로 종속되어 출력이 매우 복잡해지므로 이 플래그는 기본적으로 사용 중지됩니다.

  • --charset <charset> default: utf8: 텍스트 출력에 사용할 문자 집합을 지정합니다. 유효한 값은 "utf8""ascii"입니다. 유일하게 중요한 차이점은 "ascii" 문자 집합에 없는 "text" 출력 형식으로 그래프를 그리는 데 사용되는 특수문자입니다. 따라서 유니코드를 사용할 수 없는 기존 플랫폼에서도 사용을 지원하기 위해 "ascii" 문자 집합이 제공됩니다.

  • --output <mode>: 모듈 확장 프로그램 사용에 관한 정보를 출력 그래프의 일부로 포함합니다. <mode>은 다음 중 하나일 수 있습니다.

    • text (기본값): 사람이 읽을 수 있는 출력 그래프 표현입니다(트리로 평면화됨).

    • json: JSON 객체 형식으로 그래프를 출력합니다 (트리로 평면화됨).

    • graph: Graphviz dot 표현으로 그래프를 출력합니다.

    bazel mod graph --output graph | dot -Tsvg > /tmp/graph.svg
    

그 밖에도 다음과 같은 옵션이 있습니다.

  • --base_module <arg> 기본값: <root>: 인수의 명확한 저장소 이름을 해석할 때 상대적인 모듈을 지정합니다. 이 인수 자체는 @<repo_name> 형식일 수 있습니다. 이는 항상 루트 모듈을 기준으로 해석됩니다.

  • --extension_usages <arg>[,<arg>[,...]]: show_extension를 필터링하여 지정된 모듈의 확장 프로그램 사용만 표시합니다.

실제 Bazel 프로젝트에서 mod 명령어를 사용할 수 있는 몇 가지 사용 방법은 아래에 나와 있습니다. 이 명령어를 사용하여 프로젝트의 외부 종속 항목을 검사하는 방법을 개략적으로 확인할 수 있습니다.

MODULE.bazel 파일:

module(
  name = "my_project",
  version = "1.0",
)

bazel_dep(name = "bazel_skylib", version = "1.1.1", repo_name = "skylib1")
bazel_dep(name = "bazel_skylib", version = "1.2.0", repo_name = "skylib2")
multiple_version_override(module_name = "bazel_skylib", versions = ["1.1.1", "1.2.0"])

bazel_dep(name = "stardoc", version = "0.5.0")
bazel_dep(name = "rules_java", version = "5.0.0")

toolchains = use_extension("@rules_java//java:extensions.bzl", "toolchains")
use_repo(toolchains, my_jdk="remotejdk17_linux")
해결 전 그래프
해결 전 그래프
해결 후 그래프
해결 후 그래프
  1. 프로젝트의 전체 종속 항목 그래프를 표시합니다.

    bazel mod graph
    
    <root> (my_project@1.0)
    ├───bazel_skylib@1.1.1
    │   └───platforms@0.0.4
    ├───bazel_skylib@1.2.0
    │   └───platforms@0.0.4 ...
    ├───rules_java@5.0.0
    │   ├───platforms@0.0.4 ...
    │   ├───rules_cc@0.0.1
    │   │   ├───bazel_skylib@1.1.1 ...
    │   │   └───platforms@0.0.4 ...
    │   └───rules_proto@4.0.0
    │       ├───bazel_skylib@1.1.1 ...
    │       └───rules_cc@0.0.1 ...
    └───stardoc@0.5.0
        ├───bazel_skylib@1.1.1 ...
        └───rules_java@5.0.0 ...
    
  2. 전체 종속 항목 그래프를 표시합니다 (사용하지 않는 모듈 및 버전 해상도에 관한 추가 정보 포함).

    bazel mod graph --include_unused --verbose
    
    <root> (my_project@1.0)
    ├───bazel_skylib@1.1.1
    │   └───platforms@0.0.4
    ├───bazel_skylib@1.2.0
    │   └───platforms@0.0.4 ...
    ├───rules_java@5.0.0
    │   ├───platforms@0.0.4 ...
    │   ├───rules_cc@0.0.1
    │   │   ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override)
    │   │   ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    │   │   └───platforms@0.0.4 ...
    │   └───rules_proto@4.0.0
    │       ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override)
    │       ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    │       └───rules_cc@0.0.1 ...
    └───stardoc@0.5.0
        ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
        ├───rules_java@5.0.0 ... (was 4.0.0, cause <root>, bazel_tools@_)
        ├───bazel_skylib@1.0.3 (to 1.1.1, cause multiple_version_override)
        │   └───platforms@0.0.4 ...
        └───rules_java@4.0.0 (to 5.0.0, cause <root>, bazel_tools@_)
            ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override)
            └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    
  3. 일부 특정 모듈에서 확장된 종속 항목 그래프를 표시합니다.

    bazel mod graph --from rules_java --include_unused
    
    <root> (my_project@1.0)
    ├───rules_java@5.0.0
    │   ├───platforms@0.0.4
    │   ├───rules_cc@0.0.1
    │   │   ├───bazel_skylib@1.0.3 ... (unused)
    │   │   ├───bazel_skylib@1.1.1 ...
    │   │   └───platforms@0.0.4 ...
    │   └───rules_proto@4.0.0
    │       ├───bazel_skylib@1.0.3 ... (unused)
    │       ├───bazel_skylib@1.1.1 ...
    │       └───rules_cc@0.0.1 ...
    └╌╌rules_java@4.0.0 (unused)
        ├───bazel_skylib@1.0.3 (unused)
        │   └───platforms@0.0.4 ...
        └───bazel_skylib@1.1.1
            └───platforms@0.0.4 ...
    
  4. 두 모듈 간의 모든 경로를 표시합니다.

    bazel mod all_paths bazel_skylib@1.1.1 --from rules_proto
    
    <root> (my_project@1.0)
    └╌╌rules_proto@4.0.0
        ├───bazel_skylib@1.1.1
        └───rules_cc@0.0.1
            └───bazel_skylib@1.1.1 ...
    
  5. 프로젝트가 일부 모듈에 종속되는 이유와 방식을 확인합니다.

    bazel mod explain @skylib1 --verbose --include_unused
    
    <root> (my_project@1.0)
    ├───bazel_skylib@1.1.1
    ├───rules_java@5.0.0
    │   ├───rules_cc@0.0.1
    │   │   └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    │   └───rules_proto@4.0.0
    │       ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
    │       └───rules_cc@0.0.1 ...
    └───stardoc@0.5.0
        ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
        ├╌╌rules_cc@0.0.1
        │   └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
        └╌╌rules_proto@4.0.0
            ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override)
            └───rules_cc@0.0.1 ...
    
  6. 일부 모듈 저장소의 기본 규칙을 확인합니다.

    bazel mod show_repo rules_cc stardoc
    
    ## rules_cc@0.0.1:
    # <builtin>
    http_archive(
      name = "rules_cc~",
      urls = ["https://bcr.bazel.build/test-mirror/github.com/bazelbuild/rules_cc/releases/download/0.0.1/rules_cc-0.0.1.tar.gz", "https://github.com/bazelbuild/rules_cc/releases/download/0.0.1/rules_cc-0.0.1.tar.gz"],
      integrity = "sha256-Tcy/0iwN7xZMj0dFi9UODHFI89kgAs20WcKpamhJgkE=",
      strip_prefix = "",
      remote_patches = {"https://bcr.bazel.build/modules/rules_cc/0.0.1/patches/add_module_extension.patch": "sha256-g3+zmGs0YT2HKOVevZpN0Jet89Ylw90Cp9XsIAY8QqU="},
      remote_patch_strip = 1,
    )
    # Rule http_archive defined at (most recent call last):
    #   /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in <toplevel>
    
    ## stardoc:
    # <builtin>
    http_archive(
      name = "stardoc~",
      urls = ["https://bcr.bazel.build/test-mirror/github.com/bazelbuild/stardoc/releases/download/0.5.0/stardoc-0.5.0.tar.gz", "https://github.com/bazelbuild/stardoc/releases/download/0.5.0/stardoc-0.5.0.tar.gz"],
      integrity = "sha256-yXlNzIAmow/2fPfPkeviRcopSyCwcYRdEsGSr+JDrXI=",
      strip_prefix = "",
      remote_patches = {},
      remote_patch_strip = 0,
    )
    # Rule http_archive defined at (most recent call last):
    #   /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in <toplevel>
    
  7. 종속 항목 그래프에서 사용되는 모듈 확장 프로그램을 확인합니다.

    bazel mod graph --extension_info=usages --extension_filter=all
    
    <root> (my_project@1.0)
    ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains
    ├───rules_java@5.0.0 #
    │   ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains
    │   ├───rules_cc@0.0.1 #
    │   │   └───$@@rules_cc.0.0.1//bzlmod:extensions.bzl%cc_configure
    │   └───rules_proto@4.0.0
    │       └───rules_cc@0.0.1 ...
    └───stardoc@0.5.0
        └───rules_java@5.0.0 ...
    
  8. 종속 항목 그래프의 일부로 특정 확장 프로그램에서 생성되고 가져오는 저장소를 확인합니다.

    bazel mod show_extension @@rules_java~5.0.0//java:extensions.bzl%toolchains
    
    <root> (my_project@1.0)
    ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains
    │   ├───remotejdk17_linux
    │   ├╌╌remotejdk11_linux
    │   ├╌╌remotejdk11_linux_aarch64
    │   ├╌╌remotejdk11_linux_ppc64le
    │   ├╌╌remotejdk11_linux_s390x
    ...(some lines omitted)...
    ├───rules_java@5.0.0 #
    │   └───$@@rules_java.5.0.0//java:extensions.bzl%toolchains ...
    │       ├───local_jdk
    │       ├───remote_java_tools
    │       ├───remote_java_tools_darwin
    │       ├───remote_java_tools_linux
    │       ├───remote_java_tools_windows
    │       ├───remotejdk11_linux_aarch64_toolchain_config_repo
    │       ├───remotejdk11_linux_ppc64le_toolchain_config_repo
    ...(some lines omitted)...
    └───stardoc@0.5.0
        └───rules_java@5.0.0 ...
    
  9. 생성된 확장 프로그램 저장소 목록과 각 모듈에서 확장 프로그램이 사용되는 방법을 확인하세요.

    bazel mod graph --extension_info=all --extension_filter=@rules_java//java:extensions.bzl%toolchains
    
    ## @@rules_java.5.0.0//java:extensions.bzl%toolchains:
    
    Fetched repositories:
      -   local_jdk (imported by bazel_tools@_, rules_java@5.0.0)
      -   remote_java_tools (imported by bazel_tools@_, rules_java@5.0.0)
      -   remote_java_tools_darwin (imported by bazel_tools@_, rules_java@5.0.0)
      -   remote_java_tools_linux (imported by bazel_tools@_, rules_java@5.0.0)
      -   remote_java_tools_windows (imported by bazel_tools@_, rules_java@5.0.0)
      -   remotejdk11_linux_aarch64_toolchain_config_repo (imported by rules_java@5.0.0)
      -   remotejdk11_linux_ppc64le_toolchain_config_repo (imported by rules_java@5.0.0)
    ...(some lines omitted)...
      -   remotejdk17_linux (imported by <root>)
      -   remotejdk11_linux
      -   remotejdk11_linux_aarch64
      -   remotejdk11_linux_ppc64le
      -   remotejdk11_linux_s390x
      -   remotejdk11_macos
    ...(some lines omitted)...
    
    # Usage in <root> at <root>/MODULE.bazel:14:27 with the specified attributes:
    use_repo(
      toolchains,
      my_jdk="remotejdk17_linux",
    )
    
    # Usage in bazel_tools@_ at bazel_tools@_/MODULE.bazel:23:32 with the specified attributes:
    use_repo(
      toolchains,
      "local_jdk",
      "remote_java_tools",
      "remote_java_tools_linux",
      "remote_java_tools_windows",
      "remote_java_tools_darwin",
    )
    
    # Usage in rules_java@5.0.0 at rules_java@5.0.0/MODULE.bazel:30:27 with the specified attributes:
    use_repo(
      toolchains,
      "remote_java_tools",
      "remote_java_tools_linux",
      "remote_java_tools_windows",
      "remote_java_tools_darwin",
      "local_jdk",
      "remotejdk11_linux_toolchain_config_repo",
      "remotejdk11_macos_toolchain_config_repo",
      "remotejdk11_macos_aarch64_toolchain_config_repo",
      ...(some lines omitted)...
    )
    
  10. 확장 프로그램에서 생성된 저장소의 기본 규칙을 참고하세요.

    bazel mod show_repo --base_module=rules_java @remote_java_tools
    
    ## @remote_java_tools:
    # <builtin>
    http_archive(
      name = "rules_java~~toolchains~remote_java_tools",
      urls = ["https://mirror.bazel.build/bazel_java_tools/releases/java/v11.5/java_tools-v11.5.zip", "https://github.com/bazelbuild/java_tools/releases/download/java_v11.5/java_tools-v11.5.zip"],
      sha256 = "b763ee80e5754e593fd6d5be6d7343f905bc8b73d661d36d842b024ca11b6793",
    )
    # Rule http_archive defined at (most recent call last):
    #   /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in <toplevel>