mod コマンド

7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel 6.3.0 で導入された mod コマンドは、Bzlmod が有効になっている場合に、ユーザーが外部依存関係グラフを理解するのに役立つさまざまなツールを提供します。依存関係グラフを可視化したり、特定のモジュールまたはモジュールのバージョンがグラフに存在する理由を調べたり、モジュールをサポートするリポジトリ定義を表示したり、モジュール拡張機能の使用状況とそれらが生成するリポジトリを検査したりできます。

構文

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

使用可能なサブコマンドと、それぞれの必須引数は次のとおりです。

  • graph: ルート モジュールから始まるプロジェクトの完全な依存関係グラフが表示されます。--from で 1 つ以上のモジュールが指定されている場合、これらのモジュールはルートの直下に表示され、グラフはこれらのモジュールからのみ展開されます(を参照)。

  • deps <arg>...: graph と同様に、指定された各モジュールの解決済みの直接依存関係を表示します。

  • all_paths <arg>...: ルートから指定された <arg>... までの既存のパスすべてを表示します。--from で 1 つ以上のモジュールが指定されている場合、これらのモジュールはルートの直下に表示され、グラフには --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> は、1 つ以上のモジュールまたはリポジトリを指します。次のいずれかになります。

  • リテラル文字列 <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)。

次のオプションは、グラフを出力するサブコマンド(graphdepsall_pathspathexplain)にのみ影響します。

  • --from <arg>[,<arg>[,...]] デフォルト: <root>: graphall_pathspathexplain でグラフが展開されるモジュール。詳細については、サブコマンドの説明をご覧ください。

  • --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" 文字セットに存在しないことです。そのため、Unicode を使用できないレガシー プラットフォームでの使用もサポートするために、"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. 2 つのモジュール間のすべてのパスを表示します。

    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>