递归构建Bazel项目时,忽略指定文件夹的规范方法是什么?
解决Bazel递归构建时忽略特定文件夹的规范方法
这确实是个挺闹心的问题——Bazel会自动扫描项目里所有的BUILD/BUILD.bazel文件,哪怕是node_modules这种第三方依赖里的,完全打乱我们原本的构建计划。下面是几种无需每次手动指定路径的规范解决办法:
1. 使用.bazelignore文件(最推荐的全局方案)
这就像Git的.gitignore一样,是Bazel官方推荐的忽略特定路径的方式:
- 在项目根目录创建
.bazelignore文件 - 把你想忽略的路径添加进去,比如针对rxjs的情况可以写:
node_modules/rxjs/ - 如果想彻底忽略所有node_modules里的BUILD配置,也可以更宽泛地写:
node_modules/**/BUILD node_modules/**/BUILD.bazel
这样Bazel在执行bazel build //...这类递归构建命令时,会自动跳过这些被标记的路径,不用每次在命令行手动限定范围了。
2. 在WORKSPACE中排除特定依赖的BUILD文件
如果你是通过npm_install或yarn_install这类规则引入的npm依赖,可以直接在WORKSPACE里给这些规则加上exclude参数,精准排除有问题的依赖:
npm_install( name = "npm", package_json = "//:package.json", yarn_lock = "//:yarn.lock", exclude = ["rxjs"], )
这种方法适合只需要排除个别“捣蛋”依赖的场景,不会影响其他正常的第三方依赖处理。
3. 调整BUILD文件中的glob规则(针对特定构建目标)
如果你的自定义BUILD文件里用了glob来匹配源码文件,可以给glob加上exclude参数,排除特定路径:
ts_library( name = "my_lib", srcs = glob( ["**/*.ts"], exclude = ["node_modules/rxjs/**/*"], ), )
这个方法更偏向于针对单个构建目标做排除,而不是全局生效。
对比下来,.bazelignore是最省心的全局解决方案,适合不想让Bazel碰任何第三方依赖BUILD文件的场景;如果只是个别依赖有问题,WORKSPACE里的exclude参数会更精准。
内容的提问来源于stack exchange,提问作者shabunc
相关产品推荐
相关产品推荐

