Flutter构建与发送功能插件build_and_send的使用
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
更多关于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
插件来构建和发送消息了。