くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

BrickHub/masonで動的な質問を扱う(最終確認の例)

前回、前々回の続き。BrickHub/masonでいろいろ試したときの備忘録(*´ω`*)

前回まででとりあえずの作り方がわかったけど、
最終確認がないので、promptをカスタマイズできないか試してみた。

hooksが用意されていて、それを使うと

  • 動的な質問(prompt)や
  • 入力された値のvalidation

などができそうな感じ(*´ω`*)

hooksディレクトリは--hooksをつけると作ってくれる。

$ mason new example --hooks

最終確認の質問を追加する

値の入力後&実行前のhookはpre_gen.dartに記述する。

// hooks/pre_gen.dart
import 'dart:io';

import 'package:mason/mason.dart';

Future<void> run(HookContext context) async {
  // 入力された値を表示
  context.logger.info('');
  context.logger.info('*****************************');
  context.vars.forEach((key, value) {
    context.logger.info('${key} = ${value}');
  });
  context.logger.info('*****************************');
  context.logger.info('');

  // 最終確認のpromptを作成
  final confirm = context.logger.prompt("Confirm: y/n", defaultValue: "n");
  // 入力された値のチェック
  if (confirm.toLowerCase() != "y") {
    // キャンセル処理
    context.logger.err('Canceled');
    exit(ExitCode.usage.code);
  }

  // 実行前のメッセージ表示
  final name = context.vars['app_name'];
  context.logger.info('Creating $name!');
}

context.logger.prompt()でprompを作れるよう。

mason-cliのコードだとこのあたりっぽい。

ためしてみる

実行はconfig.jsonで。与えるパラメタはこんな感じ。

{
  "app_title": "My First App",
  "app_name": "first_app",
  "app_id": "com.memorylovers.first_app",
  "org_domain": "com.memorylovers",
  "app_desc": "This is My First App"
}

コードを生成する場合

$ mason make flutter_new_project -c config.json

*****************************
app_title = My First App
app_name = first_app
app_id = com.memorylovers.first_app
org_domain = com.memorylovers
app_desc = This is My First App
*****************************

Confirm: y/n (n) y
Creating first_app!
✓ Generated 202 files. (0.2s)
// ....
Created first_app!

こんな感じで、パラメタの表示と、確認の質問を追加できた(*´ω`*)

キャンセルする場合

$ mason make flutter_new_project -c config.json
✓ Compiled pre_gen.dart (0.9s)

*****************************
app_title = My First App
app_name = first_app
app_id = com.memorylovers.first_app
org_domain = com.memorylovers
app_desc = This is My First App
*****************************

Confirm: y/n (n) n
Canceled

キャンセルもちゃんと動いてる(*´ω`*)


以上!! これでかなり柔軟にできるように。。
簡単なチェックのみだけど、値のチェックや加工などもできそう(*´ω`*)