为何aggregate builder中generate_for选项无法正常工作?
问题原因与解决方案
核心原因
你的构建器属于聚合构建器(通过build_extensions中的$package$虚拟资产作为输入),这类构建器的触发逻辑和普通文件构建器完全不同:
- 普通构建器的触发条件是匹配到
generate_for中的文件资产; - 聚合构建器的触发条件是
$package$这个虚拟资产是否被包含在generate_for的规则里。
当你设置generate_for: ['lib/**.dart']时,这个规则只匹配lib下的dart文件,不匹配$package$虚拟资产,所以构建系统根本不会触发你的聚合构建器,自然不会生成proto文件。而默认的**会匹配所有资产(包括$package$),所以能正常触发。
解决方案
你需要调整generate_for规则包含$package$,同时在构建器代码中限制扫描的文件范围(而不是靠generate_for过滤),具体步骤如下:
修改项目的build.yaml
让generate_for包含$package$,确保聚合构建器能被触发:targets: $default: builders: package_name|builder_name: enabled: true generate_for: - $package$调整构建器代码中的扫描范围
将原来的Glob('**.dart')改成Glob('lib/**.dart'),只扫描lib目录下的dart文件:class ProtoBuilder implements Builder { // 修改这里的Glob规则 static final _allFilesInLib = Glob('lib/**.dart'); // 其他代码保持不变... }
这样调整后,构建器会正常触发,并且只会扫描lib下的dart文件生成聚合内容,符合你的需求。
内容的提问来源于stack exchange,提问作者anonymous-dev
相关产品推荐
相关产品推荐

