対象者
- Mason CLIについて知りたい方
- DartやFlutterで定型のコードを毎回作成するので、テンプレートを作って、自動生成したい方
- Mason CLIのサンプルが欲しい、リファレンスが欲しい方
- 使い方を忘れているであろう3ヶ月後の私
Mason とはなにか
Masonとはなにか、と言われると正直よく分かりません(←おい)。
コード生成するツールかと思っていたんですけど、pub.devで調べるとロガーとかもあります。この「brickhub.dev」さんの作っているツールのシリーズを指しているのか、コード生成に関わるパッケージのことを指しているのか区別が付きません。
この記事では、Masonの中の「mason_cli」パッケージを使って、ソースの自動生成を行う記事になっています。以下、Masonと出てきたら、このパッケージのことだと思ってください。
ちなみにMasonは Googleの「Package of the Week」にも出た由緒あるパッケージです。
私はMVVMでページ作成しているので、毎回ページ作成に定型のファイルを作成しています。そこで、指定のディレクトリでのディレクトリとファイルの作成をmasonで自動化しています。そちらをサンプルとして記述します。
概要
Masonを実行するには、以下のステップをとります。
- OSにMason をインストールする
- プロジェクトにMasonを有効にする
- テンプレートを作る
- テンプレートを登録する
- テンプレートからコードを生成する
システムにMason をインストールする
Masonをシステムにインストールします。
dart pub global activate mason_cli
また、Macだと以下でインストールできました。
brew tap felangel/mason
brew install mason
Windows 11の環境では「C:\Users\ [user_name] \AppData\Roaming\Pub\Cache\bin\mason.bat」または「C:\Users\ [user_name] \AppData\Local\Pub\Cache\bin\mason.bat」にインストールされました([user_name]は適時変更)。環境変数でパスを通すか、実施時にフルパスで指定してください。
プロジェクトにMasonを有効にする
Flutterのプロジェクト直下で以下を実施します。
mason init
すると、プロジェクト直下に「.mason」ディレクトリが作成されます。mason.yamlという設定ファイルができます。
テンプレートを作る
まず、テンプレートの雛形を作成します。以下のコマンドを実行しましょう。そうすると、mvvmというテンプレートが作成されます。このテンプレートのことをMasonではbricsと呼びます。
この例では、mvvmというbricsを作成します。テンプレート名を変更する場合は、そこを変更してください。Flutterプロジェクトで「lib/pages」以下にページごとにディレクトリを作成し、その下にページ用のファイルが作成されるようにします。
mason new mvvm
mason new -o .mason/templates mvvm
-o で出力するディレクトリを設定します。設定しないと、実施ディレクトリに作成されます。実施すると、以下のようにファイルが作成されます。
✓ Created new brick: mvvm (0.1s)
✓ Generated 5 file(s):
[project_root]/.mason/templates\mvvm/brick.yaml (new)
[project_root]/.mason/templates\mvvm/README.md (new)
[project_root]/.mason/templates\mvvm/CHANGELOG.md (new)
[project_root]/.mason/templates\mvvm/LICENSE (new)
[project_root]/.mason/templates\mvvm/__brick__/HELLO.md (new)
- brick.yaml
このファイルを編集していきます。
注目するべきは varsです。masonを実行すると、vars内のpromptを質問してきて、その結果がnameという変数に設定されます。
name: mvvm
description: A new brick created with the Mason CLI.
version: 0.1.0+1
environment:
mason: ">=0.1.0-dev.26 <0.1.0"
vars:
name:
type: string
description: Your name
default: Dash
prompt: What is your name?
上記のファイルを以下のように修正します。そうすると、実行時に入力された値が「page_name」に設定されます。複数の値を入力することも可能ですので、そのときはコピペして新しい変数を定義しましょう。
- name:
+ page_name:
type: string
- description: Your name
+ description: 作成するページの名前
- default: Dash
+ default: test_page
- prompt: What is your name?
+ prompt: 作成するページの名前を入力してください(末尾はpage推奨)
ファイルを以下のように作成します。冗談かと思われますが「{{page_name}}」というディレクトリ名と「{{page_name}.dart}」というファイル名で、「{{ }}」を含めて名前に設定します。
mvvm
└─__brick__
└─lib
└─ui
└─pages
└─{{page_name}}
─{{page_name}}.dart
└─{{page_name}}_vm.dart
- {{page_name}}.dart
しつこいようですが、上記のような名前のファイルを作成します。(箇条書きの点は不要)
import 'package:flutter/material.dart';
import '{{page_name.snakeCase()}}_vm.dart';
class {{page_name.pascalCase()}} extends StatefulWidget {
const {{page_name.pascalCase()}}({Key? key}) : super(key: key);
static const String path = '/{{page_name.camelCase()}}';
@override
State<{{page_name.pascalCase()}}Page> createState() => _{{page_name.pascalCase()}}State();
}
class _{{page_name.pascalCase()}}State extends State<{{page_name.pascalCase()}}> {
final {{page_name.pascalCase()}}Vm _vm = {{page_name.pascalCase()}}Vm();
@override
Widget build(BuildContext context) {
return Container();
}
}
- {{page_name}}_vm.dart
しつこいようですが、以下略。
import 'package:flutter/material.dart';
class {{page_name.pascalCase()}}Vm {
}
テンプレートを登録する
以下のようにすると、現在使用しているプロジェクトに指定のbricksを登録します。
mason add mvvm
mason add mvvm --path .mason\templates\mvvm
以下のようにすると、システム全体にbricksを登録します。そのため、別のプロジェクトでも登録したbricksを使用することができます。
mason add -g mvvm
テンプレートからコードを生成する
bricksから実際にコードを生成する場合は、以下のようにmakeを実行します。
実行すると、テンプレートに登録した質問が開始され、その入力に基づいてソースが生成されます。
mason make mvvm
生成するファイルがすでに合った場合は、上書きするか確認されます。
テンプレートを未登録にする
登録済みのbricksを未登録にしたい場合は、以下のようにremoveを実行します。
mason remove mvvm
登録済みのテンプレートを見る
登録済みのテンプレートを見たい場合は、listを実行します。取得元が分かります。
mason list
Masonのバージョンアップ
Mason自体のバージョンを上げたい場合は、updateを実行します。
mason update
登録しているテンプレートのアップデート
登録したbricksのバージョンを上げたい場合は、upgradeを実行します。
mason upgrade
使用できる関数
テンプレート作成中に「page_name.pascalCase()」というように使用できる関数があります。関数と結果をまとめておきます。
関数名 | 形式 |
---|---|
camelCase() | helloWorld |
pascalCase() | HelloWorld |
snakeCase() | hello_world |
constantCase() | HELLO_WORLD |
dotCase() | hello.world |
lowerCase() | hello world |
mustacheCase() | {{ Hello World }} |
paramCase() | hello-world |
pathCase() | hello/world |
sentenceCase() | Hello world |
titleCase() | Hello World |
upperCase() | HELLO WORLD |
まとめ
とうことで、Masonの使用方法をまとめました。最初のテンプレート作成はちょっと手間ですが、一度作成すれば面倒くさい定例作業をしなくてすむようになりますね。