2017-02-13 9 views
1

私は、Gradleのセットアップに関してオンラインで多くの投稿があることを認識しています。それは言われている、私は重く調査し、私が探しているものを正確に見つけなかった、または私はそうするために間違った言葉を使っている。私はGradleバージョン3.3を使用しています。他のプロジェクトのモジュールに対するGradleの依存関係に失敗しました

私は複数のGradleプロジェクトを持っています。それぞれのプロジェクトは別々に管理されています。マスターGradleプロジェクトはありません。各プロジェクトには独自のモジュール、ビルド、設定ファイルがあります。この構造はほどです:

Projects 
    A 
    a1 
     build.gradle 
    a2 
     build.gradle 
    build.gradle 
    settings.gradle 
    B 
    b1 
     build.gradle 
    b2 
     build.gradle 
    build.gradle 
    settings.gradle 

私がしようとしてる何AのモジュールにBが依存させるです。 Bのモジュールの1つがa1に依存しているとしましょう。 Bの設定では、私は次のことをやった:

rootProject.name = 'B' 
rootProject.setProjectDir(new File(".") 

include 'a1' 
project(':a1').setProjectDir(new File(settingsDir.getParentFile(), "/A/a1")) 

私はバージョン番号を格納しています方法は内線クロージャ内の各プロジェクトのbuild.gradleファイルを介してです。私はプロジェクトを通してそれらにアクセスします。ここでBのビルドファイルがどのように見えるかです:

ext { 
    freemarkerVersion = '2.3.19' 
} 

dependencies { 
    compile project(':a1') 
    compile group: 'org.freemarker', name: 'freemarker', version: rootProject.properties.get('freemarkerVersion') 
} 

私は何を見ていると、Bはその依存関係を解決することができ、プロジェクトのA1をコンパイルしようとしているが、それはBのバージョン番号の代わりに、Aさんが使用しています。私は、異なるバージョン番号の両方のプロジェクトに共通の依存関係を置くことでこれを検証しました。 Bのバージョンを使用して依存関係が表示されました。私もBのバージョン番号を変更し、これをさらに確認しました。だから、それぞれのbuild.gradleファイルでプロジェクトに適したバージョンを使用するための助けを得ることができたら、それは素晴らしいことです!

編集:以前の問題は解決されていない相対パスからのものでした。

答えて

0

自分の角などを投げてはいけませんが、他の回答がなかったので、思いついた解決策を投稿しています。

最初に行ったのは、プロジェクトのbuild.gradleファイルのext closureではなく、すべてのバージョンプロパティを外部のgradle.propertiesファイルに移動したことでした。これを行うと、プロジェクトは独自のコンテキストからコンパイルされたときにデフォルトでプロパティファイルをロードします。もちろん、これはuser.home gradle.propertiesファイルからオーバーライドされるので、これを覚えておいてください。例gradle.properties:

a_freemarkerVersion = 2.3.19 

別のプロジェクトから1つのプロジェクトのモジュールを使用している場合、あなたは別に2ので、Gradleの依存関係のプロパティを解決することができますリンクする方法が必要になります。これを実現するには、目的のプロジェクトのプロパティファイルを読み込むメソッドを定義します。 、

def addConfig(String parent, String filename) { 
    Properties props = new Properties() 
    props.load(new FileInputStream(new File(project.projectDir.getParent(), "/${parent}/${filename}"))) 
    props.each { prop -> 
     project.ext.set(prop.key, prop.value) 
    } 
} 

addConfig("A", "gradle.properties") 

すべてこの方法は、一つのディレクトリ上がるあるん指定されたプロジェクトに入り、そのgradle.propertiesファイルを取得し、現在のプロジェクトのプロパティにこれらの変数をロードします。この方法では、そうのように見えます。つまり、ここで注意すべき点が1つあります。両方で同じ変数を定義すると、そのうちの1つがオーバーライドされます。これを避けるために、すべての変数の前にプロジェクト名とアンダースコアを付けました。これにより、彼らは決して互いと闘うことはないでしょう。

私はこの構文を持つすべてのプロジェクト内の変数にアクセス:

dependencies { 
    compile group: 'org.freemarker', name: 'freemarker', version: "${a_freemarkerVersion}" 
} 

を、私は私の最初の記事で定義されたセットアップの残りの部分は同じです。依存モジュールをインクルードし、プロジェクトディレクトリを指定し、プロジェクトの依存関係からそのプロジェクトをコンパイルしてください。

関連する問題