Flowを快適に利用するには、高品質でコミュニティ主導のライブラリ定義(「libdefs」)が不可欠です。本日、私たちは**flow-typed**を発表します。これは、Flow libdefsの構築、共有、配布のための新しいワークフローの最初の部分を担うリポジトリとCLIツールです。
このプロジェクトの目標は、Flowの型推論を最大限に生かすlibdefsのエコシステムを構築し、Flowの理念「現実世界のJavaScriptから正確な型を抽出する」に沿うことです。TypeScriptのDefinitelyTypedのような同様の取り組みから多くのことを学び、その教訓をFlowエコシステムに活かしたいと考えています。
このプロジェクトの目的をいくつか紹介します。
- Libdefsは**バージョン管理**される必要があります。記述するライブラリのバージョンと、互換性のあるFlowのバージョン(複数可)の両方に対してです。
- Libdefsは**高品質基準**を満たす必要があり、**libdefテスト**を含めて、時間の経過とともに品質が維持されるようにする必要があります。
- 時間の経過とともに**libdefの改善に貢献する**ための、そして開発者が**それらの改善から恩恵を受ける**ための、簡単な方法が必要です。
- Flowプロジェクトのlibdefsを管理するプロセスは**自動化され、シンプルで、簡単に正しく行える**必要があります。
バージョン管理とテスト済みLibdefs
誰でもlibdefに貢献できます(または既存のものを改善できます)が、そうする際には、すべての開発者が使用しているlibdefに自信を持てるように、高品質基準を維持することが重要です。これに対応するために、flow-typedでは、すべてのlibdefの貢献は、記述しているライブラリのバージョンと、libdefが互換性のあるFlowのバージョン(複数可)の両方に明示的にバージョン管理される必要があります。
さらに、すべてのlibdefsには、APIの重要な部分をテストし、正しい型が得られることをアサートするテストが付属する必要があります。バージョン情報とテストを各libdefに含めることで、Travisでlibdefが互換性のあるすべてのFlowのバージョンに対して期待通りに動作することを自動的に検証できます。テストはまた、libdefに対する将来の変更によって、時間の経過とともにその機能が劣化しないようにするのに役立ちます。
Libdefインストールの自動化
Flowプロジェクトでのlibdefsの検索、インストール、アップグレードのプロセスを自動化するために、flow-typed
というシンプルなCLIツールを構築しました。これは、各libdefに関連付けられた明示的なバージョン情報を使用して、プロジェクトのpackage.jsonの依存関係に基づいて必要なすべてのlibdefsを検索します。これにより、プロジェクトにlibdefsを取り込み、更新するために必要な作業を最小限に抑えることができます。
yarn (yarn global add flow-typed
)またはnpm (npm install -g flow-typed
)のいずれかを使用して、flow-typed CLIを入手できます。
Libdefsのインストール
flow-typedリポジトリからlibdefsをインストールするには、依存関係をインストールした後にプロジェクトで単一のコマンドを実行するだけです。
> yarn install # Or `npm install` if you're old-school :)
> flow-typed install
flow-typed install
コマンドは、プロジェクトのpackage.jsonファイルを読み取り、依存関係に一致するlibdefsについてflow-typedリポジトリをクエリし、正しくバージョン管理されたlibdefsをflow-typed/
ディレクトリにインストールします。デフォルトでは、Flowはflow-typed/
ディレクトリにあるlibdefsを検索するため、追加の設定は必要ありません。
yarn
またはnpm install
を実行した*後*にこのコマンドを実行する必要があることに注意してください。これは、依存関係の1つに型がない場合、このコマンドによってスタブリブデフも生成されるためです。
libdefsをインストールしたら、**プロジェクトのリポジトリにチェックインすることをお勧めします**。flow-typedリポジトリ内のlibdefsは、時間の経過とともに改善される可能性があります(バグの修正、より正確な型など)。依存しているlibdefでこのようなことが発生した場合、その更新をプロジェクトに適用するタイミングを制御する必要があります。定期的にflow-typed update
を実行してlibdefの更新をダウンロードし、プロジェクトが引き続き型チェックされていることを確認し、更新をコミットできます。
npmを使用してLibdefsを配布しないのはなぜですか?
時間の経過とともに、flow-typedリポジトリ内のlibdefsは、バグの修正、精度の向上、またはライブラリの型をより適切に記述する新しいFlow機能の使用のために更新される可能性があります。その結果、各libdefに適用されるバージョンは、実際には3つあります。記述されているライブラリのバージョン、flow-typedリポジトリ内のlibdefの現在のバージョン、およびlibdefが互換性のあるFlowのバージョン(複数可)です。
インストール後にプロジェクトで使用しているlibdefが更新された場合、その更新によって、以前は不明だったプロジェクトに新しい型エラーが見つかる可能性が高くなります。以前に見逃されていたエラーが見つかるのは確かに良いことですが、それらの変更がいつプロジェクトに取り込まれるかを制御したいと思うでしょう。
これは、npm+semverのようなシステムに依存してnpmから非決定的なsemver範囲のバージョンをダウンロードしてインストールするのではなく、インストール済みのlibdefsをバージョン管理にコミットすることをお勧めする理由です。libdefsをチェックインすることで、バージョン履歴の任意のコミットにおいて、プロジェクトのすべての共同作業者がFlowから一貫した出力を得ることが保証されます。
コミュニティの構築
これは、何よりもまずコミュニティプロジェクトです。コミュニティメンバー(@splodingsocksさん、こんにちは!)によって開始され、すでに多くの人々の何時間も費やした作業から恩恵を受けています。さらに、これはコミュニティの取り組みであり続けるでしょう。誰でも、任意のnpmライブラリのlibdefを作成および/または維持できます。作成者は、公開時にパッケージのlibdefを作成できますし、他の人がまだ作成していない場合は、利用者が作成することもできます。どちらの場合でも、誰もが恩恵を受けます!
独自のlibdefsを多数貢献し、他の人がlibdefsを作成して貢献するのを支援することに時間を費やしてくれた@marudorさんに大きな感謝の意を表したいと思います。また、CLIとインストールワークフローの設計と反復、およびlibdefレビューの管理に貢献してくれた@ryyppyさんにも感謝いたします。
Flowコアチームは、このプロジェクトの開発と改善に引き続き投資するつもりですが、真に成功させるためには皆様の助けが必要です!すでに作業しているFlowプロジェクトでいくつかのlibdefsを作成したことがある場合は、貢献して、他の人にも恩恵を受けてもらうことをお勧めします。コミュニティ主導のリポジトリでlibdefsを管理することにより、コミュニティ全体が協力して、明示的に型付けされたJSを超えてFlowの機能を拡張できます。
まだ初期段階であり、やるべきことはまだたくさんありますが、皆様のアイデア/フィードバックを聞き、プルリクエストを読むことを楽しみにしています! :)
楽しいタイピングを!