使用dart开发命令行工具

目录结构

    hello/
        bin/
            main.dart
        pubspec.paml

main.dart函数:

void main(List<String> arguments){
    print("hello world");
}

Pub 命令

  • 使用pub global命令将文件包注册到全局
pub global activate --source path <dart包路径>

运行以上命令显示内容如下:

Activated boilerplate 0.0.1 at path "<path to Dart project>".
  • 使用pub global run命令运行注册的脚本文件
pub global run <package>:<script>
  • 使用pub global list命令查看全局包列表
pub global list
  • 使用pub global deactivate命令释放包
pub global deactivate <package>

使用命令行输入参数

  • 获取args依赖
    使命令行参数可用,需要引入args包:
// pubspec.yaml
dependencies:
    args: '^0.13.2' //冒号后面一定要有空格,否则报错

main.dart中导入:

import 'package:args/args.dart'; // 使用其中两个类ArgParser和ArgResults

ArgResults argResults; // 声明ArgResults类型的全局变量,保存解析的参数结果
                      // 同时,argResults也是ArgResults的实例

void main(List<String> arguments) {
    // 创建ArgParser的实例,同时指定需要输入的参数
  final ArgParser argParser = new ArgParser()
    ..addOption('name', abbr: 'n', defaultsTo: 'World'); // abbr表示缩写或别名,defaultsTo表示默认值

  argResults = argParser.parse(arguments);

  final String name = argResults['name'];

  print("Hello, $name!");
}

运行程序:

pub global run hello:main -n soojade

在命令行中显示help

final ArgParser argParser = new ArgParser()
    ..addOption('name', abbr: 'n', defaultsTo: 'World',
      help: "Who would you like to greet?")
    ..addFlag('help', abbr: 'h', negatable: false,
      help: "Displays this help information.");

“help”参数通过addFlag()定义;flag 是一个特殊的命令行参数,它是一个Boolean值而不是String。如果flag在命令行中出现,它的值是true

如下操作“help”标签:

 if (argResults['help']) {
    print("""
** HELP **
${argParser.usage}
    """);
  }
  // usage显示所有help内容

再次运行程序:

pub global run boilerplate:main --help

结果如下:

** HELP **  
-n, --name    Who would you like to greet?
              (defaults to "World")

-h, --help    Displays this help information.

Hello, World!

通过命令行创建文件及内容

使用命令行创建一个html模板:

// main.dart

import 'dart:io'; // io作为dart标准库,用来操作文件,不需要在pubspec.yaml中声明依赖
import 'package:args/args.dart';

ArgResults argResults;

void main(List<String> arguments) {
  final ArgParser argParser = new ArgParser()
    ..addOption('title', abbr: 't',
      help: "The title will be inserted into the <title> tag.")
    ..addOption('filename', abbr: 'f', defaultsTo: 'index.html',
      help: "Optional. Output file name. (Default: index.html)");

  argResults = argParser.parse(arguments);

  final String title = argResults['title'];

  if (title == null) {
    handleError("Missing required argument: title");
  }
  else {
    final String filename = argResults['filename'];
    final String output = """<!DOCTYPE html>
        <html>
        <head>
          <meta charset="UTF-8">
          <title>$title</title>
        </head>
        <body>
        
        </body>
        </html>
    """;

    new File(filename).writeAsStringSync(output);// 为了简单实用了同步版本
    stdout.writeln("File saved: $filename");
  }
}

// 异步输出错误信息到标准错误流
void handleError(String msg) {
  stderr.writeln(msg);
  exitCode = 2; //当程序退出,虚拟机检查exitCode,0 表示Success,1 表示Warnings,2 表示Errors
}

可执行程序

任何bin目录下的dart脚本可注册为可执行程序,分为两步:

  • pubspec.yaml中添加executables部分
executables:
  包名: main # 要运行的脚本名称,(注意冒号后面的空格)如果有多个脚本,可以添加多个
  • 通过pub global activate 全局注册
pub global activate --source path <包路径>

直接以包名为命令在命令行中输入即可执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容