2018年3月28日
Mike Fikes
ClojureScriptコードをコンパイルすると、JavaScript、解析メタデータ、ソースマップなど、いくつかのアーティファクトが生成されます。これらは、出力サブディレクトリ(通常は "out" または "target")にローカルにキャッシュされます。
これらのアーティファクトは生成にコストがかかるため、出荷ライブラリJARに含めるのは魅力的です。しかし、アーティファクトは、使用されるコンパイラバージョンや、有効なビルドに影響するコンパイラオプション(:target、:elide-asserts、:static-fnsなど)によって異なるため、このアプローチは実現不可能です。
ClojureScriptの新しい機能は、この問題を効果的に解決できます。有効にすると、JARから生成されたコンパイルアーティファクトは、共有キャッシュに配置されます。これは、たとえば、core.async 0.4.474を一度コンパイルできることを意味します。
共有キャッシュは、コンピュータ上にある可能性のあるさまざまなClojureScriptプロジェクト間で再利用できます。また、プロジェクトで「clean」を実行して最初からビルドする場合に、出力ディレクトリを生成するためのソースとしても使用できます。これにより、プロジェクト内のソースのみをコンパイルするため、ビルド時間が大幅に短縮されます。
ClojureScript自体は通常JAR依存関係であるため、共有AOTキャッシュメカニズムは、典型的なLispのメタ環状方式で、ClojureScript自体に適用でき、cljs.coreやClojureScriptに同梱されている他の名前空間のために生成されたアーティファクトをキャッシュします。
これにより、cljs.mainの新しい機能が有効になります。スクリプトを実行したり、-eでフォームを評価したり、REPLを起動したりする場合など、特定のユースケースでは、cljs.mainは、cljs.mainを実行した場所に「out」ディレクトリを作成してファイルシステムを汚すのではなく、一時的な出力ディレクトリを使用します。AOT cljs.coreを使用する機能により、このユースケースは素晴らしく高速になります。
AOTキャッシュロジックは、異なるコンパイラバージョン、ビルドに影響するオプション、JAR名を処理するのに十分なほどスマートであり、その情報を使用してキャッシュ内のアーティファクトバリアントを個別に保存します。また、AOTキャッシュ機能は、出荷JAR内のコードが不変であるという概念に基づいている一方で、スナップショットJARやローカルにデプロイされたJARリビジョンの場合にはこれが当てはまらないことを認識しています。これらの場合、JARのタイムスタンプの変更はキャッシュを無効にします。
|
AOTキャッシュロジックは、出荷JARが、それらのJARに出荷されたソースに対して生成されたコードに影響を与えるために周囲の環境を参照するマクロを使用する場合を処理できません。 たとえば、FigwheelまたはDiracで このような状況では、ライブラリとツールは代わりに |
デフォルトでは、ClojureScriptがcljs.mainを介して使用されていない限り、この機能は無効になっています。新しい:aot-cacheコンパイラオプションを明示的に使用することで、デフォルトをオーバーライドできます。
この戦略は、AOTアーティファクトが出荷JARSに含まれていることに依存しないため、Git Depsに適しているはずです。おそらく、それはClojureScriptの将来のリリースで登場するでしょう。
この機能を試してみることをお勧めします。私たちの願いは、この機能が最終的にはあなたが考えもしなくなる機能であり、それがあなたの日常の開発をさらに進めるのに役立つことです!