Flutter构建工具插件build的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter构建工具插件build的使用

Flutter中的build包提供了一套强大的代码生成机制,允许开发者在编译时执行各种操作。通过定义Builder类,我们可以实现自定义的代码生成逻辑。以下是关于build包的关键概念和一个完整的示例demo。

关键概念

Builder

Builder是代码生成的业务逻辑核心。大多数使用build包的消费者都会创建自定义的Builder实现。

abstract class Builder {
  /// 指定输出文件的扩展名映射关系
  Map<String, List<String>> get buildExtensions;

  /// 实现具体的构建逻辑
  FutureOr<void> build(BuildStep buildStep);
}

BuildStep

BuildStep定义了Builder与外部世界的交互方式,它定义了工作单元,并允许读取/写入文件以及解析Dart源代码。

// 示例:读取和写入文件
var contents = await buildStep.readAsString(inputId);
await buildStep.writeAsString(copy, contents);

Resolver

Resolver提供了对Dart分析器的接口,允许解析需要静态分析或代码生成的代码。

// 示例:使用resolver解析库
var entryLib = await buildStep.inputLibrary;
var resolver = buildStep.resolver;
var libFromAsset = await resolver.libraryFor(
    AssetId.resolve(Uri.parse('some_import.dart'), from: buildStep.inputId));

Resource

Resource类可以用于跨多个构建步骤共享昂贵的对象实例,确保这些对象在不同的构建中唯一,同时可以在生命周期结束时进行清理。

final resource = Resource(
  () => createMyExpensiveResource(),
  dispose: (instance) async {
    await instance.doSomeCleanup();
  }
);

完整示例demo

创建一个简单的CopyBuilder

我们将创建一个简单的Builder,它会将.txt文件复制为带有额外扩展名的新文件。

步骤1:添加依赖

首先,在pubspec.yaml中添加build包的依赖:

dev_dependencies:
  build_runner: ^2.3.0
  build: ^2.3.0

步骤2:创建Builder实现

创建一个新的Dart文件copy_builder.dart,并实现CopyBuilder

import 'package:build/build.dart';

/// 简单的Builder,用于复制.txt文件
class CopyBuilder implements Builder {
  @override
  final buildExtensions = const {
    '.txt': ['.txt.copy']
  };

  @override
  Future<void> build(BuildStep buildStep) async {
    var inputId = buildStep.inputId;
    var copy = inputId.addExtension('.copy');
    var contents = await buildStep.readAsString(inputId);

    // 写出新的资产
    await buildStep.writeAsString(copy, contents);
  }
}

步骤3:配置builders

接下来,在build.yaml中配置我们的CopyBuilder

targets:
  $default:
    builders:
      your_package_name|copy_builder:
        generate_for:
          include: ['**/*.txt']

步骤4:运行构建

确保你有一个.txt文件(例如example.txt),然后运行以下命令来启动构建过程:

flutter packages pub run build_runner build

这将触发CopyBuilder,并生成一个名为example.txt.copy的新文件,其内容与原始文件相同。

使用Analyzer解析代码

如果你需要解析Dart代码,可以通过Resolver来实现。这里我们展示如何创建一个解析并复制Dart文件的Builder

import 'package:build/build.dart';

class ResolvingCopyBuilder implements Builder {
  @override
  final buildExtensions = const {
    '.dart': ['.dart.copy']
  };

  @override
  Future<void> build(BuildStep buildStep) async {
    var entryLib = await buildStep.inputLibrary;
    var resolver = buildStep.resolver;
    
    // 解析其他库
    var libFromAsset = await resolver.libraryFor(
        AssetId.resolve(Uri.parse('some_import.dart'), from: buildStep.inputId));

    // 或者根据名称查找库
    var libByName = await resolver.findLibraryByName('my.library');

    // 复制文件
    var inputId = buildStep.inputId;
    var copy = inputId.addExtension('.copy');
    var contents = await buildStep.readAsString(inputId);
    await buildStep.writeAsString(copy, contents);
  }
}

同样地,你需要在build.yaml中配置这个ResolvingCopyBuilder,并确保有相应的.dart文件作为输入。

以上就是关于Flutter构建工具插件build的基本用法介绍。希望这个指南能帮助你理解如何使用build包来实现代码生成任务。如果你有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter构建工具插件build的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter构建工具插件build的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,flutter_tools 提供了许多命令行工具来帮助开发者构建、运行和调试他们的应用。其中,flutter build 命令是用来构建 Flutter 应用的主要工具。虽然 flutter_tools 本身是一个命令行工具集,而不是一个插件,但你可以通过配置 pubspec.yaml 文件以及使用自定义脚本和插件来扩展你的 Flutter 构建过程。

下面是一个关于如何使用 flutter build 命令的基本示例,以及如何通过插件(如 build_runner)来辅助构建过程的代码案例。

基本使用 flutter build

要构建你的 Flutter 应用,你可以使用以下命令:

# 构建用于 Android 的 APK
flutter build apk --release

# 构建用于 iOS 的 IPA(需要 Xcode 和 macOS)
flutter build ios --release

# 构建用于 Web 的应用
flutter build web

使用 build_runner 插件进行构建脚本管理

build_runner 是一个常用于 Dart 和 Flutter 项目的构建工具,它可以用来运行自定义的构建脚本。下面是一个简单的例子,展示如何使用 build_runner 来运行一个自定义的构建任务。

首先,在你的 Flutter 项目的 pubspec.yaml 文件中添加 build_runner 依赖:

dev_dependencies:
  build_runner: ^x.y.z  # 请替换为最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,创建一个 build.yaml 文件来定义你的构建配置。例如,如果你有一个自定义的代码生成任务,你可以这样配置:

targets:
  $default:
    builders:
      my_custom_builder:
        enabled: true

然后,创建一个 Dart 脚本(比如 build.dart),用于定义你的自定义构建器:

import 'package:build/build.dart';

Builder myCustomBuilder(BuilderOptions options) {
  return new Builder(
    id: 'my_custom_builder',
    buildExtensions: {'.dart': ['.generated.dart']},
    build: (BuildStep buildStep) async {
      var inputId = buildStep.inputId;
      var inputContent = await buildStep.readAsString(inputId);
      
      // 在这里添加你的代码生成逻辑
      var outputContent = inputContent + '\n// This is generated content.';
      
      var outputId = new AssetId(inputId.package, inputId.path.replaceExtension('.generated.dart'));
      await buildStep.writeAsString(outputId, outputContent);
    }
  );
}

最后,你可以使用 build_runner 来运行你的自定义构建任务:

flutter pub run build_runner build

这将根据 build.yamlbuild.dart 文件中定义的规则来执行你的自定义构建任务。

结论

虽然 flutter build 命令本身不需要插件来执行基本的构建任务,但通过使用像 build_runner 这样的工具,你可以大大增强你的构建过程,包括添加自定义的代码生成、资源处理等任务。上面的代码案例展示了如何设置和使用 build_runner 来运行自定义的构建脚本。

回到顶部