Skip to content

项目生成配置 (.flu-cli.json)

Flu-CLI 支持通过项目根目录下的 .flu-cli.json 文件来自定义文件生成规则。这使得 CLI 能够适配各种自定义的项目结构,而不仅仅局限于内置的模板。

配置文件结构

配置文件主要包含 generators 字段,用于配置不同类型文件的生成规则。

json
{
  "generators": {
    "page": { ... },      // 页面生成配置
    "viewModel": { ... }, // ViewModel 生成配置
    "widget": { ... },    // Widget 生成配置
    "model": { ... }      // Model 生成配置
  }
}

快速开始

在项目根目录下运行以下命令,根据当前项目结构自动生成配置文件:

bash
flu config init

详细配置说明

Page (页面) 配置

| 字段 | 类型 | 说明 | 示例 |

DataTypeDescriptionExample
pathstring生成路径,支持 {feature} 占位符"lib/pages""lib/features/{feature}/pages"
defaultTypestring默认页面类型 (stateful / stateless)"stateful"
withViewModelboolean是否默认生成 ViewModeltrue
viewModelPathstringViewModel 生成路径 (覆盖全局配置)"lib/viewmodels"
withBasePageboolean是否继承 BasePagetrue
basePageClassstringBasePage 类名"MyBasePage"
basePageImportstringBasePage 导入路径"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 配置

字段类型说明示例
pathstring生成路径"lib/viewmodels"
withBaseViewModelboolean是否继承 BaseViewModeltrue
baseViewModelClassstringBaseViewModel 类名"BaseViewModel"
baseViewModelImportstringBaseViewModel 导入路径"lib/core/base/base_viewmodel.dart"

示例:

json
"viewModel": {
  "path": "lib/viewmodels",
  "withBaseViewModel": true,
  "baseViewModelClass": "BaseViewModel",
  "baseViewModelImport": "lib/core/base/base_viewmodel.dart"
}

Widget 配置

字段类型说明示例
pathstring生成路径"lib/widgets"
defaultTypestring默认类型 (stateless / stateful)"stateless"

示例:

json
"widget": {
  "path": "lib/widgets",
  "defaultType": "stateless"
}

Model 配置

字段类型说明示例
pathstring生成路径"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 在生成文件时遵循以下优先级:

  1. 项目配置文件 (.flu-cli.json):如果存在,拥有最高优先级。
  2. 自定义模板默认规则:如果无配置文件,且检测为自定义模板,使用“简单模式”(无 Base 类依赖)。
  3. 内置模板规则:如果无配置文件,且检测为内置模板(lite/modular/clean),使用内置规则。

Released under the MIT License.