Flutter脚本执行插件script_runner的使用

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

Flutter脚本执行插件script_runner的使用

简介

Dart Script Runner 是一个通用的脚本运行器,适用于任何类型的项目。它允许你在一个可移植且简单的配置中运行所有与项目相关的脚本和命令。

script_runner help output


用途

你可以使用它来链式调用多个命令以统一构建过程、格式化和检查你的文档等。相比于 make,它的优势在于自动生成文档,并能自动从包含 pubspec.yaml 的目录加载脚本,而不需要手动查找项目的根目录。

这个项目受到 NPM 在 package.jsonscripts 部分的启发,旨在类似地工作,但可以根据需要进行更具体的定制。

特性

  • 易用:提供了一个易于使用的配置,类似于 NPM 在 package.json 中的 scripts 部分。
  • 便携:脚本是便携的,可以相互引用,最大化创建可配置的脚本执行顺序和依赖关系的灵活性。你不必在 Dart 项目中,只需在任何文件夹中添加一个 script_runner.yaml 文件即可。
  • 自我记录:无需记录如何加载不同类型的脚本或创建自定义脚本加载器,将所有运行器统一到一个配置中,允许你按需调用一切,并通过 scr -h 提供自动生成的文档。

入门指南

你可以全局安装此包以获得最简单的使用体验。

pub global activate script_runner

激活后,你可以使用提供的 scr 可执行文件直接调用当前项目中的脚本。

scr my-script ...args

你也可以将此包作为依赖项安装并构建/运行自己的脚本列表(但这有什么意义呢?)

内置命令

要获取帮助,包括当前目录中所有可用脚本的列表,请运行:

scr -h

要列出所有脚本,并能够搜索,请使用:

scr -ls # 查看所有脚本
scr -ls terms # 搜索 "terms"

使用方法

普通用法(配置文件)

pubspec.yaml 中添加 script_runner 配置,或者在项目的根目录下使用单独的配置文件 script_runner.yaml。如果你更喜欢 JSON 格式,也可以使用 JSON 文件。

一个基本的例子如下:

script_runner:
  scripts:
    - doc: dart doc
    - publish: dart pub publish
    - deploy: doc && publish
    - auto-fix: dart fix --apply

完整的配置结构如下:

# 仅在 pubspec.yaml 内使用此键。否则,不需要
script_runner:
  # 运行所有脚本时使用的 shell。(可选,默认为操作系统 shell)
  shell: /bin/sh
  # 为每个操作系统定义不同的 shell,未指定时回退到 "default":
  # (可选)
  shell:
    default: /bin/sh
    windows: cmd.exe
    macos: /bin/sh
    linux: /bin/sh
  # 脚本运行的工作目录。(可选)
  cwd: .
  # 添加到运行脚本的环境变量。(可选)
  env:
    MY_ENV: my-value
    # ...
  # 打印帮助信息时,允许的最大字符数
  line_length: 80
  # 脚本支持简短格式配置或更详细的配置
  scripts:
    # 简短格式 - 仅名称 + 命令及参数:
    - my-short-script: my_scr arg1 arg2 arg3 && echo 'Done!'

    # 更详细的配置,提供更多配置选项
    - name: my-script
      # 可选 - 将用于 `scr -h` 中的文档
      description: Run my script
      # 可选 - 覆盖根级别配置
      cwd: .
      # 可选 - 覆盖根级别配置
      env:
        MY_ENV: my-value
        # ...
      # 设置为 `false` 以隐藏命令本身,只显示输出
      display_cmd: true
      # 要运行的命令。可以直接在此处提供参数,或将其拆分为 `cmd` 和 `args` 列表。
      cmd: my_scr 'arg1'
      # 可选 - 如果提供,将在 CLI 调用脚本时附加为 `cmd` 的参数
      args:
        - arg2
        - arg3

对于此配置,运行 scr my-script 将运行适当的脚本,填充环境变量并根据需要更改工作目录。

更多参数可以在调用脚本时传递,这些参数将被管道传递给原始的 cmd

高级用法(Dart 导入)

如果你想在 Dart 中动态构建自己的配置,可以导入该包并创建自己的运行器和脚本:

