2017-01-12 7 views
4

私はこのライブラリを使用するライブラリとアプリケーションを開発しています。Clojureでローカル依存関係を使用するには?

私はこのライブラリのためのリモートリポジトリを持っていません.GitHubには通常のプロジェクトとしてしか保存されていません。 my-libraryは私のライブラリとgit submoduleある

. 
├── README.md 
├── project.clj 
├── repo 
├── src 
├── target 
├── libraries 
│ └── my-library 
└── test 

ている:私のアプリケーションで

私は依存関係として、このライブラリを使用したい、私は考えていると、そのような構造を持つことです。私のアプリケーションにこの依存関係を知らせる方法は?

これを行うための2016ソリューションは何ですか?

+0

これはhttp://stackoverflow.com/q/2404426の複製のようです。そうでない場合は明確にしてください。 – glts

+0

[LIiningen - ローカルjarの依存関係を追加するにはどうすればいいですか?](http://stackoverflow.com/questions/2404426/leiningen-how-to-add-dependencies-for-local-jars) –

+2

これは重複していません*この質問はソースコードの依存性に関するもので、特にjarファイルに関するものです。これはまだ重複しているかもしれません、それはちょうどその*の複製ではありません。 –

答えて

2

Clojureでライブラリを管理するために、gitサブモジュールまたはローカルファイルベースのアプローチを使用するのは一般的ではありません。 Clojureは、ライブラリ管理の標準的なJavaエコシステムアプローチの多くを活用しています。一般的には、Clojars(またはMaven Central)のようなパブリックMavenリポジトリにライブラリを構築して配備する必要があります。自組織内でのみこれを使用している場合は、組織レベルのMavenリポジトリにも他のオプションがあります。

これで、自分のプロジェクトで、選択したビルドツールの依存関係として宣言することで、そのライブラリを使用できます。 Clojureでは、最も一般的なツールはLeiningenで、そのライブラリの使用をdependencyと宣言します。

他の選択肢は、Maven(Leiningenと非常によく似ていますがXML形式)またはBootです。これは少し異なるアプローチです。

+0

これは本当に大きなオーバーヘッドですか?私自身の図書館だけを入れることはできないのですか?ライブラリ用のリポジトリ全体をスピンオフする必要がありますか? – squixy

+1

あなたはそうする必要はありません。私は長い間しなかったチームと一緒に働いています。最終的にはすべてのことをしました。なぜなら、長期的には「正しいことをする」ことは、生涯の欲求不満(そして労力)を節約するからです。 –

6

libをgitサブモジュールとして含める必要はありません。 マイライブラリプロジェクトをローカルに「リリース」することができます。

  1. だけmy-libraryプロジェクトフォルダに移動し、lein pom; lein jar; lein installを実行します。ここで重要な部分はlein installで、jarとpomをローカルリポジトリにインストールします。典型的には〜/ .m2。

  2. このライブラリを使用するプロジェクトに移動し、project.cljに依存性として単に宣言すると、:dependencies [[my-library "version"]]のように動作します。

EDIT: Simlarly、あなたがBootを使用している場合、あなたはboot pom; boot jar; boot install

1

を実行することができますより簡単な解決策はここに記載されているようにlein checkoutsを使用することです:https://github.com/technomancy/leiningen/blob/master/doc/TUTORIAL.md#checkout-dependencies

でdirのcheckoutsを作成します。プロジェクトの最上位レベル(srcディレクトリに平行)。 checkoutsの中で、ライブラリコードを含むプロジェクトのディレクトリへのシンボリックリンクを作成するだけです。今

> d clj clj/* clj/checkouts/* 

drwxrwxr-x 10 alan alan 4096 Jan 12 10:36 clj/ 
drwxrwxr-x 2 alan alan 4096 Oct 14 09:23 clj/checkouts/ 
lrwxrwxrwx 1 alan alan 17 Oct 30 16:44 clj/checkouts/tupelo -> /home/alan/tupelo/ 
drwxrwxr-x 2 alan alan 4096 Aug 31 10:05 clj/doc/ 
-rw-rw-r-- 1 alan alan 11219 Aug 31 10:05 clj/LICENSE 
-rw-rw-r-- 1 alan alan 794 Jan 5 12:09 clj/project.clj 
-rw-rw-r-- 1 alan alan 457 Aug 31 10:05 clj/README.md 
drwxrwxr-x 2 alan alan 4096 Jan 3 09:01 clj/resources/ 
drwxrwxr-x 3 alan alan 4096 Aug 31 10:05 clj/src/ 
drwxrwxr-x 8 alan alan 4096 Nov 14 16:26 clj/target/ 
drwxrwxr-x 3 alan alan 4096 Sep 29 22:31 clj/test/ 

cljプロジェクトをビルドするとき、それは(常に)からソースコードを使用します。たとえば、プロジェクトcljおよびライブラリtupelo

drwxrwxr-x 10 alan alan 4096 Jan 5 12:09 clj/ 
drwxrwxr-x 11 alan alan 4096 Jan 9 20:01 tupelo/ 

は、プロジェクトcljがそうのようになります考えます~/tupeloの代わりに&()に変更するたびに、tupeloのlibからjarを(再)インストールする必要はありません。

+0

状況は、あなたの最後の段落が意味するところより少し悪いです。それは、あなたのローカルコード**をさらに使用します**。あなたのローカルチェックアウトディレクトリでライブラリの1つのバージョンを使用し、一時的な依存関係が同じライブラリを読み込んだ場合は、最初にmavenのものがロードされ、次にそのライブラリの上にロードされます。チェックアウトを使用する場合は、トップレベルで副作用機能を持つライブラリを使用しないでください。 –

関連する問題