项目生成配置 (.flu-cli.json)
Flu-CLI 支持通过项目根目录下的 .flu-cli.json 文件来自定义文件生成规则。这使得 CLI 能够适配各种自定义的项目结构,而不仅仅局限于内置的模板。
配置文件结构
配置文件主要包含 generators 字段,用于配置不同类型文件的生成规则。
json
{
"generators": {
"page": { ... }, // 页面生成配置
"viewModel": { ... }, // ViewModel 生成配置
"widget": { ... }, // Widget 生成配置
"model": { ... } // Model 生成配置
}
}快速开始
在项目根目录下运行以下命令,根据当前项目结构自动生成配置文件:
bash
flu config init详细配置说明
Page (页面) 配置
| 字段 | 类型 | 说明 | 示例 |
| Data | Type | Description | Example |
|---|---|---|---|
path | string | 生成路径,支持 {feature} 占位符 | "lib/pages" 或 "lib/features/{feature}/pages" |
defaultType | string | 默认页面类型 (stateful / stateless) | "stateful" |
withViewModel | boolean | 是否默认生成 ViewModel | true |
viewModelPath | string | ViewModel 生成路径 (覆盖全局配置) | "lib/viewmodels" |
withBasePage | boolean | 是否继承 BasePage | true |
basePageClass | string | BasePage 类名 | "MyBasePage" |
basePageImport | string | BasePage 导入路径 | "package:my_app/core/base_page.dart" |
示例:
json
"page": {
"path": "lib/pages",
"defaultType": "stateful",
"withViewModel": true,
"withBasePage": true,
"basePageClass": "BasePage",
"basePageImport": "lib/core/base/base_page.dart"
}ViewModel 配置
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
path | string | 生成路径 | "lib/viewmodels" |
withBaseViewModel | boolean | 是否继承 BaseViewModel | true |
baseViewModelClass | string | BaseViewModel 类名 | "BaseViewModel" |
baseViewModelImport | string | BaseViewModel 导入路径 | "lib/core/base/base_viewmodel.dart" |
示例:
json
"viewModel": {
"path": "lib/viewmodels",
"withBaseViewModel": true,
"baseViewModelClass": "BaseViewModel",
"baseViewModelImport": "lib/core/base/base_viewmodel.dart"
}Widget 配置
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
path | string | 生成路径 | "lib/widgets" |
defaultType | string | 默认类型 (stateless / stateful) | "stateless" |
示例:
json
"widget": {
"path": "lib/widgets",
"defaultType": "stateless"
}Model 配置
| 字段 | 类型 | 说明 | 示例 |
|---|---|---|---|
path | string | 生成路径 | "lib/models" |
示例:
json
"model": {
"path": "lib/models"
}常见场景配置与示例
场景 1:自定义简单项目 (无 Base 类)
如果你有一个简单的项目结构,不需要继承任何 Base 类,也不强制绑定 ViewModel。
配置文件 (.flu-cli.json):
json
{
"generators": {
"page": {
"path": "lib/pages",
"defaultType": "stateful",
"withBasePage": false,
"withViewModel": false
}
}
}生成的目录结构:
lib/
└── pages/
└── home_page.dart <-- 纯净的 StatefulWidget生成的代码 (home_page.dart):
dart
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Home')),
body: const Center(child: Text('HomePage')),
);
}
}场景 2:自定义 Base 类与 ViewModel
如果你的项目使用了自定义的 Base 类(例如 MyBasePage)和 ViewModel。
配置文件 (.flu-cli.json):
json
{
"generators": {
"page": {
"path": "lib/pages",
"withBasePage": true,
"basePageClass": "MyBasePage",
"basePageImport": "package:my_app/core/ui/my_base_page.dart",
"withViewModel": true
},
"viewModel": {
"path": "lib/viewmodels",
"withBaseViewModel": true,
"baseViewModelClass": "MyBaseViewModel",
"baseViewModelImport": "package:my_app/core/vm/my_base_vm.dart"
}
}
}生成的目录结构:
lib/
├── core/
│ ├── ui/
│ │ └── my_base_page.dart
│ └── vm/
│ └── my_base_vm.dart
├── pages/
│ └── home_page.dart <-- 继承自 MyBasePage
└── viewmodels/
└── home_viewmodel.dart <-- 继承自 MyBaseViewModel生成的代码 (home_page.dart):
dart
import 'package:flutter/material.dart';
import 'package:my_app/core/ui/my_base_page.dart';
import 'package:my_app/viewmodels/home_viewmodel.dart';
class HomePage extends MyBasePage<HomeViewModel> {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends MyBasePageState<HomeViewModel, HomePage> {
@override
HomeViewModel createViewModel() => HomeViewModel();
@override
Widget buildContent(BuildContext context) {
return const Center(child: Text('HomePage'));
}
}场景 3:按功能模块划分 (Feature-first)
如果你的项目是按功能模块划分的,可以使用 {feature} 占位符。
配置文件 (.flu-cli.json):
json
{
"generators": {
"page": {
"path": "lib/features/{feature}/presentation/pages",
"withViewModel": true
},
"viewModel": {
"path": "lib/features/{feature}/presentation/viewmodels"
}
}
}执行命令:
bash
flu add page login -f auth生成的目录结构:
lib/
└── features/
└── auth/ <-- feature: auth
└── presentation/
├── pages/
│ └── login_page.dart
└── viewmodels/
└── login_viewmodel.dart优先级说明
Flu-CLI 在生成文件时遵循以下优先级:
- 项目配置文件 (.flu-cli.json):如果存在,拥有最高优先级。
- 自定义模板默认规则:如果无配置文件,且检测为自定义模板,使用“简单模式”(无 Base 类依赖)。
- 内置模板规则:如果无配置文件,且检测为内置模板(lite/modular/clean),使用内置规则。