Dart / Flutter

Dartでバイナリ配布可能なCLIツールを作る

投稿日:

エンジニアのスキルセットは基本が重要!、とか考えていると永遠にHelloWorldしてしまう。
そこそこ長い間同じことを考えることで深い洞察ができるようになる効果はあると思うが、
それとは別に趣味とか知的好奇心とか、興味ドリブンでやってみたいという何かは永遠に満たされない。

Dart-langに慣れるために今欲しいツールをDart-langで書いてみる。
なんでDart-langなのか、とか細かいことは気にしない。

インストール

Flutter 1.21からFlutter-SDKに完全なDart-SDKが含まれる. FlutterをやるならFlutterを入れた方が良い.
Dart-langは別でインストールできる. 軽いのでFlutterをやらないならこちらが良い.

空プロジェクトを作る

Dart-langのパッケージマネージャはpub. dart-langをインストールするとパスが通り使えるようになる.
空プロジェクトの足場を作るパッケージを使う. ちなみに足場はScaffold. 舞台裏はStagehand.

出来上がった雛形の構成は以下.
よくある構成なので説明は省略.

Hello World

雛形のエントリポイントは bin/dart_cli_sample.dart にある main().
別途、lib/dart_cli_sample.dart にあるコードをimportしている.
CLIの雛形だからargumentsを引数にとる. Listで渡される.
まぁ普通.

で、lib/dart_cli_sample.dart はどうなっているかというと以下みたいな感じ.
int型を返すcalculate()という関数が定義されていて6*7の計算結果を返す.

インタラクティブに実行するには、dartコマンドにエントリポイントを渡す.
6*7=42がちゃんと出力された.

バイナリ生成と実行

これやりたいためにDart-langを選んでみた.
Macでバイナリ生成する場合Mac用のバイナリしか作れないといったように、
残念ながらクロスプラットフォーム非対応. CIを構築して各プラットフォーム用に実行しないといけない.

exeオプションでself-contained、つまりDartランタイムが無い環境で実行可能ファイルを作成できる.
コンパイル方式としてAOT(Ahead Of Time)、JIT(Just In Time)を選べるという充実ぶり.
バイナリのサイズは, self-containedの場合, 5,033,856 bytes(約5MB) だった.

aot-snapshotオプションにより, プラットフォーム用の共有ライブラリとアプリケーションコードを分けられる.
self-containedと同様にAOTはMacOS,Windows,Linuxそれぞれのプラットフォームが提供される.
dartaotruntimeというコマンドにより実行する.
バイナリのサイズは 905,072 (約900KB)だった.

jit-snapshotオプションにより,JIT実行可能なバイナリを出力できる.
プラットフォーム固有のDart中間コードを生成する.
dart compile時に1度実行されて処理結果が表示される.
ソースコードをparseした結果を事前に準備し,JIT実行時に再利用することで処理速度を上げる.
ちょっと詳しくは不明だがAOTよりも高速に処理できる可能性がある.
バイナリサイズは 4,824,016bytes. (約4.8MB)だった.

kernelオプションにより,プラットフォーム非依存のKernelASTを生成する.
出力されたバイナリのサイズは1056 bytes (約1KB)だった.ソースコードのパスが含まれており,
おそらくソースコードを同時に配布する必要がある. AOTより遅い.

まとめ

Dart-langのHelloWorldコードを作成し各種コンパイルオプションを試した.
Go-langのそれとは異なりクロスプラットフォームのバイナリを生成できないが,
複数のコンパイルオプションが用意されていて,様々なパターンの運用に対応できそう.

-Dart / Flutter
-

Copyright© ikuty.com , 2022 AllRights Reserved Powered by AFFINGER4.