Flutter构建与发送功能插件build_and_send的使用

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

Flutter构建与发送功能插件build_and_send的使用

概述

build_and_send 是一个用于构建工件、上传和发送的Dart包。

功能

  • 构建APK和应用包(app bundles)
  • 上传到Google Cloud Storage
  • 构建iOS IPA
  • 上传IPA到TestFlight
  • 发送通知到Discord

安装

在项目的 pubspec.yaml 文件中的 dev_dependencies 部分添加 build_and_send

dev_dependencies:
  build_and_send: any

使用

在项目文件夹中,运行以下命令:

dart run build_and_send
选项
  • -p, --platform:要构建的平台。可以是 android、ios 或 all。默认是 all。
  • -f, --flavor:要构建的风味。
  • -s, --silent:静默模式。即使配置了也不会发送任何通知到 Discord。
  • -m, --mention:在发送通知时提到特定用户。提供逗号分隔的名字。如果没有提供,则会提到所有已配置的用户。参见 build_config.yaml 示例 [command -m user1,user2],在 .yaml 文件中 mentionUsers: user1:1234567890,user2:0987654321
  • -n, --no-mention:在发送通知时不提及任何用户。如果未提供,则会提到所有已配置的用户。
  • --no-pod-sync':如果你在 iOS 构建时遇到问题,可以尝试手动同步 pod 文件。此标志将跳过 pod install 步骤。
  • --only-upload:如果你只想上传,可以使用此标志。通常用于上传之前的构建。
  • -v, --verbose:详细模式。将会打印更多信息。
  • -h, --help:显示帮助信息。

配置

创建一个 build_config.yaml 文件。该文件包含构建和发送过程的配置。

示例
build:
  # fvm, shorebird, default
  method: default
  android:
    # optional, 如果需要传递任何参数给构建命令,例如使用特定的 -t 目标或 shorebird 配置
    # 如 --flutter-version 或其他内容
    build_args: null
    # optional
    apk_path: null
    # optional
    bundle_path: null
    # 如果 cloud 未给出则仅构建
    gcloud:
      bucket: gcloud-bucket
      app_id: app-id
  ios:
    # optional, 如果需要传递任何参数给构建命令,例如使用特定的 -t 目标或 shorebird 配置如 --flutter-version 或其他内容
    build_args: 
    # 如果未给出则仅构建 ipa 文件,将在 build/ios/ipa 中搜索
    ipa_name: null
  # optional
  flavors:
    # 通过使用默认值,如果调用包的构建函数,将使用相应的风味,该值必须是有效的风味名称
    default_build: null
    dev:
      # fvm, shorebird, default
      method: default
      android:
        # 传递风味标志和其他内容,不需要传递 --flavor dev 因为它是隐式的
        build_args: -t lib/main_dev.dart
        # required 一般风味更改构建文件名
        apk_name: 
        # optional
        apk_path: null
        # 一般风味更改构建文件名
        bundle_name:
        # optional
        bundle_path: null
        # 如果要使用自定义电子邮件,请在 build.env 中设置 DEV_ANDROID_EMAIL,此电子邮件必须具有对此 gcloud 的访问权限
        # 如果 cloud 未给出则仅构建
        gcloud:
          bucket: flavor1-bucket
          app_id: flavor1-app-id

      ios:
        # 传递风味标志和其他内容,不需要传递 --flavor dev 因为它是隐式的
        build_args: -t lib/main_dev.dart
        # 如果未给出则仅构建 ipa 文件,将在 build/ios/ipa 中搜索
        ipa_name: null
    # optional,如果给出将发送带有 Android 上传链接的消息
discord:
  # required
  webhook_url: YOUR_DISCORD_WEBHOOK_URL
  # optional,将在消息中标记频道
  channel_id: YOUR_DISCORD_CHANNEL_ID
  # optional
  mention_users: user1:123456789012345678,user2:987654321098765432
  # 默认 true
  show_version: true
  # 默认 true
  show_flavor: true

创建一个 build.env 文件在项目的根目录下

请记住将 build.env 文件添加到 .gitignore 以防止敏感信息被提交到您的存储库中。

ACCOUNT_EMAIL=upload.to.gc@example.com
FLAVOR1_UPLOAD_EMAIL=flavor1.permissions@example.com
APPLE_EMAIL=your_apple@mail.com
APPLE_APP_SPECIFIC_PASSWORD=your_app_specific_password
# 如果不想使用 Discord,请删除
DISCORD_SENDER_ID=000000000000000

iOS 配置

IOS_DEPLOY_EMAIL=your@email.com 是用于将应用程序部署到 TestFlight 的电子邮件。 IOS_APP_SPECIFIC_PASSWORD=your_app_specific_password 是用于将应用程序部署到 TestFlight 的特定应用密码。可以在 https://appleid.apple.com/ 的 “Specific App Passwords” 部分设置。

完整示例 Demo

以下是完整的示例代码,展示如何配置和使用 build_and_send 插件。

build_config.yaml

build:
  method: default
  android:
    build_args: null
    apk_path: null
    bundle_path: null
    gcloud:
      bucket: my-gcloud-bucket
      app_id: my-app-id
  ios:
    build_args: null
    ipa_name: null
  flavors:
    default_build: null
    dev:
      method: default
      android:
        build_args: -t lib/main_dev.dart
        apk_name: dev-release.apk
        gcloud:
          bucket: dev-flavor-bucket
          app_id: dev-flavor-app-id
      ios:
        build_args: -t lib/main_dev.dart
        ipa_name: dev-release.ipa
