1

我在我的应用程序中使用 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 //...

4

1 回答 1

0

您的构建文件按预期工作。不幸的是,它没有做你想做的事,因为当你从@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

于 2021-04-27T07:16:35.753 回答