0

Ring にはミドルウェア「reload」が付属しています (https://github.com/ring-clojure/ring/blob/master/ring-devel/src/ring/middleware/reload.clj)。ns-tracker (https://github.com/weavejester/ns-tracker) に基づいています。ns-tracker は、ソース ディレクトリを調べて、ns 形式で始まる可能性のあるソース ファイルを探します。これらの ns フォームに含まれる情報から依存関係グラフを作成します。もちろん、これは完全に機能しますが、ns フォームに明示的に含まれる依存関係に対してのみです。

Clojure には、名前空間が複数のファイルに分割されるイディオムがあります。名前空間 (ns 形式) を定義する単一のソース ファイルがあります。このファイルには最上位のフォームをいくつでも含めることができますが、通常は最上位にロードが含まれますが、必ずしもそうではないと思います。ロードされたファイルは in-ns フォームで始まります。これは、あなたが思っているほど曖昧なテクニックではありません... clojure.core はそれを使用しています。

これらのロードされたファイルの内容は、それ自体ではモジュールを構成しません。また、強制的にモジュールにすることもできません (循環依存など)。

ns-tracker は、ソース ファイルをスキャンしてロード式を探したり、in-ns フォームを探したりしません。そして、その理由は十分に明確です。しかし、ロードされたファイルへの変更は明らかに名前空間をリロードしないため、ワークフローが本当に台無しになります。

明示的にロードされたソース ファイルを処理するライブラリがあるかどうかを知っている人はいますか? 何もない場合は、一緒に何かをハックして (おそらくロードに関する醜いマクロを書いて)、公開します。

4

1 に答える 1

0

さて、私の質問に答えます... ns-tracker を拡張し、プル リクエストを送信しました。私が期待したほどハックではなく、実際にはかなり合理的です。

私のフォークはhttps://github.com/hutch/ns-trackerにあります。

ns-tracker には多くの変更が含まれています。特に私の質問に対して、それは clojure/core で使用される方法で load/in-ns の使用をサポートしています。

leiningen の「チェックアウト」メカニズムを使用して、プロジェクトでこのフォークを使用できます。

于 2012-12-28T19:40:49.983 に答える