Flutter - Create Library Packages (日本語訳)


[Create Library Packages](https://www.dartlang.org/guides/libraries/create-library-packages) の日本語訳

# Create Library Packages

ライブラリは簡単に共有できるモジュラーコードを作成する良い方法です。Dart エコシステムではライブラリはパッケージとして作成、配布されます。Dart には2種類のパッケージがあります: [アプリケーションパッケージ](https://www.dartlang.org/tools/pub/glossary#application-package) （ローカルライブラリを含む）と [ライブラリパッケージ](https://www.dartlang.org/tools/pub/glossary#library-package) です。

このドキュメントではライブラリパッケージの作り方とその他の関連リソースを示します。ライブラリの使い方については [Install Shared Packages](https://www.dartlang.org/tutorials/libraries/shared-pkgs) や言語ツアーの [Libraries and visibility](https://www.dartlang.org/guides/language/language-tour#libraries-and-visibility) セクションを参照してください。

### What makes a library package

以下の図は最もシンプルなライブラリパッケージを表しています:

![simple-lib2-81ebdc20fdb53d3abbc4364956141eb0f6f8f275d1636064fc3e1db959b93c1a.png](https://qiita-image-store.s3.amazonaws.com/0/4090/7cb0c09a-c6e3-45cf-1c12-e342d4f66f87.png)

ライブラリの最小の要件は:

**pubspec フィアル**

ライブラリの pubspec.yaml ファイルはアプリケーションパッケージのためのものと同じです。それがライブラリパッケージであることを示すもものは何もありません。

**lib ディレクトリ**

ご想像のとおり、ライブラリのコードは lib ディレクトリ以下にあり、他のパッケージに対してい公開されます。必要に応じて lib ディレクトリ以下に階層構造を作ることができます。慣例として実装コードは lib/src 以下に置かれます。lib/src 以下のコードはプライベートであるとみなされ、他のパッケージが src/... をインポートすることはありません。 lib/src 以下の API を公開するためには lib/src のファイルを lib 以下のファイルから export します。

> **Note:** library ディレクティブが指定されなかった場合、ユニークなタグがそれぞれのライブラリのパスとファイル名にもとづいて生成されます。したがって、[ライブラリレベルドキュメント](https://www.dartlang.org/guides/libraries/create-library-packages#documenting-a-library)を生成するつもりがなければ  library ディレクティブを指定しないことを推奨します。

## Organizing a library package

ミニライブラリとして独立した小さなライブラリパッケージを作る場合、それをメンテナンス、拡張、テストするのは簡単です。二つのクラスが強く関連してない場合、ほとんどのケースでそれぞれのクラスはそれらのミニライブラリに配置するべきです。

> **Note:** part ディレクティブについて聞いたことがあるかもしれません。それは一つのライブラリを二つの Dart ファイルに分割します。part ディレクティブを使わず、かわりにミニライブラリを作ることをお勧めします。

lib/<package-name>.dart に全てのパブリックAPIを export する "main" ライブラリファイルを作成します。ユーザーは一つのファイルをインポートすることで全ての機能にアクセスできるようになります。

lib ディレクトリは import 可能な他のもの（コードではないものや、ライブラリ）を含むこともあります。例えば、あなたの main ライブラリは各プラットフォームで動作するけれども、dart:io や dart:html に依存する分割されたライブラリを作りたい場合。いくつかのパッケージはプレフィックスを伴って import することを意図された分割されたライブラリを含んでいます。

実際のライブラリがどうやってるかを見てみましょう。[shelf](https://github.com/dart-lang/shelf) パッケージは Dart を使って簡単に Web サーバーを作る方法を提供します。そして Dart パッケージでよくありがちな構成になっています。

![shelf-02e5fd43b660fcef7dbe6a883c40159e0379c8ee2088288ca60ed7dc8781bafd.png](https://qiita-image-store.s3.amazonaws.com/0/4090/2bf9be6d-b96f-32d7-a5c7-7cd67fd33b31.png)

lib ディレクトリ以下のメインライブラリファイル shelf.dart が lib/src 以下のいくつかのファイルを export しています:

```dart

export 'src/cascade.dart';
export 'src/handler.dart';
export 'src/handlers/logger.dart';
export 'src/hijack_exception.dart';
export 'src/middleware.dart';
export 'src/pipeline.dart';
export 'src/request.dart';
export 'src/response.dart';
export 'src/server.dart';
export 'src/server_handler.dart';
```

shelf ライブラリはさらにミニライブラリ shelf_io を含んでいます。このアダプタは dart:io の HttpRequest オブジェクトを処理します。

> **Tip for web apps:** [dartdevc](https://webdev.dartlang.org/tools/dartdevc) で開発する際、ベストパフォーマンスを得るために [実装ファイル](https://www.dartlang.org/tools/pub/package-layout#implementation-files) を別のどこかに置く代わりに /lib/src に配置します。さらに `package:package_name/src/...` のような import をしないようにします。

## Importing library files

ライブラリファイルをインポートするとき、ファイルの URI を指定するために `package:` ディレクティブを使うことができます。

```
import 'package:utilities/utilities.dart';
```

両方のファイルが lib 以下にある場合、または両方のファイルが lib の外にある場合、相対パスを使って import することができます。しかし、インポートするファイルが内と外にリーチする場合は `package:` を使わなければなりません。迷ったら `package:` を使いましょう。どのケースでもうまくいきます。

以下のグラフは `lib/foo/a.dart` を lib と web それぞれでインポートする方法を示しています:

![import-lib-rules-e1777e235dd56aa23f770babcccedb6a12be80af2c3e63065640b889d78be595.png](https://qiita-image-store.s3.amazonaws.com/0/4090/c3a20425-0638-7dea-5483-3299e4c38861.png)

> **Note:** lib の `lib/bar/b.dart` では相対インポート (`import '../foo/a.dart'`) を使っていますが、代わりに `package:` ディレクティブ (`import 'package:my_package/foo/a.dart'`) を使うこともできます。

## Providing additional files

よくデザインされたライブラリはテストが簡単です。[test](https://github.com/dart-lang/test) パッケージを使ってテストを書くことを推奨します。パッケージ直下の `test` ディレクトリにテストを置きます。

一般に公開するコマンドラインツールを作る場合、それらを `bin` ディレクトリに置きます。[pub global activate](https://www.dartlang.org/tools/pub/cmd/pub-global#activating-a-package) を使ってツールをコマンドラインから実行可能にします。[executables section](https://www.dartlang.org/tools/pub/pubspec#executables) にそのツールを指定することでユーザーが [pub global run](https://www.dartlang.org/tools/pub/cmd/pub-global#running-a-script-using-pub-global-run) を呼ばなくてもそれを直接実行できるようになります。

ライブラリの利用例を含めると便利でしょう。パッケージ直下の example ディレクトリに置きます。

tool ディレクトリに置いたファイル（開発中に作ったツールや実行可能な何か）は公開されません。

[pub.dartlang.org](https://pub.dartlang.org/) にライブラリを公開する場合、その他のファイル（README と CHANGELOG）が必要になります。README と CHANGELOG については [Publishing a Package](https://www.dartlang.org/tools/pub/publishing) で説明されています。パッケージのディレクトリ構造についての追加の情報について [Pub Package Layout Conventions](https://www.dartlang.org/tools/pub/package-layout) も参照してください。

## Documenting a library

[dartdoc](https://github.com/dart-lang/dartdoc#dartdoc) ツールを使って API ドキュメントを生成することができます。 Dartdoc はソースコードをパースして [documentation comments](https://www.dartlang.org/guides/language/effective-dart/documentation#doc-comments) （`///` シンタックスを伴う）を探します:

```dart
/// The event handler responsible for updating the badge in the UI.
void updateBadge() {
  ...
}
```

ドキュメントの生成例: [self documentation](https://pub.dartlang.org/documentation/shelf/latest/shelf/shelf-library.html)

> **Note:** 生成されるドキュメントにライブラリドキュメントを含めるためには `library` ディレクティブを指定する必要があります。See [issue 1082](https://github.com/dart-lang/dartdoc/issues/1082)

## Distributing an open source library

もしあなたのライブラリがオープンソースなら、それを [pub.dartlang.org](https://pub.dartlang.org/) で共有することをお勧めします。ライブラリの公開と更新に [pub publish](https://www.dartlang.org/tools/pub/cmd/pub-lish) （パッケージのアップロード、作成、更新を行う）を使います。例えば、 shelf パッケージは [pub.dartlang.org/packages/shelf](https://pub.dartlang.org/packages/shelf) に公開されています。パッケージを公開するにあたっての準備の詳細については [Publishing a Package](https://www.dartlang.org/tools/pub/publishing) を参照してください。

pub site はあなたのパッケージをホストするだけではありません。API ドキュメントの作成も行います。最後に生成されたドキュメントへのリンクは About セクションにあります。例えば shelf パッケージの API ドキュメントはここにあります [pub.dartlang.org/documentation/shelf](https://pub.dartlang.org/documentation/shelf/latest/)。以前のバージョンのドキュメントはパッケージページの Versions タブにあります。

パッケージの API ドキュメントが pub site できちんと見えるようにするために以下のステップに従ってください:

- パッケージをパブリッシュする前に、ドキュメントが期待通りに作成されるかを確認するために [dartdoc](https://github.com/dart-lang/dartdoc#dartdoc) を実行する
- パッケージをパブリッシュした後、Versions タブをチェックしてドキュメントが生成されたとこを確認する
- もしドキュメントが生成されなかった場合、Versions タブの `faild` をクリックして dartdoc のアウトプットを確認する

## Resources

ライブラリパッケージに関するさらなる詳細については以下を参照してください:

- [Libraries and visibility](https://www.dartlang.org/guides/language/language-tour#libraries-and-visibility) in the [language tour](https://www.dartlang.org/guides/language/language-tour) covers using library files.
* The [pub](https://www.dartlang.org/tools/pub) documentation is useful, particularly [Pub Package Layout Conventions](https://www.dartlang.org/tools/pub/package-layout).
* [What Not to Commit](https://www.dartlang.org/guides/libraries/private-files) covers what should not be checked into a source code repository.
* The newer library packages under the [dart-lang](https://github.com/dart-lang) organization tend to show best practices. Consider studying these examples: [dart_style](https://github.com/dart-lang/dart_style), [path](https://github.com/dart-lang/path), [shelf](https://github.com/dart-lang/shelf), [source_gen](https://github.com/dart-lang/source_gen), and [test](https://github.com/dart-lang/test).