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

难以为现有存储库布局设置Gradle多项目构建,gradle,Gradle,我正试图为我的项目布局已经由我决定的情况设计一个Gradle多项目构建。我有这样的想法: -->Shared\ ---->SharedComponent1\ ------>build.gradle ------>src\ ... ---->SharedComponent2\ ------>build.gradle ... -->Product1\ ---->ProductComponent1\ ------>build.gradle ----

我正试图为我的项目布局已经由我决定的情况设计一个Gradle多项目构建。我有这样的想法:

-->Shared\
---->SharedComponent1\
------>build.gradle
------>src\
...
---->SharedComponent2\
------>build.gradle
...
-->Product1\
---->ProductComponent1\
------>build.gradle
---->ProductComponent2\
------>build.gradle
...
---->build\
------>settings.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
My settings.gradle如下所示:

-->Shared\
---->SharedComponent1\
------>build.gradle
------>src\
...
---->SharedComponent2\
------>build.gradle
...
-->Product1\
---->ProductComponent1\
------>build.gradle
---->ProductComponent2\
------>build.gradle
...
---->build\
------>settings.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
当我在build文件夹中运行Gradle时,如下所示:

-->Shared\
---->SharedComponent1\
------>build.gradle
------>src\
...
---->SharedComponent2\
------>build.gradle
...
-->Product1\
---->ProductComponent1\
------>build.gradle
---->ProductComponent2\
------>build.gradle
...
---->build\
------>settings.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
:项目
------------------------------------------------------------
根项目
------------------------------------------------------------
根项目“生成”
无子项目
要查看项目的任务列表,请运行gradle:tasks
例如,尝试运行gradle:tasks
建设成功
i、 e.它找不到我试图构建的项目。 我想用Gradle的多项目支持做的事情可能吗?还是我找错树了?

几点提示:

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

有关更多信息,请参阅和《Gradle用户指南》中的章节。

有关完整性,解决上述特定示例的
设置.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'

显然,这并不能扩展到大量的子项目,使用上面Peter提供的提示可以做得更好。

太好了,Peter,谢谢。这就解决了我对它的工作原理的一大堆误解。我将在下面发布另一个答案,展示最后一个对我有用的例子,以防其他人在同一领域遇到困难。很高兴它有所帮助。更正:根据文档,设置脚本中还提供了一个带有-P的属性集。我已经相应地编辑了我的答案。有一件事帮了我很大的忙,那就是认识到settings.gradle应该只存在于根项目中。下面是一个适用于gradle2.2.1但不适用于android studio 1.0.2的工作示例: