Flutter动作执行工具插件actions_toolkit_dart的使用

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

Flutter动作执行工具插件actions_toolkit_dart的使用

简介

actions_toolkit_dart 是一个为 GitHub Actions 编写的 Dart 工具包。它提供了核心功能,用于设置结果、日志记录、注册密钥和导出变量等操作。这个工具包是官方 actions/toolkit 的 Dart 版本移植。

安装

你可以通过以下两种方式安装 actions_toolkit_dart

  1. 使用 dart pub add 命令:

    $ dart pub add actions_toolkit_dart
    
  2. 手动添加到 pubspec.yaml 文件中:

    dependencies:
      actions_toolkit_dart: ^0.5.1
    

导入包

在 Dart 文件中导入 actions_toolkit_dart 包:

import 'package:actions_toolkit_dart/core.dart' as core;

使用示例

1. 输入/输出 (Inputs/Outputs)

你可以使用 getInputgetBooleanInput 来读取 GitHub Actions 的输入参数,并使用 setOutput 来设置输出参数。

// 获取输入参数
final myInput = core.getInput(name: 'inputName', options: const core.InputOptions(required: true));
final myBooleanInput = core.getBooleanInput(name: 'booleanInputName', options: const core.InputOptions(required: true));
final myMultilineInput = core.getMultilineInput(name: 'multilineInputName', options: const core.InputOptions(required: true));

// 设置输出参数
core.setOutput(name: 'outputKey', value: 'outputVal');

2. 导出环境变量 (Exporting Variables)

由于每个步骤在独立的进程中运行,你可以使用 exportVariable 将变量导出到当前步骤和后续步骤的环境变量中。

core.exportVariable(name: 'envVar', value: 'Val');

3. 设置密钥 (Setting a Secret)

设置密钥可以确保其在日志中被屏蔽。

core.setSecret('myPassword');

4. 路径操作 (PATH Manipulation)

使用 addPath 可以将工具的路径添加到作业的 PATH 环境变量中,而不会影响机器或容器的状态。

core.addPath('/path/to/my_tool');

5. 设置退出代码 (Exit codes)

你应该使用此库来设置失败的退出代码。如果未设置状态且脚本运行完成,则会导致成功。

try {
  // 执行某些操作
}
catch (err) {
  // setFailed 记录消息并设置失败的退出代码
  core.setFailed('Action failed with error $err');
}

6. 日志记录 (Logging)

你可以使用 debugwarninginfonotice 方法进行日志记录。

import 'package:actions_toolkit_dart/core.dart' as core;

try {
  core.debug('Inside try block');

  core.warning('myInput was not set');

  if (core.isDebug()) {
    // curl -v https://github.com
  } else {
    // curl https://github.com
  }

  // 执行某些操作
  core.info('Output to the actions build log');

  core.notice('This is a message that will also emit an annotation');
}
catch (err) {
  core.error('Error $err, action may still succeed though');
}

7. 折叠输出 (Foldable Groups)

此库还可以将输出包裹在可折叠的组中。

import 'package:actions_toolkit_dart/core.dart' as core;

// 手动包裹输出
core.startGroup('Do some function');
doSomeFunction();
core.endGroup();

// 包裹异步函数调用
const result = await core.group('Do something async', () async {
  const response = await doSomeHTTPRequest();
  return response;
});

8. 注解 (Annotations)

此库有三种方法可以生成注解,这些注解会显示在 GitHub Actions 页面和 Pull Requests 中。

core.error('This is a bad error. This will also fail the build.');

core.warning("Something went wrong, but it's not bad enough to fail the build.");

core.notice('Something happened that you might want to know about.');

完整示例 Demo

以下是一个完整的示例,展示了如何使用 actions_toolkit_dart 创建一个简单的 GitHub Action:

import 'package:actions_toolkit_dart/core.dart' as core;

