0

我的项目结构如下 - PROJECT_STRUCTURE

现在 my_shbin.sh 如下 -

#!/bin/bash
find ../../ \( -name "*.java" -o -name "*.xml" -o -name "*.html" -o -name "*.js" -o -name "*.css" \) | grep -vE "/node_modules/|/target/|/dist/" >> temp-scan-files.txt

# scan project files for offensive terms
IFS=$'\n'
for file in $(cat temp-scan-files.txt); do
    grep -iF -f temp-scan-regex.txt $file >> its-scan-report.txt
done

该脚本在单独调用时完全正常并提供所需的结果。但是当我在我的 BUILD 文件中添加以下 sh_binary 时,我在 temp-scan-files.txt 文件中看不到任何内容,因此在 its-scan-report.txt 文件中什么也看不到

sh_binary(
    name = "findFiles",
    srcs = ["src/test/resources/my_shbin.sh"],
    data = glob(["temp-scan-files.txt", "temp-scan-regex.txt", "its-scan-report.txt"]),
)

我使用播放图标从 intellij 运行 sh_binary,并尝试使用 bazel run :findFiles 从终端运行它。没有显示错误,但我看不到 temp-scan-files.txt 中的数据。关于这个问题的任何帮助。bazel 的文档非常有限,除了用例之外几乎没有任何信息。

4

1 回答 1

1

当使用 运行二进制文件时bazel run,它会从该二进制文件的“运行文件树”运行。运行文件树是 bazel 创建的目录树,其中包含指向二进制输入的符号链接。尝试将pwdandtree放在 shell 脚本的开头,看看它是什么样子的。运行文件树不包含任何文件的src/main原因是它们没有被声明为 sh_binary 的输入(例如使用data属性)。请参阅https://docs.bazel.build/versions/master/user-manual.html#run

需要注意的另一件事是 glob indata = glob(["temp-scan-files.txt", "temp-scan-regex.txt", "its-scan-report.txt"]),不会匹配任何内容,因为这些文件是src/test/resources相对于 BUILD 文件的。但是,脚本会尝试修改这些文件,并且通常不可能修改输入文件(如果此 sh_binary 作为构建操作运行,则输入实际上是只读的。这仅是因为bazel run类似于运行最终的二进制文件本身在bazel之外,例如bazel build //target && bazel-bin/target

最直接的方法可能是这样的:

genrule(
  name = "gen_report",
  srcs = [
    # This must be the first element of srcs so that
    # the regex file gets passed to the "-f" of grep in cmd below.
    "src/test/resources/temp-scan-regex.txt",
  ] + glob([
    "src/main/**/*.java",
    "src/main/**/*.xml",
    "src/main/**/*.html",
    "src/main/**/*.js",
    "src/main/**/*.css",
  ],
  exclude = [
    "**/node_modules/**",
    "**/target/**",
    "**/dist/**",
  ]),
  outs = ["its-scan-report.txt"],
  # The first element of $(SRCS) will be the regex file, passed to -f.
  cmd = "grep -iF -f $(SRCS) > $@",
)

$(SRCS)srcs由空格分隔的文件,$@表示“输出文件,如果只有一个”。$(SRCS)将包含 temp-scan-regex.txt 文件,您可能不希望将其作为扫描的一部分包含在内,但如果它是第一个元素,那么它将是-f. 这可能有点麻烦而且有点脆弱,但是尝试将文件分离出来也有点烦人(例如,使用 grep 或 sed 或数组切片)。

然后bazel build //project/root/myPackage:its-scan-report.txt

于 2021-05-21T20:05:50.113 回答