使用 bazel 配置 pylint 的最佳方法

HK_*_*ava 5 pylint bazel

我使用 vim 作为我的编辑器和 Syntastic 插件。我试图了解将 pylint 与 Bazel 等工具一起使用的惯用方式。

pylint 有一个 init-hook 命令行参数,可用于动态操作 sys.hook。我正在考虑编写一个包装脚本来执行此操作,但我不确定如何确定作为“init-hook”命令传递的正确内容。

Lás*_*zló 5

我知道的最好方法是pylint作为测试的一部分运行。

理想情况下,您应该为每个文件制定一个 linting 规则,这样当该文件更改时,您只需重新整理该文件。但这可能是不切实际的。

规模的另一端是有一个规则来检查项目中的所有文件。即使只有一个文件更改,该规则也会重新整理所有文件。所以这是低效的。

在我看来,一个好的中间立场是每个 Bazel 包的一个 linting 规则。

@local_pylint_config//:pylint例如,假设您的工作区中有 pylint 作为二进制文件,我建议使用以下模式:

sh_test(
    name = "lint_test",
    srcs = ["lint_test.sh"],       # this doesn't have to do anything
    data = ["lint_files.out"],
)

genrule(
    name = "lint_files",
    srcs = glob(["**/*.py"]),
    outs = ["lint_files.out"],
    tools = ["@local_pylint_config//:pylint"],
    cmd = "$(location @local_pylint_config//:pylint) $(SRCS) >&/dev/null && md5sum $$(echo $(SRCS) | sort) > $@",
)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 如果可以构建其依赖项“lint_files”,则测试通过,如果 linting 成功,则测试成功。因此,当且仅当 linting 成功时,测试才会成功。
  • 我正在使用 genrule 来确保“pylint”规则是为正确的配置构建的。
  • 我正在将 pylint 的输出重定向到/dev/null以减少构建噪音。
  • 我正在计算所有源的校验和并将其写入输出文件,以便编写一个唯一的输出,该输出完全依赖于源的内容而不是其他任何内容(而不是当前时间)。我正在对源文件进行排序以确保输出是确定性的。如果不是使用md5sum我仅仅touch'ed 输出文件,输出的内容将独立于源的内容,因此下游测试规则不会重新运行。
  • 但是,使用... && date > $@而不是校验和源也足够好,因为如果任何源文件发生更改,Bazel 将重建 genrule(并因此重新整理源文件),产生不同的输出,因为届时当前时间将有改变了。然而,使用校验和是确定性的。