基于Dart Build实现单输入多输出文件生成是否可行?
能否用Dart Build工具实现单输入生成多文件?
完全可以。Dart的build工具链(包含build、build_runner等核心包)原生支持单输入源生成多个输出文件的场景,非常适配你基于JSON输入生成多类文件的需求。
核心实现思路
自定义Builder类,在build方法中完成以下操作:
- 读取输入的JSON文件内容并解析
- 通过
BuildStep提供的writeAsString方法,多次调用以生成不同的输出文件 - 为每个输出文件指定唯一的
AssetId,确保文件路径和命名正确
简单示例代码
import 'dart:convert'; import 'package:build/build.dart'; class MultiClassGenerator implements Builder { @override final buildExtensions = const { '.json': ['.user.dart', '.product.dart'] // 声明输出文件的扩展名规则 }; @override Future<void> build(BuildStep buildStep) async { // 读取并解析输入的JSON文件 final jsonContent = await buildStep.readAsString(buildStep.inputId); final data = jsonDecode(jsonContent) as Map<String, dynamic>; // 生成User类文件 final userOutputId = buildStep.inputId.changeExtension('.user.dart'); final userClass = ''' class User { final String id; final String name; User({required this.id, required this.name}); factory User.fromJson(Map<String, dynamic> json) => User( id: json['userId'], name: json['userName'], ); } '''; await buildStep.writeAsString(userOutputId, userClass); // 生成Product类文件 final productOutputId = buildStep.inputId.changeExtension('.product.dart'); final productClass = ''' class Product { final String id; final double price; Product({required this.id, required this.price}); factory Product.fromJson(Map<String, dynamic> json) => Product( id: json['productId'], price: json['productPrice'], ); } '''; await buildStep.writeAsString(productOutputId, productClass); } }
关键注意事项
- 在
buildExtensions中声明所有可能的输出扩展名,确保build系统能正确追踪这些生成文件 - 如果需要自定义输出路径(比如统一放到
lib/generated/目录下),可以直接构造AssetId:AssetId(buildStep.inputId.package, 'lib/generated/user.dart') - 完成Builder定义后,通过
dart run build_runner build命令触发生成流程
内容的提问来源于stack exchange,提问作者Artur Sikora
相关产品推荐
相关产品推荐

