Flutter构建守护进程插件build_daemon的使用

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

Flutter构建守护进程插件build_daemon的使用

简介

build_daemon 是一个用于支持在守护进程中运行构建的包。通过这个包,我们可以更高效地管理构建过程,特别是在需要频繁进行增量构建的情况下。

安装

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

dependencies:
  build_daemon: ^3.0.0 # 根据实际情况选择版本

然后执行 flutter pub get 来安装依赖。

示例代码

下面是一个完整的示例,展示了如何使用 build_daemon 插件来连接到守护进程并注册构建目标。

示例代码

// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:io';
import 'dart:math';

import 'package:build_daemon/client.dart';
import 'package:build_daemon/data/build_target.dart';
import 'package:path/path.dart' as p;

void main(List<String> args) async {
  BuildDaemonClient client;
  var workingDirectory =
      p.normalize(p.join('${Directory.current.path}/../example'));

  try {
    // 连接到守护进程。如果当前没有运行,则会启动一个新的守护进程。
    client = await BuildDaemonClient.connect(
        workingDirectory,
        [
          'dart',
          'run',
          'build_runner',
          'daemon',
          '--delete-conflicting-outputs',
        ],
        logHandler: print);
  } catch (e) {
    if (e is VersionSkew) {
      print('Version skew. Please disconnect all other clients '
          'before trying to start a new one.');
    } else if (e is OptionsSkew) {
      print('Options skew. Please disconnect all other clients '
          'before trying to start a new one.');
    } else {
      print('Unexpected error: $e');
    }

    exit(1);
  }
  print('Connected to Dart Build Daemon');

  // 注册构建目标(目录)。这不会触发构建,除非有相关的文件更改。
  if (Random().nextBool()) {
    client.registerBuildTarget(DefaultBuildTarget((b) => b
      ..target = 'web'
      ..outputLocation = OutputLocation((b) => b
        ..output = 'web_output'
        ..useSymlinks = false
        ..hoist = true).toBuilder()
      ..blackListPatterns.replace([RegExp(r'.*_test\.dart$')])));
    print('Registered example web target...');
  } else {
    client.registerBuildTarget(DefaultBuildTarget((b) => b
      ..target = 'test'
      ..outputLocation = OutputLocation((b) => b
        ..output = 'test_output'
        ..useSymlinks = true
        ..hoist = false).toBuilder()));

    print('Registered test target...');
  }

  // 处理来自守护进程的事件。
  client.buildResults.listen((status) => print('BUILD STATUS: $status'));

  // 强制构建所有已注册的目标。
  client.startBuild();

  await client.finished;
}

使用说明

  1. 连接到守护进程:通过 BuildDaemonClient.connect 方法连接到守护进程。如果当前没有运行守护进程,则会启动一个新的守护进程。你可以传递一些命令行参数来配置守护进程的行为。

  2. 注册构建目标:使用 registerBuildTarget 方法注册要构建的目标。这里可以指定目标目录、输出位置等信息。注意,只有在检测到相关文件更改时才会触发构建。

  3. 处理事件:通过监听 buildResults 流来处理来自守护进程的构建状态更新。

  4. 强制构建:调用 startBuild 方法来强制构建所有已注册的目标。

  5. 等待完成:通过 await client.finished 等待守护进程完成所有任务。

注意事项

  • 确保在项目根目录下运行此脚本,以便正确设置工作目录。
  • 如果遇到版本不一致或选项冲突的错误,请确保所有其他客户端已断开连接。
  • 根据实际需求调整构建目标和输出路径。

通过 build_daemon 插件,你可以更灵活地管理和优化构建流程,特别是在大型项目中频繁进行增量构建时非常有用。希望这个示例能帮助你更好地理解和使用 build_daemon 插件。


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

1 回复

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


当然,关于在Flutter项目中构建守护进程插件 build_daemon 的使用,我可以提供一个简单的代码案例来展示如何设置和使用它。需要注意的是,build_daemon 插件并不是一个广泛认知的官方或主流插件,但我们可以假设它是一个自定义的守护进程插件,用于在后台执行某些构建任务。