import 'package:script_runner/script_runner.dart';

void main() {
  // 直接从配置中运行脚本,类似于运行 `scr`
  runScript('my-script', ['arg1', 'arg2'])

  // 构建自己的配置和脚本并按需运行:
  final runner = ScriptRunnerConfig(
    shell: '/bin/zsh',
    scripts: [
      RunnableScript(
        name: 'my-script',
        cmd: 'echo',
        args: ['Hello world'],
      ),
    ],
  );

  runner.scriptsMap['my-script'].run();
}

示例代码

pubspec.yaml 示例配置

script_runner:
  scripts:
    - build: flutter build apk
    - test: flutter test
    - format: dart format lib/
    - analyze: dart analyze
    - deploy: build && test && flutter pub publish

script_runner.yaml 示例配置

script_runner:
  shell: /bin/bash
  cwd: ./project_root
  env:
    FLUTTER_HOME: /path/to/flutter
  scripts:
    - name: build
      description: Build the Flutter app
      cmd: flutter build apk
    - name: test
      description: Run all tests
      cmd: flutter test
    - name: format
      description: Format all Dart files
      cmd: dart format lib/
    - name: analyze
      description: Analyze the codebase
      cmd: dart analyze
    - name: deploy
      description: Deploy the project
      cmd: scr build && scr test && flutter pub publish

完整示例 Demo

假设你有一个 Flutter 项目,想要集成 script_runner 来简化开发流程。以下是完整的步骤和配置示例:

  1. 安装 script_runner

    pub global activate script_runner
    
  2. 配置 pubspec.yamlscript_runner.yaml

    pubspec.yaml 中添加以下内容:

    script_runner:
      scripts:
        - build: flutter build apk
        - test: flutter test
        - format: dart format lib/
        - analyze: dart analyze
        - deploy: build && test && flutter pub publish
    
  3. 运行脚本

    使用 scr 命令运行脚本:

    scr build
    scr test
    scr format
    scr analyze
    scr deploy
    
  4. 查看帮助

    查看所有可用脚本的帮助信息:

    scr -h
    

通过以上步骤,你可以轻松地在 Flutter 项目中集成 script_runner,从而简化日常开发任务的执行。希望这对你有所帮助!


如果你有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,以下是如何在Flutter项目中使用script_runner插件来执行脚本的一个基本示例。script_runner插件允许你在Flutter应用中执行本地脚本,这在某些情况下非常有用,比如处理一些需要在原生层面执行的任务。

首先,确保你的Flutter环境已经配置好,并且在你的pubspec.yaml文件中添加script_runner依赖:

dependencies:
  flutter:
    sdk: flutter
  script_runner: ^最新版本号  # 请替换为实际可用的最新版本号

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

示例代码

1. 配置iOS和Android权限(如果需要)

确保在iOS的Info.plist和Android的AndroidManifest.xml中配置了必要的权限,这取决于你的脚本需要访问哪些资源。

2. 使用script_runner执行脚本

下面是一个简单的示例,展示如何在Flutter中调用本地脚本。

main.dart

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String result = "";

  Future<void> runScript() async {
    // 定义一个简单的Shell脚本,这里以打印当前目录为例
    String script = "echo \"Current Directory:\"; pwd";

    try {
      // 执行脚本并获取结果
      String output = await ScriptRunner.run(script);
      setState(() {
        result = output;
      });
    } catch (e) {
      setState(() {
        result = "Error: ${e.message}";
      });
    }
  }

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

注意事项

  1. 平台差异script_runner在iOS和Android上的实现可能有所不同,确保你的脚本兼容目标平台。
  2. 安全性:执行本地脚本可能会带来安全风险,尤其是当脚本内容来自不受信任的源时。确保对脚本内容进行适当的验证和清理。
  3. 权限管理:确保你的应用有权限执行所需的脚本,特别是在Android上,可能需要请求额外的运行时权限。

这个示例展示了如何使用script_runner插件在Flutter应用中执行一个简单的Shell脚本。根据你的具体需求,你可能需要调整脚本内容和错误处理逻辑。

回到顶部