void main() async {
  try {
    // 获取输入参数
    final inputName = core.getInput(name: 'inputName', options: const core.InputOptions(required: true));
    final booleanInput = core.getBooleanInput(name: 'booleanInputName', options: const core.InputOptions(required: true));
    final multilineInput = core.getMultilineInput(name: 'multilineInputName', options: const core.InputOptions(required: true));

    // 设置输出参数
    core.setOutput(name: 'outputKey', value: 'outputVal');

    // 导出环境变量
    core.exportVariable(name: 'envVar', value: 'Val');

    // 设置密钥
    core.setSecret('myPassword');

    // 路径操作
    core.addPath('/path/to/my_tool');

    // 日志记录
    core.debug('Inside try block');
    core.warning('myInput was not set');
    core.info('Output to the actions build log');
    core.notice('This is a message that will also emit an annotation');

    // 折叠输出
    core.startGroup('Do some function');
    doSomeFunction();
    core.endGroup();

    // 包裹异步函数调用
    const result = await core.group('Do something async', () async {
      const response = await doSomeHTTPRequest();
      return response;
    });

    // 输出结果
    core.info('Result: $result');
  } catch (err) {
    // 设置失败的退出代码
    core.setFailed('Action failed with error $err');
  }
}

void doSomeFunction() {
  // 模拟一些操作
  core.info('Doing some function...');
}

Future<String> doSomeHTTPRequest() async {
  // 模拟 HTTP 请求
  await Future.delayed(Duration(seconds: 2));
  return 'HTTP Response';
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用actions_toolkit_dart插件的示例代码。actions_toolkit_dart是一个假定的Flutter插件,用于执行各种动作(实际操作中,你需要根据真实的插件文档进行调整)。由于actions_toolkit_dart并非一个真实存在的广泛认知的插件,以下示例将基于一个假设的API结构。

首先,确保你已经在pubspec.yaml文件中添加了actions_toolkit_dart依赖(注意:这里是一个假设的依赖项,实际使用时需要替换为真实存在的插件):

dependencies:
  flutter:
    sdk: flutter
  actions_toolkit_dart: ^1.0.0  # 假设的版本号

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

接下来,在你的Flutter项目中,你可以按照以下方式使用actions_toolkit_dart插件:

import 'package:flutter/material.dart';
import 'package:actions_toolkit_dart/actions_toolkit_dart.dart'; // 假设的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Actions Toolkit Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final ActionsToolkit _actionsToolkit = ActionsToolkit();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Actions Toolkit Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 假设的动作:显示一个Toast消息
                await _actionsToolkit.showToast('Hello, Actions Toolkit!');
              },
              child: Text('Show Toast'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                // 假设的动作:启动一个网络请求
                var response = await _actionsToolkit.fetchData('https://api.example.com/data');
                print('Data fetched: $response');
              },
              child: Text('Fetch Data'),
            ),
          ],
        ),
      ),
    );
  }
}

// 假设的ActionsToolkit类实现
class ActionsToolkit {
  // 显示Toast消息的模拟方法
  Future<void> showToast(String message) async {
    // 这里可以使用Flutter的ScaffoldMessenger来显示Snackbar,模拟Toast效果
    ScaffoldMessenger.of(Get.context!)?.showSnackBar(
      SnackBar(
        content: Text(message),
        duration: Duration(seconds: 2),
      ),
    );
  }

  // 模拟网络请求的方法
  Future<String> fetchData(String url) async {
    // 使用Dart的http包进行网络请求(需要提前添加http依赖)
    // import 'package:http/http.dart' as http;
    var response = await http.get(Uri.parse(url));
    if (response.statusCode == 200) {
      return response.body;
    } else {
      throw Exception('Failed to fetch data: ${response.statusCode}');
    }
  }
}

注意

  1. 上述代码中的ActionsToolkit类是一个假设的实现,用于展示如何定义动作执行工具的方法。
  2. showToast方法使用了ScaffoldMessenger来显示一个Snackbar,以模拟Toast消息的效果。
  3. fetchData方法使用了http包进行网络请求,你需要确保在pubspec.yaml文件中添加了http依赖,并导入了package:http/http.dart
  4. 由于actions_toolkit_dart是一个假设的插件,你需要根据实际的插件文档调整代码。

希望这个示例能够帮助你理解如何在Flutter项目中使用动作执行工具插件。如果有任何真实存在的插件,你可以参考其官方文档进行具体实现。

回到顶部