mod 명령어

문제 신고 소스 보기 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 기본값: 'false': 출력 그래프에 각 모듈의 버전 해상도에 관한 추가 정보를 포함합니다. 해결 중에 모듈 버전이 변경된 경우 어떤 버전으로 대체되었는지 또는 원래 버전이 무엇인지, 대체된 이유, 이유가 최소 버전 선택인 경우 새 버전을 요청한 모듈을 표시합니다.

  • --include_unused 기본값: '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 기본값: 'false': 출력 그래프에 내장 모듈 (예: @bazel_tools)을 포함합니다. 기본 모듈은 다른 모든 모듈에서 암시적으로 종속되므로 이 플래그는 기본적으로 사용 중지되어 있으며, 이로 인해 출력이 매우 지저분해집니다.

  • --charset <charset> 기본값: utf8: 텍스트 출력에 사용할 문자 집합을 지정합니다. 유효한 값은 "utf8""ascii"입니다. 유일한 중요한 차이점은 "text" 출력 형식으로 그래프를 그리는 데 사용되는 특수문자이며, 이 특수문자는 "ascii" 문자 집합에 존재하지 않습니다. 따라서 유니코드를 사용할 수 없는 기존 플랫폼에서의 사용도 지원하기 위해 "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 명령어를 사용할 수 있는 몇 가지 예시가 아래에 나와 있습니다. 이를 통해 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>