13

私は、Clojure プロジェクトを複数のモジュールとして構成し、順序付けられた依存関係を持たせたいと考えています (以下を参照)。Maven で複数モジュール プロジェクトを使用できるようにします

しかし、Leiningen でこれを行う方法がわかりません。FAQ に記載checkoutsされている修正がそれほど強力ではないように見えるだけです。

レインはこれをしますか?代わりに Gradle を使用する必要がありますか? それとも、このようなものは必要ありませんか?

もう少しコンテキスト: プラグインをサポートするモジュール式アプリケーションを設計する方法を考えています (これは、クラスパスにダンプされた jar を意味すると思います)。そして、それをコア + プラグインとしてどの程度構造化できるのか疑問に思っています (Clojure の動的コード読み込みで何かを行うことができ、Java/OSGi を使用する必要はないと考えています)。したがって、単一のプロジェクトを推進する動機は、すべて (コア + デフォルト プラグイン) を単一の BLOB としてパッケージ化し、エンド ユーザーにとって簡単でありながら、分割することもできる (ビルドされ、断片的にテストされ、各モジュールの論理的な独立性がテストされます)。これに関するより一般的なアドバイスを歓迎します

アップデート

以下に記載されていない可能な解決策は、Maven プラグインを使用することです。これは、Maven が行うすべてのことをサポートしていると思いますが、Clojure をコンパイルするため、ネストされたモジュールなどで動作します。

4

1 に答える 1

9

まず、Leiningen は Maven のようなモジュール階層をサポートしていないようです。チェックアウトは、次に近いものです。ただし、Clojure でモジュラー アプリケーションを開発するだけで十分なはずです。

プロジェクト構造については、API プロジェクト、「コア」プロジェクト、プラグイン自体、および個別のパッケージ プロジェクトを用意します。コアとプラグインは API のみに依存する必要があります。パッケージ プロジェクトの作成にどのビルド ツールを使用するかは、ユーザー次第です。Gradle はおそらくパッケージングの処理においてより効果的ですが、Leiningen が提供する「チェックアウト」機能を使用すると、システム全体の開発が容易になる可能性があります。

Leiningen と Noir のコードを見て、これを効果的に処理する方法を見つけます。

プラグインを動的にロードするために、Noir が 2 つのファイルでそれを処理する方法を調べることから始めます。

  • server.cljには、特定の名前空間の下にあるすべてのファイルの名前空間の読み込みがあります。内部ではtools.namespacerequireを使用していますが、特定のベースの下にあるすべての名前空間にどのように使用されているかを簡単に確認できます。これは、Leiningen がカスタム タスクを処理する方法でもあります。タスクの基本定義は、leiningen.$task 名前空間にある必要があります。
  • core.cljには、プラグインの登録に使用するものが含まれています。要約すると、 の下でマップを使用し、atomそのマップにプラグインを追加します。コードをきれいに保つために、登録をマクロでラップすることをお勧めします。

実行時にプラグインの追加を処理する必要がない場合は、上にリストしたもので十分です。起動時にクラスパスにすべてのプラグインがない場合は、pomegraniteを利用してクラスパスにエントリを追加することをお勧めします。classpath.cljで例を見ることができます。

于 2012-04-23T04:38:01.130 に答える