apple_rules_lint
Bazel 的 lint 框架
用户
在其他任何操作之前,您必须先加载和配置 lint 框架。这是因为后续依赖 lint 框架的规则集会尝试通过注册空操作的 lint 配置实现来确保已配置 linter。您可以通过以下方式实现:
# WORKSPACE
load("@apple_rules_lint//lint:repositories.bzl", "lint_deps")
lint_deps()
load("@apple_rules_lint//lint:setup.bzl", "lint_setup")
lint_setup({
"java-checkstyle": "//your:checkstyle-config",
})
或者,使用 Bzlmod:
# MODULE.bazel
bazel_dep(name = "apple_rules_lint", version = "0.1.1")
linter = use_extension("@apple_rules_lint//lint:extensions.bzl", "linter")
linter.configure(name = "java-checkstyle", config = "//your:checkstyle-config")
您可以通过以下方式在每个包的基础上覆盖特定的 lint 配置:
# BUILD.bazel
load("@apple_rules_lint//lint:defs.bzl", "package_lint_config")
package_lint_config({
"java-checkstyle": ":alternative-checkstyle-config",
})
缺少 @@apple_linters
错误
Bazel 可能会报告以下错误:
ERROR: Failed to load Starlark extension '@@apple_linters//:defs.bzl'.
Cycle in the workspace file detected. This indicates that a repository is used prior to being defined.
The following chain of repository dependencies lead to the missing definition.
- @@apple_linters
This could either mean you have to add the '@@apple_linters' repository with a statement like `http_archive` in your WORKSPACE file (note that transitive dependencies are not added automatically), or move an existing definition earlier in your WORKSPACE file.
@apple_linters
仓库在调用 lint_setup
时定义。您需要找出 load("@apple_linters//:defs.bzl, ...)
在哪里被调用,并修改您的构建以确保在加载 linting 之前调用 lint_setup
。
API 文档
可以在 API 文档 中找到
规则集作者
WORKSPACE 设置
要为您的仓库添加 linter 支持,请将以下内容添加到...
# repositories.bzl
load("@apple_rules_lint//lint:repositories.bzl", "lint_deps")
lint_deps()
然后将以下内容添加到...
# setup.bzl
load("@apple_rules_lint//lint:setup.bzl", "ruleset_lint_setup")
ruleset_lint_setup()
Bzlmod 设置
添加:
# MODULE.bazel
bazel_dep(name = "apple_rules_lint", version = "0.1.1")
linter = use_extension("@apple_rules_lint//lint:extensions.bzl", "linter")
linter.register(name = "java-checkstyle")
获取 linter 的配置
要获取规则集当前配置的配置,请使用:
# your_rules.bzl
load("@apple_rules_lint//lint:defs.bzl", "get_lint_config")
config = get_lint_config("java-checkstyle", tags)
if config != None:
# 设置 lint 目标
pass
其中 tags
是要检查的规则的标签。
将 apple_rules_lint
与您的规则集集成
以 Selenium 项目为例,我们将展示如何将 apple_rules_lint
集成到项目中,但同样的过程可以适用于任何 linter:
-
用
_test
规则包装 linter,这样您就可以用 bazel test 运行它们。在 Selenium 中,这是 spotbugs_test -
建议(但不是必需)您的测试返回一个
LinterInfo
,以便其他工具可以检测这是否是一个 lint 测试。 -
创建一个配置规则或某种标记规则。例如, spotbugs_config
-
选择一个"众所周知"的名称:
lang-tool
似乎很有效(比如java-spotbugs
,但您可能有go-gofmt
或py-black
) -
创建一个宏,使用 get_lint_config 为您查找配置。如果存在,创建一个新的测试规则实例。您可以在 这里 看到它的实际应用。
-
在编写代码时,确保调用您的宏。如果您是规则集作者,这可以简单到将上面创建的宏导出为调用规则的默认方式。
-
...
-
成功!
然后用户可以在 WORKSPACE
文件中使用"众所周知"的名称来指向配置规则的实例:
lint_setup({
"java-spotbugs": "//java:spotbugs-config",
})