Flutter脚本执行插件cli_script的使用

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

Flutter脚本执行插件cli_script的使用

简介

cli_script 包旨在让编写调用子进程的脚本变得简单,同时具备shell脚本的简洁性和Dart的强大功能。它捕捉了shell脚本的核心优点:简洁性、管道化和可组合性。与此同时,它使用了标准的Dart特性,如异常处理、StreamFuture,并在此基础上进行了一些扩展,使其在脚本环境中更容易使用。

虽然 cli_script 可以作为任何Dart应用程序中的库使用,但其主要目标是支持独立脚本,这些脚本与shell脚本具有相同的目的。由于它们只是普通的Dart代码,因此这些脚本将比Shell脚本更具可维护性,而不会牺牲易用性。

示例代码

Hello World 脚本

这是一个简单的Hello World脚本示例:

import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    await run('echo "Hello, world!"');
  });
}

注意,wrapMain() 并不是严格必要的,但它可以更优雅地处理错误。

创建和修改文件

以下是一个创建目录和文件的例子:

import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    await run("mkdir -p path/to/dir");
    await run("touch path/to/dir/foo");
  });
}

获取命令输出

获取命令输出也非常简单,可以使用 output()lines() 方法:

import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    await for (var file in lines("find . -type f -maxdepth 1")) {
      var contents = await output("cat", args: [file]);
      if (contents.contains("needle")) print(file);
    }
  });
}

检查命令是否成功

你可以使用 check() 来测试命令是否成功(返回退出码0):

import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    await for (var file in lines("find . -type f -maxdepth 1")) {
      if (await check("grep -q needle", args: [file])) print(file);
    }
  });
}

管道化

cli_script 支持通过 | 操作符连接多个进程,形成一个管道:

import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    var pipeline = Script("find -name *.dart") |
        Script("xargs grep waitFor") |
        Script("wc -l");
    print("${await pipeline.stdout.text} instances of waitFor");
  });
}

你也可以使用 Script.pipeline 构造函数来实现相同的功能:

import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    var count = await Script.pipeline([
      Script("find -name *.dart"),
      Script("xargs grep waitFor"),
      Script("wc -l")
    ]).stdout.text;
    print("$count instances of waitFor");
  });
}

文件操作

你可以轻松地将Dart数据传递给进程,例如读取文件内容并进行处理:

import 'dart:io';
import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    var pipeline = read("names.txt") |
        Script("grep Natalie") |
        Script("wc -l");
    print("There are ${await pipeline.stdout.text} Natalies");
  });
}

写入文件

你可以使用 > 操作符将脚本或管道的输出写入文件:

import 'dart:io';
import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() {
    Script.capture((_) async {
      await for (var file in lines("find . -type f -maxdepth 1")) {
        var contents = await output("cat", args: [file]);
        if (contents.contains("needle")) print(file);
      }
    }) > write("needles.txt");
  });
}

组合性

cli_script 中的任何东西都可以是一个 Script,最常见的方法是使用 Script.capture()

import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    var script = Script.capture((_) async {
      await run("find . -type f -maxdepth 1");
      print("subdir/extra-file");
    });

    await for (var file in script.stdout.lines) {
      if (await check("grep -q needle", args: [file])) print(file);
    }
  });
}

其他特性

参数解析

cli_script 函数接受两种格式的参数:executableAndArgs 字符串和 args 列表。这使得调用简单命令时不需要过多的样板代码,并且可以轻松传递动态生成的参数而不必担心空格问题。

搜索和替换

cli_script 提供了一些有用的函数来进行搜索和替换操作,而无需启动子进程:

import 'dart:io';
import 'package:cli_script/cli_script.dart';

void main() {
  wrapMain(() async {
    var pipeline = File("names.txt").openRead() |
        grep("Natalie") |
        Script("wc -l");
    print("There are ${await pipeline.stdout.text} Natalies");
  });
}

以上就是 cli_script 插件的基本使用方法和一些常见示例。希望这些信息能帮助你在Flutter项目中更高效地编写和管理脚本。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用cli_script插件来执行脚本的示例代码。cli_script插件允许你定义和执行命令行脚本,这在需要自动化一些任务时非常有用。

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

dependencies:
  flutter:
    sdk: flutter
  cli_script: ^x.y.z  # 请替换为最新版本号

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

接下来,我们创建一个简单的Flutter应用,并在其中使用cli_script来执行一个脚本。以下是一个完整的示例:

  1. 创建Flutter项目(如果你还没有项目的话):
flutter create my_flutter_app
cd my_flutter_app
  1. pubspec.yaml中添加cli_script依赖(如上文所示)。

  2. 编辑lib/main.dart文件

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

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

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

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String scriptResult = '';

  void _runScript() async {
    // 定义你的脚本
    var script = CliScript()
      ..echo('Hello from cli_script!')
      ..run('date'); // 这是一个示例命令,获取当前日期和时间

    try {
      // 执行脚本并捕获输出
      var result = await script.run();
      setState(() {
        scriptResult = result.outputAsString;
      });
    } catch (e) {
      setState(() {
        scriptResult = 'Error: ${e.toString()}';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Run Script Result:',
            ),
            Text(
              scriptResult,
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _runScript,
              child: Text('Run Script'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,点击按钮时会运行一个脚本。这个脚本使用CliScript来输出一条消息并运行date命令来获取当前日期和时间。脚本的输出会被显示在屏幕上。

  1. 运行应用
flutter run

点击应用中的“Run Script”按钮,你应该能在屏幕上看到脚本的输出。

这个示例展示了如何使用cli_script插件在Flutter应用中执行简单的命令行脚本。你可以根据需要扩展这个示例,运行更复杂的脚本或集成到更复杂的Flutter应用中。

回到顶部