2013-02-06 25 views
10

私のプロジェクトレイアウトがすでに私に指示されている状況で、Gradleマルチプロジェクトビルドを作成しようとしています。既存のリポジトリレイアウト用のGradleマルチプロジェクトビルドの設定が難しい

-->Shared\ 
---->SharedComponent1\ 
------>build.gradle 
------>src\ 
... 
---->SharedComponent2\ 
------>build.gradle 
... 
-->Product1\ 
---->ProductComponent1\ 
------>build.gradle 
---->ProductComponent2\ 
------>build.gradle 
... 
---->build\ 
------>settings.gradle 

マイsettings.gradleは次のようになります:私はこのようなビルドフォルダでのGradleを実行すると

rootProject.name = 'Product1' 
rootProject.projectDir = new File("${ProjectsRoot}") 

include 'Shared:SharedComponent1' 
include 'Shared:SharedComponent2' 
include 'Product1:ProductComponent1' 
include 'Product1:ProductComponent2' 

gradle -PProjectsRoot=c:\my\project\root\dir projects 

私が手:

私はこのような何かを持っています
:projects 

------------------------------------------------------------ 
Root project 
------------------------------------------------------------ 

Root project 'build' 
No sub-projects 

To see a list of the tasks of a project, run gradle <project-path>:tasks 
For example, try running gradle :tasks 

BUILD SUCCESSFUL 

つまり、p私はビルドしようとしている。 Gradleのマルチプロジェクトサポートで私がしようとしていることは可能ですか?それとも、私は間違った木を吠えるのですか?

+0

ここでは、gradle2.2.1では動作しますが、android studio 1.0.2では動作しない動作例です:http://stackoverflow.com/questions/18936433/relative-gradle-project-dependency-with-holoeverywhere/ – k3b

答えて

29

ポインタのカップル:

  • のGradleは厳密に物理ディレクトリレイアウトから論理プロジェクト階層(のGradleはプロジェクトの論理的な階層にビルドを整理する方法)を分離します。ちょうどどんなマッピングでも可能です。ただし、同じプロジェクトディレクトリを共有する2つのプロジェクトを持つことはできません。
  • カスタムディレクトリレイアウトを実装するには、ルートプロジェクトだけでなくすべてのプロジェクトにprojectDirを設定する必要があります。相対パスを使用する必要があります(例: rootProject.projectDir = new File(settingsDir, "../foo")およびproject(":sub1").projectDir = new File(rootDir, "bar")。ここで、settingsDirは、settings.gradleを含むディレクトリを指し、rootDirは、rootProject.projectDirの略です。
  • 一般的にプロジェクトを構成するには、再帰的に(root)Project.childrenを歩くことができます。 settings.gradlebuild.gradleは、それぞれ異なるタイプを使用してプロジェクトを表します(ProjectDescriptorProject)。
  • settings.gradleまたはそのサブディレクトリを含むディレクトリからGradleを呼び出す必要があります。したがって、ユーザビリティの観点から、settings.gradleをディレクトリ階層のルートに配置することが最善です。詳細については

Gradle Build Language ReferenceSettings、とGradleのユーザーガイドでMulti-Project Builds章を参照してください。完全のために

+0

ファンタスティック、ピーター、ありがとう。それは私がこれがどのように機能するかについての誤解の全体を解決しました。私は他の人が同じ地域で苦労している場合に備えて、私のために働いた最後の例を示す別の答えを投稿します。 –

+0

助けてくれてうれしいです。修正:ドキュメントによれば、-Pで設定されたプロパティは、設定スクリプトでも使用できます。私はそれに応じて私の答えを編集しました。 –

+0

私を大いに助けたことの1つは、settings.gradleがルートプロジェクトにしか存在しないことを認識することでした。 – mooreds

11

次のように、上記の私の具体的な例を解決settings.gradleは次のとおりです。明らかに

rootProject.name = 'Product1' 

def projectTreeRootDir = new File("${ProjectsRoot}") 

// Shared components 

def sharedRootDir = new File(projectTreeRootDir, 'Shared') 

include ':SharedComponent1' 
project(':SharedComponent1').projectDir = new File(sharedRootDir, 'SharedComponent1') 

include ':SharedComponent2' 
project(':SharedComponent2').projectDir = new File(sharedRootDir, 'SharedComponent2') 

// Product components 

includeFlat 'ProductComponent1', 'ProductComponent2' 

これはサブプロジェクトの多くにスケールしないと、それはピーターが提供するヒントを使用して、より良い大幅に行うことができます上記。

関連する問題