簡単にまとめると?
- テスト用のパッケージを
import 'package:test/test.dart'
した時に depend_on_referenced_packaeges というエラーが出た - 要約すると 「dev_dependenciesにあるパッケージをimportする場合はlibなどに置かない」ということ
- つまり Flutter/Dart のテストファイルはtestフォルダに置こう!
背景
FlutterやDartでのTDDをやってみるためにTDD本をDartで実装することにした。
Dartプロジェクトを dart create tdd_project
みたいな感じで作った。
テストを書きたかったので pubspec.yaml
の dev_dependencies に test: ^1.25.7
を追加した。
早速テストを実装したところ import 'package:test/test.dart';
の部分で以下のようなエラーが出た。
The imported package 'test' isn't a dependency of the importing package.
Try adding a dependency for 'test' in the 'pubspec.yaml' file. dart depend_on_referenced_packaeges
どんなエラー?
このエラーを率直に翻訳すると、以下のようになる
インポートされたパッケージ 'test' は、インポートするパッケージの依存関係ではありません。
pubspec.yaml' ファイルに 'test' の依存関係を追加してみてください。
???????
testパッケージはpubspec.yaml
のdev_dependenciesに追加されてるけどどういうこと?
さらに公式ドキュメントから深掘りしてみると、以下の部分が引っかかった。
Whether this should be a regular dependency or dev_dependency depends on if it is referenced from a public file (one under either lib or bin), or some other private file.
(訳:これが通常の依存関係であるべきかdev_dependencyであるべきかは、それがパブリックファイル(libまたはbin配下のファイル)から参照されるのか、その他のプライベートファイルから参照されるのかによって決まる。)
なるほど、原因はプロジェクトのフォルダ構造にあった。
プロジェクトのフォルダ構成は、以下のようになっている
.
├── .dart_tool
│ └── package_config.json
├── .vscode
│ └── launch.json
├── bin
│ ├── money_test.dart
│ └── money.dart
├── .gitignore
├── analysis_options.yaml
├── CHANGELOG.md
├── pubspec.lock
├── pubspec.yaml
├── README.md
└── todo.md
ここで注目してほしいのがbinフォルダにテストファイルが置かれていること。
テストファイルがimportするtestパッケージはdev_dependenciesに依存関係が記述されている。一方、binフォルダ配下にあるファイルはパブリックファイルでありdev_dependenciesの依存関係を参照するべきでない。ということである。これは上記のエラーメッセージから読み取れる範囲内での話だ。
なぜdev_dependenciesをbinフォルダないから呼び出してはいけないか。
Flutter/Dartでをpubspec.yamlを記述するとき、dependenciesかdev_dependenciesかのどちらかに分けられる。これらの違いを認識していれば、上記のような問題の背景を理解することができる。絶対にダメというわけではないがFlutter/Dartのお作法として従っておいた方がいい内容である。
dependenciesとdev_dependenciesの違いはざっくりと以下の通りである。
- dependencies
- lib や bin ディレクトリからインポートされる場合に使用する
- パッケージが依存するパッケージとそのすべての依存関係を取得する
- dev_dependencies
- test、example、などのディレクトリからのみインポートされる場合に使用する
- パッケージの開発に必要なパッケージを指定するが、依存するパッケージの dev_dependencies は無視される
詳しくは公式ドキュメントを確認してほしい。
まとめ
再掲になるが、要点をまとめると以下の通り。
- テスト用のパッケージを
import 'package:test/test.dart'
した時に depend_on_referenced_packaeges というエラーが出た - 要約すると 「dev_dependenciesにあるパッケージをimportする場合はlibなどに置かない」ということ
- つまり Flutter/Dart のテストファイルはtestフォルダに置こう!
これまでの内容がわかると当たり前のようだが、他のフレームワークだと一般用途と開発用途との依存関係の区別があっても、importのされ方まで区別する必要がなかったので、今回調べてみて勉強になった気がする。