Dartで開発する上でpub
は欠かせないツールですが、pub
を利用するプロジェクト(以後 pubパッケージ と呼ぶ)内のディレクトリ構成に大きく依存しています。これは自分の作ったパッケージをpubに公開する、しないにかかわらず重要なポイントなので、一度きちんとおさらいしておこうと思います。
この記事では公式ドキュメントのPub Package Layout Conventionsに書かれている内容を和訳して注釈を入れつつまとめていきます。
基本構成
pubパッケージの最小構成は以下になります。
enchilada/
pubspec.yaml
pubspec.lock
pubspec.yaml
さえあれば一応pubに公開することが出来ます。他にもLICENSE
やAUTHORS
等のファイルはこの階層(トップレベル)においておくことが推奨されます。
README.md
pubに公開するパッケージにはMarkdown形式のREADMEを含めることが推奨されています。
enchilada/
...
README.md
トップレベルに置かれたREADME.md
はpub.dartlang.orgで見ることができるので、なるべくパッケージの内容や使い方がすぐに分かるような内容を心がけるといいですね。ちなみにAngularDartのREADMEはこのようになっています。
CHANGELOG.md
READMEと同様に、CHANGELOGもpubのページで見ることができるので、ぜひ書きましょう。
enchilada/
...
CHANGELOG.md
ちなみにunittest
パッケージのCHANGELOGはこちら
公開ライブラリ
公開ライブラリは以下のようにlib
ディレクトリ内に配置します。
enchilada/
lib/
enchilada.dart
tortilla.dart
公開ライブラリとは?
公開ライブラリとは、そのパッケージをpub install
で導入した後、import
文で読み込むことが出来るdartファイル群のことを指します。AngularDartであればangular/angular.dart
等が公開ライブラリに含まれています。
どう使えばいいの?
ライブラリとして公開する
そのままですが、pubにライブラリを公開する際は、公開ライブラリとして配置しなければなりません。
シンボリックリンクの生成に利用する
こちらのほうが実は重要で、pub get
を実行すると、pubspec.yaml
に書かれた依存関係を解決するだけでなく、 『公開ライブラリとして配置されたlib
以下のコードへのシンボリックリンクをpackages
以下に貼り、擬似的にpubでインストールしたように見せる』 ことができます。これが何を意味するかというと、ライブラリ用のパッケージと、ユニットテスト用のパッケージを分けることができるということです。テストに関する配置に関してはまた後述します。
リファレンス用パッケージ
公開したアプリケーションのデモ用のページを含めることがよくあります。pubパッケージでは次のように配置します。
myapp/
example/
one/
sub/
index.html
example
に配置するのはあくまでライブラリの動作サンプル等であり、Webアプリケーションは後述するweb
ディレクトリ内で開発します。
公開アセット
pubに公開されているのはdartライブラリだけではなく、boostrap_for_pubのように、cssやhtml、jsのセットだけを提供しているものも多くあります。そのようなdartファイル以外のものを アセット と呼びますが、ライブラリとして公開したいアセットは以下のようにlib
ディレクトリに配置します。
enchilada/
lib/
guacamole.css
このように配置されたアセットを利用する場合は次のようにhtmlから参照可能です。
<link href="packages/enchilada/guacamole.css" rel="stylesheet">
実装ファイル(非公開コード)
公開ライブラリとして公開しているコードではimportしているが、外部からはされたくないということはよくあることです。以下のようにlib/src
内に配置したdartファイルはlib
内でのみ公開されます。
enchilada/
lib/
src/
beans.dart
queso.dart
Webファイル
Webアプリケーションを作る際はhtml等を以下のようにweb
ディレクトリ内に配置します。
enchilada/
web/
index.html
main.dart
style.css
web
ディレクトリ内に配置されたファイル群はpub build
やpub serve
のビルド対象になります。
コマンドラインアプリ
コマンドラインで直接実行するタイプのアプリケーションを公開する際は以下のようにbin
ディレクトリに実行ファイルを配置します
enchilada/
bin/
enchilada
テスト・ベンチマークコード
テストコードは以下のようにtest
ディレクトリ内に配置します。
enchilada/
test/
enchilada_test.dart
tortilla_test.dart
test
ディレクトリから読み込むことが出来るのはpackages
ディレクトリだけなので、テストを行いたいコードは、先述のlib
ディレクトリに配置してpub get
でシンボリックリンクを生成しておく必要があります。逆に言うと、 lib
フォルダ以外に置いたdartファイルはテスト出来ません。
また、テスト用のファイルはテスト対象のファイル_test.dart
にするのが慣例です。
ベンチマーク用のコードは以下のようにbenchmark
以下に配置します。
enchilada/
benchmark/
make_lunch.dart
余談
テストに用いるunittest
パッケージは有名ですが、ベンチマーク用にもDart開発チームがbenchmark_harness
というパッケージを公開しています。使い方はこちらで、同じコードを10回実行した時の平均時間をレポートしてくれたりとけっこう便利なパッケージのようです。
ドキュメント
ドキュメントファイルは以下の用にdoc
ディレクトリ内に配置します。
enchilada/
doc/
getting_started.md
ちなみにDartSDKにはdocgen
というツールが内蔵されていて、$ docgen
を実行するとdocs
ディレクトリ内にlib
以下のコードをドキュメントにしたjsonファイルが発行されますが、doc
ディレクトリのものとは別なので注意してください。doc
ディレクトリに置くのはdocgenで吐き出されるAPIリファレンスを補足するためのチュートリアルやガイド、その他手書きのドキュメントです。
サンプルコード
Dartライブラリの使い方としてサンプルコードを公開する際は以下のようにexample
ディレクトリ内に配置します。
enchilada/
example/
lunch.dart
内部ツール・スクリプト
開発に使うツールやスクリプトは以下のようにtool
ディレクトリ内に配置します。
enchilada/
tool/
generate_docs.dart
bin
ディレクトリとの違いは、tool
ディレクトリはパッケージ開発者向けであって、外部に公開されるものではないということです。
これでpubパッケージのディレクトリ構成についての解説は全てです。実際に使うのはlib
、web
、test
くらいのもので、全部を使うことはないと思いますが、覚えておくといざというときに役に立つと思います。