以下是一个假设性的代码案例,展示了如何设置和使用一个名为 build_daemon 的插件。由于实际的 build_daemon 插件可能不存在或有所不同,这里的代码是基于假设的插件功能和Flutter插件开发的通用模式。

1. 创建 Flutter 插件项目

首先,确保你已经安装了 Flutter 和 Dart 开发环境。然后,你可以使用 Flutter CLI 创建一个新的插件项目:

flutter create --org com.example --template=plugin build_daemon

2. 配置插件项目

在插件项目的 pubspec.yaml 文件中,定义插件的依赖和平台配置。例如:

name: build_daemon
description: A Flutter plugin to run build tasks as a daemon.
version: 1.0.0+1

environment:
  sdk: ">=2.12.0 <3.0.0"
  flutter: ">=2.0.0"

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  plugin:
    platforms:
      android:
        package: com.example.build_daemon
        pluginClass: BuildDaemonPlugin
      ios:
        pluginClass: BuildDaemonPlugin

3. 实现插件功能

android/src/main/kotlin/com/example/build_daemon/BuildDaemonPlugin.kt 中实现 Android 平台的代码:

package com.example.build_daemon

import android.content.Context
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result

class BuildDaemonPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
  private var context: Context? = null
  private var channel: MethodChannel? = null

  override fun onAttachedToEngine(binding: FlutterPluginBinding) {
    context = binding.applicationContext
    channel = MethodChannel(binding.binaryMessenger, "com.example.build_daemon/channel")
    channel?.setMethodCallHandler(this)
  }

  override fun onMethodCall(call: MethodCall, result: Result) {
    if (call.method == "startDaemon") {
      // 启动守护进程,执行后台任务
      startDaemon()
      result.success("Daemon started")
    } else {
      result.notImplemented()
    }
  }

  override fun onDetachedFromEngine(binding: FlutterPluginBinding) {
    channel?.setMethodCallHandler(null)
    channel = null
    context = null
  }

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {}

  override fun onDetachedFromActivityForConfigChanges() {}

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {}

  override fun onDetachedFromActivity() {}

  private fun startDaemon() {
    // 这里实现守护进程的具体逻辑,例如启动一个后台服务
    // 注意:Android 中后台服务的执行受到严格限制,需要适当的权限和前台服务配置
  }
}

ios/Classes/BuildDaemonPlugin.swift 中实现 iOS 平台的代码:

import Flutter

public class BuildDaemonPlugin: NSObject, FlutterPlugin, MethodCallHandler {
  public static func register(with registrar: FlutterPluginRegistrar) {
    let channel = FlutterMethodChannel(name: "com.example.build_daemon/channel", binaryMessenger: registrar.messenger())
    let instance = BuildDaemonPlugin()
    registrar.addMethodCallDelegate(instance, channel: channel)
  }

  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    if call.method == "startDaemon" {
      startDaemon()
      result(success: "Daemon started")
    } else {
      result(FlutterMethodNotImplemented)
    }
  }

  private func startDaemon() {
    // 这里实现守护进程的具体逻辑,例如启动一个后台任务
    // 注意:iOS 中后台任务的执行也受到严格限制,需要适当的后台模式配置
  }
}

4. 在 Flutter 应用中使用插件

在你的 Flutter 应用项目中,添加对 build_daemon 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  build_daemon:
    path: ../path_to_your_plugin/build_daemon

然后在你的 Dart 代码中调用插件的方法:

import 'package:flutter/material.dart';
import 'package:build_daemon/build_daemon.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Build Daemon Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                await BuildDaemon.startDaemon();
                print("Daemon started successfully");
              } catch (e) {
                print("Failed to start daemon: $e");
              }
            },
            child: Text('Start Daemon'),
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 权限和后台任务:在 Android 和 iOS 上执行后台任务需要适当的权限和配置。
  2. 插件实现:实际的 build_daemon 插件可能包含更复杂的逻辑和功能,需要根据具体需求进行实现。
  3. 错误处理:示例代码中的错误处理是基础的,实际项目中应添加更详细的错误处理和日志记录。

希望这个假设性的代码案例能帮助你理解如何在 Flutter 项目中设置和使用一个守护进程插件。如果你有一个具体的 build_daemon 插件,请参考其官方文档和 API 指南进行实现。

回到顶部