使用聚合构建器时,我注意到 build.yaml 中 TargetBuilderConfig 上的generate_for 选项会更改行为。仅当目标构建器设置为默认值时,构建器才会输出,而对于普通构建器,设置generate_for确实可以按预期工作。
这是我的文件夹结构
lib
- entity_a.dart
- entity_b.dart
protos
使用
**
的默认generate_for似乎可以工作,并输出一个原始文件,其中包含 protos 文件夹中的聚合内容。但是将generate_for设置为lib/**.dart
后,它将停止输出proto文件。但为什么呢?
这是我的目标 build.yaml
targets:
$default:
builders:
package_name|builder_name:
enabled: true
generate_for:
- lib/**.dart
仅在删除generate_for时才有效。这是我的生成器包中的 build.yaml。
builders:
builder_name:
import: "package:package_name/builders.dart"
builder_factories: ["build"]
build_extensions: {'$package$': ['protos/model.proto']}
build_to: source
auto_apply: root_package
这是我的建造者
import 'package:build/build.dart';
import 'package:glob/glob.dart';
Builder build(BuilderOptions options) => ProtoBuilder();
class ProtoBuilder implements Builder {
static final _allFilesInLib = Glob('**.dart');
static AssetId _allDartFiles(BuildStep buildStep) {
return AssetId(
buildStep.inputId.package,
'protos/model.proto',
);
}
@override
Map<String, List<String>> get buildExtensions {
return const {
r'$package$': ['protos/model.proto'],
};
}
@override
Future<void> build(BuildStep buildStep) async {
final files = <String>[];
await for (final input in buildStep.findAssets(_allFilesInLib)) {
files.add(input.path);
}
final output = _allDartFiles(buildStep);
return buildStep.writeAsString(output, files.join('\n'));
}
}
我可以重现这个问题,它似乎与合成输入的使用有关
$package$
,另请参阅使用合成输入的构建器。
作为解决方法,我建议设置
sources
而不是 generate_for
:
targets:
$default:
builders:
package_name|builder_name:
enabled: true
#generate_for:
#- lib/*.dart
sources:
- lib/src/input_folder/**
- $package$
使用上述配置,例如包含文件
lib/src/input_folder
和 input1.dart
的附加文件夹 input2.dart
将生成以下输出并将其写入 protos/model.proto
:
lib/src/input_folder/input1.dart
lib/src/input_folder/input2.dart