DS Builder

pub.dev

Flutter项目的构建工具集合。包括路由代码生成和资源R文件生成。

功能特性

  • 路由生成器:从 route_config.dart 自动生成路由配置
  • 资源生成器:扫描assets目录并生成类型安全的R类,包含所有资源常量
  • 灵活配置:通过 ds_builder_config.yaml 进行灵活配置
  • 零配置:开箱即用,提供合理的默认值- 通用设计:自动检测项目包名,支持任何Flutter项目

安装

pubspec.yaml 中添加:

dev_dependencies:
  build_runner: ^2.4.0
  ds_builder: ^1.0.0

使用

路由生成器

  1. 创建 lib/route_config.dart
const List<List<Object>> routesConfig = [
  ['auth', '/login', 'LoginPage', false, false],
  ['home', '/home', 'HomePage', false, true],
  ['workflow', '/workflow/:id', 'WorkflowPage', true, true],
  ['public', '/about', 'AboutPage', false, false],
];

格式:[group, path, pageName, hasParams, requireLogin]

  • hasParams:是否通过 state.extra 传参
  • requireLogin:是否需要登录校验;false 时会跳过 redirect 中的登录拦截
  • 兼容旧格式:4 个参数时默认 requireLogin = true
  1. 运行build_runner:
dart run build_runner build

这会生成 lib/router.g.dart,包含:

  • RouteNames 类,含所有路由常量
  • GoRouter 配置
  • 命名路由定义

资源生成器

  1. assets/ 目录中放置资源:
assets/
├── images/
│   ├── home/
│   │   ├── logo.png
│   │   └── avatar.png
│   └── form/
│       └── attachment.svg
└── file/
    └── config.json
  1. 运行build_runner:
dart run build_runner build

这会生成 lib/res/r.dart,包含:

class R {
  R._();
  
  static const String logoPng = 'assets/images/home/logo.png';
  static const String avatarPng = 'assets/images/home/avatar.png';
  static const String attachmentSvg = 'assets/images/form/attachment.svg';
  static const String configJson = 'assets/file/config.json';
}

配置

在项目根目录创建 ds_builder_config.yaml 来自定义行为:

# 扫描资源时忽略的目录
ignoreDirs:
  - images/emoji
  - images/country
  - fonts

如果配置文件缺失,将使用默认值。

项目设置

最小配置(使用默认值)

# 仅需运行build_runner
dart run build_runner build

完整配置(带自定义设置)

  1. dev_dependencies 中添加 ds_builder
  2. 创建 ds_builder_config.yaml 进行自定义
  3. 运行:dart run build_runner build

生成的文件

  • lib/router.g.dart - 路由配置
  • lib/res/r.dart - 资源常量

将这些添加到 .gitignore (可选 - 通常建议提交以确保版本一致性):

# 生成的文件(保留以确保一致的构建)
lib/router.g.dart
lib/res/r.dart

使用示例

使用生成的路由

import 'package:go_router/go_router.dart';
import 'router.g.dart';

final router = goRouter;

// 导航
context.go(RouteNames.home);
context.push(RouteNames.workflow, extra: {'id': 123});

使用生成的资源

import 'res/r.dart';

Image.asset(R.logoPng);
SvgPicture.asset(R.attachmentSvg);

故障排查

构建失败 "找不到 route_config.dart"

确保 lib/route_config.dart 存在于你的项目中。

配置了免登录路由但仍被跳转到登录页

  1. 检查 routesConfig 第 5 个参数是否为 false
  2. 确保访问路径与配置路径匹配(例如 /about
  3. 重新执行:dart run build_runner build --delete-conflicting-outputs

资源未出现在 R.dart 中

  1. 检查资源是否在 assets/ 目录中
  2. 验证 pubspec.yaml 中的路径:
    flutter:
      assets:
        - assets/
    

配置文件未被读取

确保 ds_builder_config.yaml 在项目根目录,而不是子目录中。

性能

Builder在 dart run build_runner build 期间运行,并被缓存。后续构建由于增量生成而更快。

开发模式下的监听模式:

dart run build_runner watch
dart pub publish --dry-run

许可证

MIT

贡献

欢迎贡献!请向仓库提交Pull Request。

支持

遇到问题或功能请求,请访问 GitHub仓库

Libraries

ds_builder
DS Builder Library Export builders for use with build_runner