独立的 Shell 脚本工作正常,但使用时是 srcs 的sh_binary它不起作用



我的项目结构如下- 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时,我在临时扫描文件.txt文件中看不到任何内容,因此在其扫描报告.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 从终端运行它。没有显示错误,但我看不到临时扫描文件中的数据.txt。 关于此问题的任何帮助。bazel 的文档非常有限,除了用例之外,几乎没有任何信息。

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

需要注意的另一件事是,data = glob(["temp-scan-files.txt", "temp-scan-regex.txt", "its-scan-report.txt"]),中的 glob 不会匹配任何内容,因为这些文件相对于 BUILD 文件src/test/resources。但是,脚本会尝试修改这些文件,并且通常无法修改输入文件(如果此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

相关内容

  • 没有找到相关文章

最新更新