1

我有一个使用 bazel 构建一堆 Python 代码的仓库。我想在构建中引入各种风格的静态分析,如果这些静态分析抛出错误,构建会失败。做这个的最好方式是什么?

例如,我想声明如下内容:

py_library_with_static_analysis(
  name = "foo",
  srcs = ["foo.py"],
)
py_library_with_static_analysis(
  name = "bar",
  srcs = ["bar.py"],
  deps = [":foo"],
)

如果 foo.py 中存在 mypy/flake/etc 错误,则在构建文件中并使其出错。我希望能够逐步做到这一点,一次将库/二进制文件转换为静态分析一个目标。我不确定是否应该通过新规则、宏、方面或其他方式来执行此操作。

本质上,我想我是在问如何在构建 py_binary/py_library 时运行附加命令,如果该命令失败则失败。

我可以创建自己的 py_library 规则版本并让它在实现中运行静态分析,但这似乎很容易出错(我的猜测是 native.py_library 相当复杂?)而且似乎没有成为在自定义规则中实例化 native.py_library 的一种方式。

我也玩过一些宏,但也无法让它工作。我认为我的问题是宏实际上并没有指定新命令,只有新目标,我不知道如何使静态分析目标与我感兴趣的 py_library/py_binary 一起生成。

4

1 回答 1

0

添加隐式测试目标的宏并不是一个坏主意:测试目标将在您运行时自动拾取bazel test //...,您可以在门控 CI 中执行此操作,以防止不完美的代码合并。

Bazel 支持 BUILD prelude(文档不足),您可以使用它来替换所有 py_binary、py_library 甚至 py_test 与您的测试添加包装宏,只需对现有代码进行最少的更改。

如果您以某种方式使构建失败,它将使快速原型化变得更加困难。有时您只想快速尝试一些东西,而您还不关心任何 pydoc 违规行为。

如果您确实希望构建失败,您可以使用您实施的规则的验证输出组来包装或替换您的 py_libraries。

于 2022-02-02T21:15:08.460 回答