Flutter构建解析插件build_resolvers的使用

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

Flutter构建解析插件 build_resolvers 的使用

build_resolvers 是一个为 package:build 提供的内存中的 Resolvers 实现。它从源代码进行单块分析,并具有细粒度的失效机制,适用于在同一进程中共享多个构建步骤的情况。然而,对于更通用的构建系统,建议使用 analyzer summaries 来构建其分析上下文。

用途

  • 在同一进程中共享多个构建步骤时非常有用。
  • 不适合用于更通用的构建系统,这些系统应该使用 analyzer summaries 来构建其分析上下文。

如何使用

首先,在你的 pubspec.yaml 文件中添加 build_resolvers 作为依赖:

dependencies:
  build_resolvers: ^2.0.0

然后,你可以创建一个简单的构建脚本来演示如何使用 build_resolvers。以下是一个示例 demo:

示例 Demo

假设我们有一个项目结构如下:

my_project/
│
├── lib/
│   └── main.dart
├── build.yaml
└── tool/
    └── build.dart

lib/main.dart

void greet(String name) {
  print('Hello, $name!');
}

build.yaml

targets:
  $default:
    builders:
      my_builder:
        generate_for:
          - lib/*.dart

tool/build.dart

在这个文件中,我们将编写我们的构建逻辑,利用 build_resolvers 来解析和处理 Dart 源文件。

import 'package:build_runner_core/build_runner_core.dart' as _i1;
import 'package:build_resolvers/build_resolvers.dart' as _i2;
import 'package:build/build.dart' as _i3;

void main(List<String> args, [_i1.BuildOptions options]) async {
  final resolvers = _i2.resolver;
  
  await _i1.BuildRunner.create(
    assetGraphSources: const [],
    reader: _i3.BarbackAssetReader(),
    writer: _i3.InMemoryAssetWriter(),
    resolvers: resolvers,
    targetGraph: await _i1.TargetGraph.forPackage('my_project'),
  ).run(args);
}

class MyBuilder implements _i3.Builder {
  @override
  final buildExtensions = const {
    '.dart': ['.g.dart']
  };

  @override
  Future<void> build(_i3.BuildStep buildStep) async {
    final inputId = buildStep.inputId;
    final contents = await buildStep.readAsString(inputId);

    // Example processing
    final outputContents = "Generated from ${inputId.path}:\n$contents";

    // Write the generated content to a new file.
    await buildStep.writeAsString(
      inputId.changeExtension('.g.dart'),
      outputContents,
    );
  }
}

这个示例展示了如何使用 build_resolvers 来处理 Dart 文件并生成新的 Dart 文件。请注意,这只是一个基本的例子,实际应用中你可能需要根据具体需求调整代码。

通过上述步骤,你应该能够开始使用 build_resolvers 来增强你的构建流程。请确保仔细阅读官方文档以获取更多高级功能和配置选项。


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

1 回复

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


当然,关于在Flutter中使用build_resolvers插件,这通常涉及到构建系统(如build_runner)中的依赖解析。build_resolvers主要用于生成器(Builders)在构建过程中解析Dart文件依赖。

以下是一个简要的示例,展示了如何在Flutter项目中使用build_resolvers来解析Dart文件中的依赖关系。为了简洁,我们假设你已经有一个Flutter项目,并且已经添加了必要的依赖项,比如build_runnerbuild

  1. 添加依赖: 首先,确保你的pubspec.yaml文件中包含必要的依赖项。你可能需要添加或更新以下依赖:

    dependencies:
      flutter:
        sdk: flutter
    
    dev_dependencies:
      build_runner: ^2.0.0
      build: ^2.0.0
      build_resolvers: ^2.0.0
    
  2. 创建一个Builder: 接下来,我们创建一个简单的Builder,它将使用build_resolvers来解析依赖关系。这个Builder不会实际生成任何文件,但将展示如何使用解析器。

    创建一个新的Dart文件,例如lib/builder/example_builder.dart

    import 'package:build/build.dart';
    import 'package:build_resolvers/build_resolvers.dart';
    import 'dart:async';
    
    Builder exampleBuilder(BuilderOptions options) {
      return (BuildStep buildStep) async {
        // 获取解析器
        var resolver = await buildStep.resolver;
    
        // 解析主库文件(例如lib/main.dart)
        var mainLibrary = resolver.findLibraryByName('main');
    
        if (mainLibrary != null) {
          print('Found main library: ${mainLibrary.file.path}');
    
          // 遍历main库中的导入
          for (var import in mainLibrary.imports) {
            print('  Imports: ${import.uri.toString()}');
          }
        } else {
          print('Main library not found.');
        }
    
        // 注意:这里没有实际生成文件,仅作示例
        return null;
      };
    }
    
  3. 更新build.yaml: 然后,在你的build.yaml文件中注册这个Builder:

    builders:
      example_builder:
        import: "package:your_package_name/builder/example_builder.dart"
        builder_factories: ["exampleBuilder"]
        build_extensions: {".dart": [".example_output"]}
        auto_apply: root_package
        build_to: source
    

    注意将your_package_name替换为你的实际包名。

  4. 运行Builder: 最后,你可以使用build_runner来运行这个Builder。在项目根目录下运行以下命令:

    flutter pub run build_runner build --delete-conflicting-outputs
    

    这个命令将触发example_builder,它将解析lib/main.dart文件并打印出导入的URI。

这个示例展示了如何使用build_resolvers来解析Dart文件的依赖关系。在实际应用中,你可能会基于这些解析结果生成代码或其他资源。希望这个示例对你有所帮助!

回到顶部