Open8
【Flutter】パッケージ化、そしてMelosについて
参考資料:
- https://qiita.com/MasaruHirose/items/e67d108f330f4531decb
- https://zenn.dev/maropook/articles/e297e651addf57
- https://itome.team/blog/2019/12/flutter-advent-calendar-day24/
- https://melos.invertase.dev/
- https://www.youtube.com/watch?v=1AeGmGaSQUI
- https://zenn.dev/riscait/articles/melos-for-multiple-packages-dart-projects
パッケージの基礎
パッケージの種類
package
とplugin
に分けられる
-
package
: Dartのみで書かれたパッケージ。Flutter用に限らず様々な用途のモノが存在する。 -
plugin
:Dart + iOS/AndroidのネイティブAPIにもアクセスするライブラリ。example
プロジェクトを持ち、Flutterのwidgetを提供するパッケージもこちらに分類される。
パッケージの作り方
package
の作り方
- 下記コマンドで雛形を作成。
template
オプションでpackage
を指定
$ flutter create --template=package sample
-
lib/sample.dart
に共通化したいコードを記述していく。library
句がpackageである印
lib/sample.dart
library sample;
/// A Calculator.
class Calculator {
/// Returns [value] plus 1.
int addOne(int value) => value + 1;
}
plugin
の作り方
- 下記コマンドで雛形を作成。
template
オプションでplugin
を指定
$ flutter create --template=plugin sample
出力されたテンプレートが以下
sample
├── CHANGELOG.md
├── LICENSE
├── README.md
├── analysis_options.yaml
├── example
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── lib
│ │ └── main.dart
│ ├── pubspec.lock
│ ├── pubspec.yaml
│ ├── sample_example.iml
│ └── test
│ └── widget_test.dart
├── lib
│ ├── sample.dart
│ ├── sample_method_channel.dart
│ └── sample_platform_interface.dart
├── pubspec.lock
├── pubspec.yaml
├── sample.iml
└── test
├── sample_method_channel_test.dart
└── sample_test.dart
-
--platforms
オプションに「android / ios / web / linux / macos」から追加したいplatformをドット区切りで指定する事でiOSディレクトリやAndroidディレクトリなども生成してくれる
-
lib/sample.dart
にパッケージを書く。
lib/sample.dart
import 'sample_platform_interface.dart';
class Sample {
Future<String?> getPlatformVersion() {
return SamplePlatform.instance.getPlatformVersion();
}
}
- パッケージに対しての直接的なテストが行えない為、
example
内でパッケージを利用したプロジェクトを作り、検証していく。example
以下は通常のFlutterプロジェクトとなっている
パッケージのimport
ローカルの場合
同一レポジトリ内に作成されたパッケージがある場合、プロジェクト側pubspec.yaml
で下記の通りimport
する
test_project/pubspec.yaml
dependencies:
flutter:
sdk: flutter
test_package:
path: ../test_package
pub.dev
公開済みの場合
- 通常通り、
test_project/pubspec.yaml
に記述するだけ
Melos
Melos
とは
複数のプロジェクトやパッケージを1つのレポジトリで管理するモノレポを使う際に便利な機能を備えたCLIツール
Melos
で出来る事
主なところで言うと下記
- ローカルパッケージのリンクとインストール
- 複数のパッケージで同時にコマンドを実行
- CI/CD環境での自動化支援 (CI/CD環境でも実行可能)
導入手順
-
melos
のインストール
自身のマシンに以下コマンドでmelosをインストール
dart pub global activate melos
-
melos.yaml
を作成
レポジトリのルートにmelos.yaml
を作成する
- packages/
- a_package
- lib/
- src/
- a_package.dart
- pubspec.yaml
- b_package
- lib/
- src/
- b_package.dart
- pubspec.yaml
- c_app
- lib
- src/
- main.dart
- pubspec.yaml
- analysis_opsions.yaml
- .gitignore
- melos.yaml
-
.gitignore
やanalysis_options.yaml
もルートに配置する - プロジェクト単位で
.gitignore
、analysis_options.yaml
の設定が異なるのであれば、プロジェクト/パッケージ配下に配置する
-
melos.yaml
を定義する -
melos
コマンドの実行
melos.yamlを定義する
melos.yamlの基本構成
- name(必須)
- repository
- packages(必須)
- ignore
- scripts
melos.yaml
# Reference: https://github.com/KosukeSaigusa/flutterfire-commons/blob/main/melos.yaml
name: test-project
repository: https://github.com/heyhey1028/test-project
packages:
- samples/**
- samples/**/example/**
scripts:
clean:
run: melos exec -- "flutter clean"
pub:get:
run: melos exec -- "flutter pub get"
clean:pub:get:
run: melos exec -- "flutter clean && flutter pub get"
analyze: melos exec -- dart analyze .
1つのscriptの中に複数の処理を実行したい時はどう書いたらええんやろか
melos管理のmono repoでvscodeのlaunch.jsonを使う場合
手順
- .vscode/launch.json
を定義 単純にpathで立ち上げたいプロジェクトの
main.dart`を指定する
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Run my sample" ,
"program": "samples/my_sample/lib/main.dart",
"request": "launch",
"type": "dart",
"args": ["-v","--debug"]
}
]
}
-
.vscode/settings.json
を定義
上記の設定だけだとlaunch.jsonがネストしたプロジェクトまで到達する事が出来ないので、settings.jsonにdart.projectSearchDepth
を設定する必要がある
.vscode/settings.json
{
"dart.projectSearchDepth": 4,
"dart.runPubGetOnPubspecChanges": "never",
}
- Debugウィンドウからコマンドを指定して実行