问题标签 [bazel-rules]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bazel - 为气隙环境创建 Bazel 归档 tar
我使用 Bazel 文档中提供的步骤创建了一个 Bazel 归档 tar。除了这个之外,大多数包都在本地加载。请参阅下面的错误。
C:\Developers\examples-master\java-tutorial>bazel build --distdir=C:\Developers\bazel-tar //:ProjectRunner 正在启动本地 Bazel 服务器并连接到它... INFO:Repository remotejdk11_win 实例化于:否堆栈(--record_rule_instantiation_callstack 未启用)存储库规则 http_archive 定义在:C:/users/syuopm/_bazel_syuopm/v5bxa2ms/external/bazel_tools/tools/build_defs/repo/http.bzl:336:31:在警告中:从https 下载: //mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11.0.6-win_x64.zip无法获取的存储库 @remotejdk11_win 中的 jdk。没有这样的包'@remotejdk11_win//':java.io.IOException:下载错误[https://mirror.bazel.build/openjdk/azul-zulu11.37.17-ca-jdk11.0.6/zulu11.37.17-ca-jdk11 .0.6-win_x64.zip] 到 C:/users/syuopm/_bazel_syuopm/v5bxa2ms/external/remotejdk11_win/zulu11.37.17-ca-jdk11.0.6-win_x64.zip: 连接超时错误: 分析目标'//:ProjectRunner ' 失败的; 构建中止:分析失败信息:经过时间:68.089 秒信息:0 个进程。失败:构建未成功完成(加载了 16 个包,配置了 305 个目标)/users/syuopm/_bazel_syuopm/v5bxa2ms/external/remotejdk11_win/zulu11.37.17-ca-jdk11.0.6-win_x64.zip:连接超时错误:分析目标'//:ProjectRunner'失败;构建中止:分析失败信息:经过时间:68.089 秒信息:0 个进程。失败:构建未成功完成(加载了 16 个包,配置了 305 个目标)/users/syuopm/_bazel_syuopm/v5bxa2ms/external/remotejdk11_win/zulu11.37.17-ca-jdk11.0.6-win_x64.zip:连接超时错误:分析目标'//:ProjectRunner'失败;构建中止:分析失败信息:经过时间:68.089 秒信息:0 个进程。失败:构建未成功完成(加载了 16 个包,配置了 305 个目标)
javascript - 使用 Bazel 构建多语言项目
我有一个 Kotlin JVM 项目,它在本机运行时运行一些 JavaScript。目前,不同的语言源定义在不同的存储库中,JS 文件被 webpack 打包为 JAR,指定为 JVM 项目的依赖项。这很好用,但我想合并这两个存储库,因为它们本质上是耦合的。与其维护大量不同的构建工具,我认为这将是一个学习和使用多语言构建系统的好机会,比如 Bazel。
目前的结构:
本质上,我正在尝试构建两个主要包。web 包构建正确,我可以通过命令行查看 webpacked 输出。包括完整图片的网络BUILD
文件:
另一个重要的包是嵌套//jvm/src/main/java/com/example/bazel/plugin
包。这本质上是最终的交付物,它应该是一个 JAR,其中包含作为资源的 Web 包的输出。
这看起来很简单,但是在构建过程中会出现以下错误:
经过一些实验,这似乎是一个尝试将生成的输出捆绑为kt_jvm_library
. 如果资源引用另一个包中的有形源文件,那么它就可以正常工作。这里的主要问题是这是否是 Bazel 的正确模式,或者我是否试图滥用这项技术。这似乎是一个相对简单的用例,但文档中有一行最让我担心:
所有规则的不变性是规则生成的文件总是与规则本身属于同一个包;无法将文件生成到另一个包中。但是,规则的输入来自另一个包的情况并不少见。
来自https://docs.bazel.build/versions/master/build-ref.html
任何见解将不胜感激。
c++ - bazel 立即运行分段错误
我正在尝试在现有的 bazel 项目中使用本地构建的包(这个)。它 bazel 构建时没有任何错误,但是当我尝试 bazel 运行它时,它会立即出现段错误。我尝试在调试模式下构建它,但是当我在调试模式下运行它时,它仍然会立即出现段错误,而没有任何有用的错误消息。
我按照自述文件中的说明构建了外部包,示例运行良好(在 bazel 之外),所以我知道外部库不是问题。
我创建了一个存储库来访问我的WORKSPACE
文件中的这个包
approxmvbb.BUILD
文件看起来像这样
我试图运行的 cc_binary 看起来像这样
二进制的源代码src/test_approvmvbb.cpp
bazel - 如何使用 Bazel 正确处理测试覆盖率报告 (HTML) 生成?
目标
我想通过 Bazel 处理生成带有测试覆盖率数据的 HTML 报告的整个过程。
成分
为了实现我的目标,我了解以下组件是必要的:
- lcov .dat 文件: 提供有关在运行特定测试用例时程序的哪些部分实际执行(即“覆盖”)的信息。我可以通过运行为我的项目生成所需的 lcov 文件(我的
./bazelw query "attr(name, '.*test_main', //...)" | xargs ./bazelw coverage --combined_report=lcov
所有测试目标都命名为test_main
,这就是我可以coverage
在所有这些目标中执行命令并将结果与--combined_report=lcov
; - genhtml : 一个可执行文件,可以解析 lcov 文件并从中生成 HTML 测试报告(最终目标);
- coverage.blz:一个自定义的 bazel 规则,将
.dat
文件和genrule
二进制文件作为输入并吐出最终的 HTML 及其 deps(图像和其他 HTML);
到目前为止我能做的...
为 genhtml 创建一个可执行脚本
我不确定这是否是最好的方法,但是,在这一点上对我来说似乎是合理的:
创建文件组以访问存储库中的 .dat
遵循 -使用 Bazel 生成覆盖率报告的建议;
这存在于我的存储库的根BUILD
文件中
开始我的自定义规则
存档coverage_report.bzl
在自定义规则实现的上下文中,我有以下问题:
- 问题 1:我不知道此时 .dat 文件是否已经生成,因为它需要
bazel coverage
运行。我可以从这里强制 bazel 覆盖吗? - 问题 2:我不知道如何
genhtml
在这里引用我的可执行工具。我的计划是做类似的事情genhtml *.dat -o output
; - 问题 3:我不知道如何指定 的输出文件
genhtml
作为此规则的输出(如您所见,这是我第一次尝试实现自己的规则);
很感谢任何形式的帮助!
参考资料
bazel - Genrule 不会在最终输出文件中输出“$@”符号
我正在写一个如下的类:
)
当我执行此操作时,我看到了输出
但是,当我打开实际的 shell 脚本文件时,我看到
$@ 符号不再存在!如何使用 Bazel genrule 指令创建一个可以接收来自 shell 的输入的 shell 脚本?
bazel - Bazel Starlark:如何以程序方式生成 BUILD 文件?
通过 http_archive 下载存档后,我想运行一个脚本以从文件夹结构和其中的 Cmake 文件生成 BUILD 文件(我目前是手动完成的,它很容易编写脚本)。我在 starlark 文档中没有找到任何关于如何打开、读取和写入文件的信息,但是由于 http_archive 本身是从 bzl 文件加载的(虽然还没有找到该文件的源......)并生成 BUILD 文件(通过从档案中解压缩它们)我想必须可以为 http_archive 编写一个包装器,它也会生成 BUILD 文件?
bazel - 在 bazel 方面的实现中,有没有办法获取工作区根目录的绝对文件系统路径?
我正在尝试在 bazel 方面实现clang 编译数据库的生成。看来这个clang文件的“目录”字段必须指定为绝对路径。现在,当我尝试使用 bazel 方面生成此文件时,所有相关的 bazel API 都会在工作区侧返回路径相对路径。
我的意思是“工作区根” ~/.cache/bazel/_bazel_<user>/<hash>/execroot/__main__
。
我想了两个技巧来完成这项工作:
- 使用
ctx.actions.run_shell
而不是ctx.actions.write
生成文件,shell 可以在其中PWD
使用$(realpath ../../../../../execroot/__main__)
.
我已经验证了它可以工作,但这肯定是不受欢迎的方法,因为 bazel 不能保证沙盒工作路径与工作区根目录的关系,因此很容易跨越 bazel 版本。
- 使用脚本生成文件。
这会将文件的生成分成两部分,因为所有编译命令信息仍然必须来自 bazel 方面,这使得维护起来很麻烦。
我想过但没有明显的方法使它起作用的另一种方法是以某种方式将__workspace_dir__
变量从WORKSPACE.bazel
文件传递到方面上下文,我无论如何都找不到这样做。
那么,有没有什么优雅的方法可以从方面实现上下文中获取这些信息呢?
c++ - 在 Bazel 中,如何防止某些 C++ 编译器标志传递给外部依赖项?
我们的项目是用 C++ 编写的,并使用 gRPC 作为依赖项。我们使用 clang 作为编译器。我们使用 设置了 C++ 工具链文件-Wall -Werror
,但这会导致 gRPC 本身引发的警告出现问题。
有没有办法阻止 Bazel 将Werror
标志应用于 gRPC 文件,但仍将其应用于项目的其他地方?
文件如下所示:
更新 9/2/2020 基于 Ondrej 非常有帮助的解决方案,我通过以下方式解决了这个问题。
- 从我拥有它的功能中删除
-Werror
标志(连同其他标志)并进入一个默认禁用的新功能,如下所示:
然后,在我自己项目中每个 BUILD 文件的顶部,添加以下行:
package(features = ["compile_flags_with_werror"])
这具有-Werror
在我的项目中编译文件时应用的效果,但在编译任何外部依赖项时不适用。
python - 使用 bazel py_binary 传递 python 命令行参数
所以我试图将 python 和 bazel 结合使用,我想知道是否有一种方法可以在通过 bazel 目标运行该脚本时传递 python 脚本参数的值。
所以这个想法是:
我有一些main.py
文件接受 args 并执行一些逻辑
通常,为了运行这个脚本,我会运行类似的东西:
python -m main.py --arg1=val1
但现在我有兴趣在执行此脚本的同时为其设置 bazel 目标,例如:
有没有办法使用类似的东西来运行该脚本:
bazel run //path/to/py_binary --arg1=val1
如果不是在使用此 bazel 目标时运行该 python 脚本的替代方法是什么?
PS我正在使用Python 3.5+