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>...:顯示指定的 repos 定義 (請參閱範例)。

  • show_extension <extension>...:顯示每個指定擴充功能的相關資訊:產生的存放區清單,以及使用 use_repo 匯入這些存放區的模組,以及在每個使用該擴充功能的模組中,該擴充功能的用法清單,其中包含指定的標記和 use_repo 呼叫 (請參閱範例)。

<arg> 是指一或多個模組或存放區。可以是下列任一項目:

  • 常值字串 <root>:代表目前專案的根模組。

  • <name>@<version>:版本為 <version> 的模組 <name>。如果模組有非登錄機制覆寫值,請使用底線 (_) 做為 <version>

  • <name>:模組 <name> 的所有現有版本。

  • @<repo_name>:在 --base_module 情境中,具有指定顯式名稱的存放區。

  • @@<repo_name>:具有指定標準名稱的存放區。

在需要指定模組的情況下,您也可以使用 <arg>,參照對應於模組 (而非擴充功能產生的 repos) 的 repos。反之,在需要指定存放區的情況下,<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" 字元集內。因此,"ascii" 字元集也支援無法使用 Unicode 的舊版平台。

  • --output <mode>:在輸出圖表中加入模組擴充功能使用情形的相關資訊。<mode> 可以是下列任一值:

    • text (預設):輸出圖表的人類可讀表示法 (以樹狀結構扁平化)。

    • json:以 JSON 物件形式 (以樹狀結構扁平化) 輸出圖表。

    • graph:以 Graphviz dot 表示法輸出圖表。

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

您也可以採取以下做法:

  • --base_module <arg> 預設值:<root>:指定相對於引數中哪些明顯的 repo 名稱會解讀的模組。請注意,這個引數本身可以是 @<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>