- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试添加对调用 Checkstyle 的支持,作为我们 Bazel 构建的一部分。我已经看到一些代码使用额外操作来实现这一点,但我希望避免这种方法并使其与纯 Skylark 代码一起使用。我设法使用以下(糟糕的)genrule 来让 JVM 在一组源文件上执行 Checkstyle,但我意识到这是令人难以置信的 hacky:
native.genrule(
name = name,
srcs = srcs,
outs = ["src_output.txt"],
cmd = "$(JAVA) -Dconfig_loc=<full-config-loc-path> -classpath <path>/checkstyle-8.4-all.jar com.puppycrawl.tools.checkstyle.Main -c <config-file-path> -o $@ $(SRCS)",
**kwargs
)
关于如何正确执行此操作有什么建议吗?我已经在我们的 dependency.bzl 文件中拥有所有必需的 JAR 依赖项,因此我很乐意引用这些依赖项而不是 checkstyle-all JAR。
最佳答案
正如 IRC 上所讨论的,这是我一直在使用的规则(在本文末尾)。我有一个目录 config/,其中包含我的 checkstyle 配置、抑制和许可证文件,此处引用了默认参数。在您的工作空间中,您可以使用宏引入所有部门:
load("//tools:checkstyle.bzl", "checkstyle_repositories")
checkstyle_repositories()
在您的构建文件中导入并使用规则:
load("//tools:checkstyle.bzl", "checkstyle_test")
filegroup(
name = "java-srcs",
srcs = glob(["src/main/java/**/*.java"]),
)
checkstyle_test(
name = "check",
srcs = [
":java-srcs",
],
)
然后你可以使用bazel test//path/to/dir:check
运行它。
此规则确实有一个限制,即它在命令行上接受参数,因此对于较大的模块,您将需要拆分文件组以停止达到命令行长度限制,例如
load("//tools:checkstyle.bzl", "checkstyle_test")
filegroup(
name = "java-foo-srcs",
srcs = glob(["src/main/java/foo/**/*.java"]),
)
filegroup(
name = "java-bar-srcs",
srcs = glob(["src/main/java/bar/**/*.java"]),
)
checkstyle_test(
name = "check-foo",
srcs = [
":java-foo-srcs",
],
)
checkstyle_test(
name = "check-bar",
srcs = [
":java-bar-srcs",
],
)
test_suite(
name = "check",
tests = [
":check-bar",
":check-foo",
],
)
如果每个包都有一个 BUILD 文件,这可能是不必要的,但如果您要转换大型 Maven 模块并在 bazel 构建文件中保留类似的结构,这会是一个更大的问题。
load("//tools/gerrit:maven_jar.bzl", "maven_jar")
def checkstyle_repositories(
omit = [],
versions = {
"antlr_antlr": "2.7.7",
"org_antlr_antlr4_runtime": "4.5.1-1",
"com_puppycrawl_tools_checkstyle": "8.2",
"commons_beanutils_commons_beanutils": "1.9.3",
"commons_cli_commons_cli": "1.4",
"commons_collections_commons_collections": "3.2.2",
"com_google_guava_guava23": "23.0",
"org_slf4j_slf4j_api": "1.7.7",
"org_slf4j_slf4j_jcl": "1.7.7",
}
):
if not "antlr_antlr" in omit:
maven_jar(
name = "antlr_antlr",
attach_source = False,
artifact = "antlr:antlr:" + versions["antlr_antlr"],
)
if not "org_antlr_antlr4_runtime" in omit:
maven_jar(
name = "org_antlr_antlr4_runtime",
artifact = "org.antlr:antlr4-runtime:" + versions["org_antlr_antlr4_runtime"],
)
if not "com_puppycrawl_tools_checkstyle" in omit:
maven_jar(
name = "com_puppycrawl_tools_checkstyle",
artifact = "com.puppycrawl.tools:checkstyle:" + versions["com_puppycrawl_tools_checkstyle"],
)
if not "commons_beanutils_commons_beanutils" in omit:
maven_jar(
name = "commons_beanutils_commons_beanutils",
artifact = "commons-beanutils:commons-beanutils:" + versions["commons_beanutils_commons_beanutils"],
)
if not "commons_cli_commons_cli" in omit:
maven_jar(
name = "commons_cli_commons_cli",
artifact = "commons-cli:commons-cli:" + versions["commons_cli_commons_cli"],
)
if not "commons_collections_commons_collections" in omit:
maven_jar(
name = "commons_collections_commons_collections",
artifact = "commons-collections:commons-collections:" + versions["commons_collections_commons_collections"],
)
if not "com_google_guava_guava23" in omit:
maven_jar(
name = "com_google_guava_guava23",
artifact = "com.google.guava:guava:" + versions["com_google_guava_guava23"],
)
if not "org_slf4j_slf4j_api" in omit:
maven_jar(
name = "org_slf4j_slf4j_api",
artifact = "org.slf4j:slf4j-api:" + versions["org_slf4j_slf4j_api"],
)
if not "org_slf4j_slf4j_jcl" in omit:
maven_jar(
name = "org_slf4j_slf4j_jcl",
artifact = "org.slf4j:jcl-over-slf4j:" + versions["org_slf4j_slf4j_jcl"],
)
def _checkstyle_test_impl(ctx):
name = ctx.label.name
srcs = ctx.files.srcs
deps = ctx.files.deps
config = ctx.file.config
properties = ctx.file.properties
suppressions = ctx.file.suppressions
opts = ctx.attr.opts
sopts = ctx.attr.string_opts
classpath=""
add=False
for file in ctx.files._classpath:
if add:
classpath += ":"
add=True
classpath += file.path
for file in ctx.files.deps:
classpath += ":" + file.path
args = ""
inputs = []
if config:
args += " -c %s" % config.path
inputs.append(config)
if properties:
args += " -p %s" % properties.path
inputs.append(properties)
if suppressions:
inputs.append(suppressions)
cmd = " ".join(
["java -cp %s com.puppycrawl.tools.checkstyle.Main" % classpath] +
[args] +
["--%s" % x for x in opts] +
["--%s %s" % (k, sopts[k]) for k in sopts] +
[x.path for x in srcs]
)
ctx.file_action(
output = ctx.outputs.executable,
content = cmd,
executable = True,
)
files = [ctx.outputs.executable, ctx.file.license] + srcs + deps + ctx.files._classpath + inputs
runfiles = ctx.runfiles(
files = files,
collect_data = True
)
return struct(
files = depset(files),
runfiles = runfiles,
)
checkstyle_test = rule(
implementation = _checkstyle_test_impl,
test = True,
attrs = {
"_classpath": attr.label_list(default=[
Label("@com_puppycrawl_tools_checkstyle//jar"),
Label("@commons_beanutils_commons_beanutils//jar"),
Label("@commons_cli_commons_cli//jar"),
Label("@commons_collections_commons_collections//jar"),
Label("@org_slf4j_slf4j_api//jar"),
Label("@org_slf4j_slf4j_jcl//jar"),
Label("@antlr_antlr//jar"),
Label("@org_antlr_antlr4_runtime//jar"),
Label("@com_google_guava_guava//jar"),
]),
"config": attr.label(allow_single_file=True, default = "//config:checkstyle"),
"suppressions": attr.label(allow_single_file=True, default = "//config:suppressions"),
"license": attr.label(allow_single_file=True, default = "//config:license"),
"properties": attr.label(allow_single_file=True),
"opts": attr.string_list(),
"string_opts": attr.string_dict(),
"srcs": attr.label_list(allow_files = True),
"deps": attr.label_list(),
},
)
"""Run checkstyle
Args:
config: A checkstyle configuration file
suppressions: A checkstyle suppressions file
license: A license file that can be used with the checkstyle license
target
properties: A properties file to be used
opts: Options to be passed on the command line that have no
argument
string_opts: Options to be passed on the command line that have an
argument
srcs: The files to check
"""
关于java - 从 Bazel 中调用 Checkstyle 的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49074677/
当我调用 Bazel 命令并出现分析错误时,它只显示其中之一。例如: ERROR: /Users/oliver/src/github.com/monzo/wearedev/service.transa
我们正在生成许多 Go 源文件作为我们构建的一部分。以前我们使用了 genrule ( example here ) 导致生成的文件存储在 bazel-genfiles/ . 我们最近切换到使用自定义
有没有办法在 Bazel 中指定可选依赖项? 我想制定一个规则来在某种程度上反射(reflect) Kitware 的 ExternalData , 但我想看看我是否可以启用开发人员在树中编辑文件的工
我想知道特定于平台的默认 Bazel 构建标志是否可能。 例如,我们想要使用 --workspace_status_command,但这必须是 Linux 上的 shell 脚本,并且必须指向 Win
具体来说,我想从 Mac 主机对 Windows 工作人员运行测试。 评论 running bazel remote executor test on separate machines表明这是 Ba
我想知道特定于平台的默认 Bazel 构建标志是否可能。 例如,我们想要使用 --workspace_status_command,但这必须是 Linux 上的 shell 脚本,并且必须指向 Win
有没有办法指示 bazel 列出它找到的所有目标而不构建或测试它们? 最佳答案 bazel query 可用于发现 bazel 工作区内的目标(无需构建/测试它们) 例如; 查找给定包中的所有标签:
(来自https://groups.google.com/d/msg/bazel-discuss/XrtKLhH1bgI/B9xZn_aVAAAJ) 在我们使用 Bazel 构建的项目中,我使用了远程
在 bazel 构建期间,有一堆文本飞过,暂时显示然后从屏幕上删除。这发生在整个构建过程中。我尝试了几种重定向技术,将 stderr 重定向到标准输出但无济于事。我还尝试了 bazel 的详细标志。
我是 Bazel 的新手,并在 CentOS 7 上安装了 Bazel。我使用版本为“0.14.0- (@non-git)”的“yum install bazel”安装了它 启动 bazel 时,它总
我有几段 C++ 代码(模板、宏等),它们在使用某些方式时无法编译。手动编写一段代码来完成不应该编译的事情并验证它是否编译是很容易的,但这不是自动化的。看起来 Bazel 应该能够编译一段代码并自动验
鉴于使用 bazel 构建的相当大的存储库和多种语言的大量第三方依赖项(包括重型 docker 容器),我遇到以下问题: 运行 Bazel 查询会触发下载许多这些依赖项,从而导致查询性能下降。因此,问
假设我有一个 Bazel 宏,它使用生成器规则在给定输入文件的情况下生成输出文件: def my_generator( name, input_file,
在我的代码库中,在多个目标(cc_binary、cc_library 等)中包含相同的源文件通常是错误的。我想检测这个。 我可以 bazel query labels(srcs, //target:n
您好,我想读取 .bzl 文件中本地文件的内容。 print(onefile.basename) #content = ctx.read #content=ctx.file.o
我确信这已记录在某处,但无法在任何地方找到答案。 如果我有: ```bazel_rule( name = "foo", srcs = ["foo.cpp"], attr_bar
我正在开始使用 Bazel,如果有一种简单的方法可以集成 buildifier,我就在运行每次运行 bazel build 时? 最佳答案 您可以将此实现为测试规则,其中 ctx.file_actio
bazel test命令对标记为 size = small 的测试使用默认超时 75 秒在我的设置中(版本 0.12.0)(而 documentation 提到这是 60 秒) 有没有办法在 baze
$ python gencpp.py 此命令生成一个 cpp 文件 foo.cpp在工作目录中。 我想在 bazel 中运行此命令建之前可以包含foo.cpp在 cc_binary的 srcs属性。
一遍又一遍地阅读 Bazel 文档,以至于没有什么新鲜的地方,但我似乎无法掌握如何为 native 以外的变体设置配置和变体,例如--cpu 和--compilation_mode。 为了解释我对配置
我是一名优秀的程序员,十分优秀!