mediapipe bazel 编译问题
因為某些原因要回退mediapipe 版本,但是bazel 編譯依賴很多倉庫的代碼已經更新了,所以編譯時出現了一些倉庫或者變量找不到的錯誤提示。下面整理一些解決方法。
分支更名
完整錯誤如下:
ERROR: An error occurred during the fetch of repository 'rules_foreign_cc':java.io.IOException: Error extracting /mnt/android_source/bazel_cache/_bazel_edison/bd6da075c4965688e2daae750238d36b/external/rules_foreign_cc/master.zip to /mnt/android_source/bazel_cache/_bazel_edison/bd6da075c4965688e2daae750238d36b/external/rules_foreign_cc: Prefix "rules_foreign_cc-master" was given, but not found in the archive. Here are possible prefixes for this archive: "rules_foreign_cc-main".其實錯誤提示也比較明顯了“ Prefix “rules_foreign_cc-master” was given, but not found in the archive. Here are possible prefixes for this archive: “rules_foreign_cc-main”.”
這是由于zzzq 原因一些倉庫的“master” 分支更名為了“main” 分支。
我們在 WORKSPACE 文件中將 strip_prefix = "rules_foreign_cc-master"修改為strip_prefix = "rules_foreign_cc-main"就可以解決此類問題。
對應的url 不需要修改。
使用離線的依賴倉庫
重新執行編譯命令,有新的錯誤:
Repository rule http_archive defined at:/mnt/android_source/bazel_cache/_bazel_edison/bd6da075c4965688e2daae750238d36b/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: in <toplevel> ERROR: cannot load '@rules_foreign_cc//:workspace_definitions.bzl': no such file翻譯一下就是 rules_foreign_cc 這個倉庫里面 workspace_definitions.bzl 文件不存在。
打開Github上的rules_foreign_cc 倉庫,果然這個文件不存在,但歷史上肯定是有的,不然當時不會這么寫這段代碼。通過將代碼切換到tag 0.2.0 之后,這個文件出現了,說明我們應該使用這個tag 對應的版本。我們可以選擇下載當前節點的倉庫,下載一個zip 包存到本機目錄,然后修改WORKSPACE 文件如下(git diff 展示):
http_archive(name = "rules_foreign_cc", - strip_prefix = "rules_foreign_cc-master", - url = "https://github.com/bazelbuild/rules_foreign_cc/archive/master.zip", + strip_prefix = "rules_foreign_cc-0.2.0", + urls = ["file:home/edison/Downloads/rules_foreign_cc-0.2.0.zip"],)即:將網絡上的地址修改為本地地址。注意 strip_prefix 那里也要跟上tag 名,其實就是文件名不含后綴。
這種方法比較適用于編譯環境網絡不通,或者不想頻繁訪問網絡的條件下。
拉取依賴倉庫指定commit 節點的代碼
重新執行編譯新的錯誤又來了,不慌,看看是什么。
Repository rule http_archive defined at:/mnt/android_source/bazel_cache/_bazel_edison/bd6da075c4965688e2daae750238d36b/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31: in <toplevel> ERROR: /mnt/android_source/bazel_cache/_bazel_edison/bd6da075c4965688e2daae750238d36b/external/rules_cc/cc/private/rules_impl/cc_flags_supplier.bzl:16:1: file '@bazel_tools//tools/cpp:toolchain_utils.bzl' does not contain symbol 'use_cpp_toolchain' (did you mean 'find_cpp_toolchain'?)看樣子是文件存在,但是文件內容被修改了,不適當前版本編譯了。繼續使用回退大法。
只不過這次我們不下載倉庫了,畢竟步驟還是稍微繁瑣了一些,我們可以修改代碼取拉去對應倉庫指定commit 節點的代碼!
去GitHub 上的 rules_cc 倉庫找到對應文件,查看文件修改歷史,發現報錯提示“use_cpp_toolchain” 是最近修改的,那我們可以指定它的上一個節點編譯試試。
修改WORKSPACE 文件如下(git diff 展示)::
+_RULES_CC_GIT_COMMIT = "f95239adde29680236afa22b4abaf1d04234f61a"http_archive(name = "rules_cc", - strip_prefix = "rules_cc-master", - urls = ["https://github.com/bazelbuild/rules_cc/archive/master.zip"], + strip_prefix = "rules_cc-%s" % _RULES_CC_GIT_COMMIT, + urls = ["https://github.com/bazelbuild/rules_cc/archive/%s.tar.gz" % _RULES_CC_GIT_COMMIT],)重新編譯,成功!
總結
以上是生活随笔為你收集整理的mediapipe bazel 编译问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ教程大全看这一篇就够了-
- 下一篇: 天天福利抽奖-JAVA概率抽奖