难以为现有存储库布局设置Gradle多项目构建

时间:2013-02-06 12:26:01

标签: gradle

我正在尝试为我的项目布局已经指定的情况制作Gradle多项目构建。我有这样的事情:

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

我的settings.gradle看起来像这样:

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

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

当我在构建文件夹中运行Gradle时,如下所示:

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

即。它没有找到我试图建立的项目。 我正在尝试使用Gradle的多项目支持吗?还是我在错误的树上吠叫?

2 个答案:

答案 0 :(得分:30)

有几点指示:

  • Gradle严格地将逻辑项目层次结构(Gradle将构建组织为项目的逻辑层次结构的方式)与物理目录布局分开。几乎任何映射都是可能的。 (我想到的一个例外是你不能让两个项目共享同一个项目目录。)
  • 要实现自定义目录布局,您必须为所有项目设置projectDir,而不仅仅是根项目。您应该使用相对路径,例如rootProject.projectDir = new File(settingsDir, "../foo")project(":sub1").projectDir = new File(rootDir, "bar")。在此处,settingsDir指的是包含settings.gradle的目录,rootDirrootProject.projectDir的简写。
  • 要一般性地配置项目,您可以递归地(root)Project.children行走。请注意,settings.gradlebuild.gradle分别使用不同的类型来表示项目 - ProjectDescriptorProject
  • 必须从包含settings.gradle的目录或其子目录中调用Gradle。从可用性的角度来看,最好将settings.gradle放入目录层次结构的根目录中。

有关详细信息,请参阅Settings中的Gradle Build Language Reference和Gradle用户指南中的Multi-Project Builds章节。

答案 1 :(得分: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'

显然,这不会扩展到大量子项目,并且可以使用上面提到的提示明显更好地完成。