如何在规则失败时使 Bazel 构建失败?

问题描述

我在我的应用程序中使用 NodeJS 中的 Bazel 规则。目的是简单地 lint 一组文件并在 linting 失败时使构建失败。我目前遇到的是,尽管存在 lint 错误,但构建还是成功的。

这是我的 BUILD 文件的一部分:

load("@npm//htmlhint:index.bzl","htmlhint")

filegroup(
    name = "htmldata",srcs = glob(["**/*.html"]),)

htmlhint(
  name = "compile",data = [
      "htmlhint.conf","//:htmldata"
  ],args = [
      "--config","htmlhint.conf","$(locations //:htmldata)"
  ]
)

我首先加载提示库,然后为所有我想要 lint 的 HTML 文件定义一个文件组。之后,我使用规则及其数据和参数。

为了运行构建,我通过 npm 脚本使用认选项:bazel build //...

解决方法

您的构建文件按预期工作。不幸的是它没有做你想要的,因为当你从 @npm//htmlhint:index.bzl 加载宏时,它会设置 nodejs 二进制文件,它是一个可运行的目标,这意味着它只会在构建时创建运行文件 + 可执行文件。在这种情况下,构建将不会运行库。

有几个选项可以做你想做的事:

  1. 使用 htmlhint_test 宏创建测试目标。
  2. 创建一个自定义规则,该规则将使用 nodejs 二进制文件来构建一些人工制品。在这种情况下,您可以强制构建失败。

不过,我建议使用第一种方法,因为如果 htmlhint 是一个 linting 工具,它不会产生任何有意义的输出,最好将其作为测试套件的一部分。

compile 目标设置为测试目标需要执行以下操作

diff --git a/BUILD.bazel b/BUILD.bazel
index 4e58ac5..3db5dbb 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -1,11 +1,11 @@
-load("@npm//htmlhint:index.bzl","htmlhint")
+load("@npm//htmlhint:index.bzl","htmlhint_test")
 
 filegroup(
     name = "htmldata",srcs = glob(["**/*.html"]),)
 
-htmlhint(
+htmlhint_test(
   name = "compile",data = [
       "htmlhint.conf",

然后您可以使用 bazel test //... 进行检查。

如果您想查看输出,只需使用 compile

运行您的 bazel run //path/to:compile 目标