discord:
  webhook_url: YOUR_DISCORD_WEBHOOK_URL
  channel_id: YOUR_DISCORD_CHANNEL_ID
  mention_users: user1:123456789012345678,user2:987654321098765432
  show_version: true
  show_flavor: true

build.env

ACCOUNT_EMAIL=my-email@example.com
FLAVOR1_UPLOAD_EMAIL=flavor1.email@example.com
APPLE_EMAIL=my-apple-email@example.com
APPLE_APP_SPECIFIC_PASSWORD=my-app-specific-password
DISCORD_SENDER_ID=000000000000000

运行命令

在终端中执行以下命令来构建和发送:

dart run build_and_send -p all -f dev -m user1,user2

更多关于Flutter构建与发送功能插件build_and_send的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter构建与发送功能插件build_and_send的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中构建和使用一个简单的build_and_send插件的示例代码。这个插件将实现一个简单的文本构建和发送功能。为了简化示例,我们将使用Dart的原生代码和Flutter平台通道(Platform Channels)来实现这一功能。

1. 创建Flutter插件项目

首先,你需要一个Flutter项目。如果你还没有Flutter项目,可以使用以下命令创建一个新的Flutter项目:

flutter create my_flutter_app
cd my_flutter_app

2. 创建自定义插件

在Flutter项目的根目录下,创建一个新的插件目录,例如build_and_send

mkdir plugins/build_and_send
cd plugins/build_and_send
flutter create --template=plugin --org=com.example --platforms=android,ios .

这将创建一个基本的Flutter插件结构。

3. 实现插件的Dart代码

plugins/build_and_send/lib/build_and_send.dart中,编写插件的Dart代码:

import 'dart:async';

import 'package:flutter/services.dart';

class BuildAndSend {
  static const MethodChannel _channel = const MethodChannel('com.example.build_and_send');

  static Future<String?> buildMessage(String message) async {
    final String? result = await _channel.invokeMethod('buildMessage', message);
    return result;
  }

  static Future<void> sendMessage(String message) async {
    try {
      await _channel.invokeMethod('sendMessage', message);
    } on PlatformException catch (e) {
      print("Failed to send message: '${e.message}'.");
    }
  }
}

4. 实现Android原生代码

plugins/build_and_send/android/src/main/kotlin/com/example/build_and_send/BuildAndSendPlugin.kt中,编写Android原生代码:

package com.example.build_and_send

import android.content.Context
import androidx.annotation.NonNull
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.MethodChannel
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result

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

  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPluginBinding) {
    channel = MethodChannel(flutterPluginBinding.binaryMessenger, "com.example.build_and_send")
    channel?.setMethodCallHandler(this)
    context = flutterPluginBinding.applicationContext
  }

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    if (call.method == "buildMessage") {
      val message = call.argument<String>("message") ?: ""
      result.success("Processed message: $message")
    } else if (call.method == "sendMessage") {
      val message = call.argument<String>("message") ?: ""
      // Here you can add the actual logic to send the message, e.g., via network, SMS, etc.
      // For simplicity, we'll just print it to the log.
      println("Sending message: $message")
      result.success(null)
    } else {
      result.notImplemented()
    }
  }

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

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
    // This method is optional
  }

  override fun onDetachedFromActivityForConfigChanges() {
    // This method is optional
  }

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
    // This method is optional
  }

  override fun onDetachedFromActivity() {
    // This method is optional
  }
}

5. 实现iOS原生代码

plugins/build_and_send/ios/Classes/BuildAndSendPlugin.swift中,编写iOS原生代码:

import Flutter

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

  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    switch call.method {
    case "buildMessage":
      guard let message = call.arguments as? String else {
        result("Invalid argument")
        return
      }
      result("Processed message: \(message)")
    case "sendMessage":
      guard let message = call.arguments as? String else {
        result("Invalid argument")
        return
      }
      // Here you can add the actual logic to send the message, e.g., via network, SMS, etc.
      // For simplicity, we'll just print it to the log.
      print("Sending message: \(message)")
      result(())
    default:
      result(FlutterMethodNotImplemented)
    }
  }
}

6. 在Flutter项目中使用插件

回到你的Flutter项目根目录,编辑pubspec.yaml文件,添加对本地插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  build_and_send:
    path: ./plugins/build_and_send

然后,在lib/main.dart中,使用你的插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Build and Send Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Hello, Flutter!',
                style: TextStyle(fontSize: 20),
              ),
              ElevatedButton(
                onPressed: () async {
                  String? processedMessage = await BuildAndSend.buildMessage("Hello, World!");
                  print(processedMessage ?? "Failed to process message");
                  await BuildAndSend.sendMessage("Hello, World!");
                },
                child: Text('Build and Send Message'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

7. 运行Flutter项目

确保你已经连接了Android设备或启动了iOS模拟器,然后运行以下命令来构建和运行你的Flutter项目:

flutter run

这样,你就可以在Flutter应用中调用BuildAndSend插件来构建和发送消息了。

回到顶部