2013-03-08 9 views
21

私たちはgradleを約1年間使用しており、やや成功しています。多くの機能はまだ少し不透明ですが、私たちはそこに向かっています。2レベル以上のgradleプロジェクトを設定することは可能ですか?

私がgradleのために見たすべての例は、ルートプロジェクトと1レベルのサブプロジェクトを持っています。いくつかの理由から、gitプロジェクトを統合したいと考えています。これらはすべてグラデルプロジェクトで、一部はグラデーションサブプロジェクトを持っています。最終的には、本質的にマルチレベルのグラデル構造です。これらのプロジェクトのすべての階調設定を変更するのではなく、すべてのプロジェクトとそれに対応するサブプロジェクトを管理するトップレベルのグラデーションが必要です。最初の試みでは、すべてのプロジェクトとサブプロジェクトをオーケストレーションする制御build.gradleを持つことができないことが示されました。私は何か間違っているのですか?私は、本質的に崩壊するパラダイムに従っていますか?ここで

は、私が何をしたいのためのサンプル構造である:

Top Project 
    build.gradle 
    Project 
    build.gradle 
    Sub Project 
     build.gradle 
     src 
    Sub Project 
     ... 
    Project 
    ... 

はありがとうと私はドキュメントのいくつかの明白な説明を逃さなかった願っています。

+1

もう少し読んだ後、私はGradleBuildタスクを使うべきだと思われます:http://www.gradle.org/docs/current/userguide/organizing_build_logic.html#sec:external_build –

+0

'GradleBuild'はあなたが今日できる最高のものです。実際の取引(集約ビルド)は計画された機能です。 –

答えて

16

私は単にTopProject/settings.gradleに次のように置く:

include 'Project1:SubProject1' 
include 'Project1:SubProject2' 
include 'Project2:SubProject1' 
... 

あなたが現在持っているプロジェクトに必要な唯一の変更は、あなただけの1つの設定を持つことができるようにそれらからsettings.gradleファイルを削除することですプロジェクト構造ごとの.gradleファイル。

+0

さて、私たちのビルドは理想的には設定されていないかもしれませんが、それはうまく動作しませんでした。 GradleBuildはいくつかの動的なタスク生成とともにこのトリックをやっているようです。 –

+0

これは動作確認されています! –

0

これは非常にうまく機能している:

ext{ 
    buildPrefix = "build" 
    allProjects = ["P1", "P2"] 
} 

def createTasks(String prefix) { 
    def newTasks = allProjects.each { 
    def pName -> 
     def tName = "$prefix$pName" 
     tasks.add(name: tName, type: GradleBuild) { 
     dir = pName 
     tasks = [ prefix ] 
     } 
    } 
} 

createTasks(buildPrefix) 

ext { 
    buildTasks = tasks.findAll{ t -> t.name.startsWith(buildPrefix) } 
} 

task build(dependsOn: buildTasks) {} 

は、私はちょうど私がトップレベルで公開する他のタスクを追加することができます。

ありがとうございます。

7

私は同様の問題がありました。最も簡単な解決策は、Erdiの答えに似た$ root/settings.gradleファイルにプロジェクトを追加してgradleを設定することでした。しかし、私はすべてのサブプロジェクトを自動的に追加することができました。ロジックは単に私のディレクトリ構造を通り、build.gradleを含むすべてのディレクトリを見つけてサブプロジェクトとして追加します。ここで

はそれを行う方法です:

  • あなたが他のsettings.gradleを持っていないが、ルート1
  • ルートsettings.gradleファイルの内容があるべきことを確認してください:
fileTree('.') { 
    include '**/build.gradle' 
    exclude 'build.gradle' // Exclude the root build file. 
}.collect { relativePath(it.parent).replace(File.separator, ':') } 
.each { include(it) } 

これが役立つことを願っています。

+0

これは本当に素晴らしいです。 +1 – Ajax

関連する問題