Flutter未知功能插件sheller的探索使用
Flutter未知功能插件sheller的探索使用
简介
sheller
是一个 Dart 插件,它通过提供与 shell 交互的实用工具,使得在 Dart 中编写脚本变得更加方便。它可以替代大多数或全部的脚本(例如 bash 或 Python 脚本),并支持将 shell 输出转换为 Dart 类型。
特性
- 支持同步和异步操作
- 内置多种类型转换
- 支持自定义类型转换
- 跨平台支持(Linux、MacOS、Windows)
安装
在 pubspec.yaml
文件中添加依赖:
dependencies:
sheller: ^latest_version
然后运行 flutter pub get
来安装插件。
使用示例
基本用法
以下是一个基本的示例,展示了如何使用 sheller
运行 shell 命令并处理输出:
import 'package:sheller/sync.dart';
// import 'package:sheller/async.dart'; // 也可以使用异步版本
void main() {
// 运行命令并打印输出
print($("netstat")());
// 运行命令并将输出转换为 Dart 类型
int number = $("echo 1")();
assert(number == 1);
// 处理 JSON 输出
String data = '{"id":1, "name":"lorem ipsum", "address":"dolor set amet"}';
Map<String, dynamic> json = $('echo $data')();
assert(json.entries.length == 3);
// 将字符串按空格分割并转换为列表
List<double> doubleList = $('echo 1 2 3').spaces();
assert(doubleList.length == 3);
// 获取进程信息
$ shellClassInstance = $("echo 1");
int id = shellClassInstance.pid;
int exitCode = shellClassInstance.exitCode;
int convertedResult = shellClassInstance();
assert(convertedResult == 1);
// 获取文件列表
List<File> files = $("find . -maxdepth 1 -type f").lines();
// 写入文件
$("echo 1") > File("./temp");
// 追加到文件
$("echo 2") >> File("./temp");
}
异步用法
以下是异步版本的示例:
import 'dart:io';
import 'package:sheller/async.dart';
void main() async {
// 运行命令并获取输出
int number = await $("echo 1")();
assert(number == 1);
// 处理 JSON 输出
String data = Platform.isWindows
? '{"id":1, "name":"lorem ipsum", "address":"dolor set amet"}'
: '{\\"id\\":1, \\"name\\":\\"lorem ipsum\\", \\"address\\":\\"dolor set amet\\"}';
Map<String, dynamic> json = await $('echo $data')();
assert(json.entries.length == 3);
// 将字符串按空格分割并转换为列表
List<double> doubleList = await $('echo 1 2 3').spaces();
assert(doubleList.length == 3);
// 获取进程信息
$ shellClass = $("echo 1");
int id = await shellClass.pid;
int exitCode = await shellClass.exitCode;
int convertedResult = await shellClass();
assert(convertedResult == 1);
// 写入文件
await ($("echo 1") > File("./temp"));
// 追加到文件
await ($("echo 2") >> File("./temp"));
}
自定义类型转换
你可以轻松地添加自定义类型转换,以便将 shell 输出转换为特定的 Dart 类型。例如:
import 'package:sheller/async.dart';
class IntConverter extends Converter<String, int> {
const IntConverter();
@override
int convert(String input) {
int? result = int.tryParse(input);
if (result == null) {
throw ShellConversionException(int, input);
}
return 99999;
}
}
void main() async {
ShellConfig.addConverter(const IntConverter());
int number = await $("echo 1")();
assert(number == 99999);
}
实际用例 - Protobuf 包生成脚本
以下是一个实际用例,展示了如何使用 sheller
生成 Protobuf 包:
import 'dart:io';
import 'package:sheller/async.dart';
void main() async {
const protoFilesDir = "../../proto";
const outputDir = "../generated";
const outputSrcDir = "../generated/lib/src";
if (Directory(outputDir).existsSync()) {
Directory(outputDir).deleteSync(recursive: true);
}
Directory(outputSrcDir).createSync(recursive: true);
final protoFiles = Directory(protoFilesDir)
.listSync()
.whereType<File>()
.where((file) => file.path.endsWith(".proto"))
.map((file) => file.path)
.toList();
final generateDartProtoFilesCommand =
"protoc -I=$protoFilesDir --dart_out=grpc:$outputSrcDir ${protoFiles.join(' ')}";
print(await $(generateDartProtoFilesCommand)());
// 复制所需的 pubspec.yaml
const toCopyOver = "./to_copy_over";
print(await $("cp -r $toCopyOver/* $outputDir")());
final generateBarrelFileCommand = "cd $outputDir && dart pub run index_generator";
print(await $(generateBarrelFileCommand)());
print("Done.");
}
总结
sheller
是一个非常强大的工具,可以让你在 Dart 中更方便地编写脚本。通过内置的类型转换和自定义转换功能,你可以轻松地处理各种 shell 命令的输出。希望本文对你有所帮助,如果你有任何问题或建议,欢迎留言交流!
更多关于Flutter未知功能插件sheller的探索使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复