【问题标题】:Having difficulty setting up Gradle multiproject build for existing repository layout难以为现有存储库布局设置 Gradle 多项目构建
【发布时间】:2013-02-07 05:56:36
【问题描述】:

我正在尝试为我的项目布局已经由我决定的情况制作 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 的多项目支持,我正在尝试做的事情是否可行?还是我找错树了?

【问题讨论】:

标签: gradle


【解决方案1】:

几点建议:

  • Gradle 将 logical 项目层次结构(Gradle 将构建组织成项目的逻辑层次结构的方式)与 physical 目录布局严格分开。几乎任何映射都是可能的。 (想到的一个例外是,您不能让两个项目共享同一个项目目录。)
  • 要实现自定义目录布局,您必须为所有项目设置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
  • Gradle 必须从包含settings.gradle 的目录或其子目录中调用。因此,从可用性的角度来看,最好将settings.gradle 放在目录层次结构的根目录中。

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

【讨论】:

  • 太棒了,彼得,谢谢。这解决了我对它的工作原理的一大堆误解。我将在下面发布另一个答案,展示对我有用的最后一个示例,以防其他人在同一领域苦苦挣扎。
  • 很高兴它有帮助。更正:根据文档,使用 -P 设置的属性也可在设置脚本中使用。我已经相应地编辑了我的答案。
  • 对我帮助很大的一件事是意识到 settings.gradle 应该只存在于根项目中。
【解决方案2】:

为了完整起见,解决我上面具体例子的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'

显然,这不适用于大量子项目,使用上面 Peter 提供的提示可以做得更好。

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2014-06-28
    • 2012-02-04
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2023-03-21
    • 2013-01-14
    • 2015-04-26
    相关资源
    最近更新 更多