为啥 Gradle 需要 settings.gradle 文件?

Posted

技术标签:

【中文标题】为啥 Gradle 需要 settings.gradle 文件?【英文标题】:Why does Gradle need a settings.gradle file?为什么 Gradle 需要 settings.gradle 文件? 【发布时间】:2014-01-22 18:10:27 【问题描述】:

我要将我的 android 项目从 Ant 转换为 Gradle。

我的 Eclipse 工作区非常简单:

Workspace
     MyApp
     MyApp-AndroidLibrary

当我在 MyApp 中添加 build.gradle 文件时,我想引用我的 Android 库项目:

apply plugin: 'android'

dependencies 
     compile fileTree(dir: 'libs', include: '*.jar')
     compile project(':MyApp-AndroidLibrary')

当我运行 gradle build 时,出现错误“在根项目中找不到路径为 ':MyApp-AndroidLibrary' 的项目”,我搜索了一下,发现我需要设置一个“settings.gradle”文件在我的工作区目录中,添加

include ":MyApp"
include ":MyApp-AndroidLibrary"

这对我来说太糟糕了,为什么 Gradle 需要一个 settings.gradle 文件,为什么不直接提取我在依赖项中定义的项目?

include 的真正含义是什么?如果我在工作区中有另一个应用程序和其他一些共享库,结构可能如下所示:

Workspace
     App1
     App2
     Library1(Used by App1 & App2)
     Library2(Used only by App1)
     Library3(Used only by App2)

因为只有一个 settings.gradle 文件,我不得不将它们全部添加到 settings.gradle 中。那味道不好闻。

是的,我可以重新组织结构,使Library2成为App1的子目录,Library3成为App2的子目录,但是Library1呢?

对此有何评论?

【问题讨论】:

【参考方案1】:

您在问几个不同的问题。以下是一些提示:

':MyApp-AndroidLibrary' 是一个逻辑项目路径,它根据settings.gradle 中提供的信息映射到物理路径。 多项目构建可以有任意目录结构,在settings.gradle 中配置。除非您愿意,否则无需移动目录。 Eclipse 工作区和 Gradle 构建是独立的边界。您可以在同一个工作区中进行多个构建。 使用从源代码构建的库时,您可以将它们作为同一个构建的一部分,或者为它们单独构建。在后一种情况下,您需要确保在应用程序之前构建库,并通过 Maven 或 Ivy 存储库交换工件。这可以使用 CI 服务器和企业 Maven/Ivy 存储库来自动化。或者,您可以在您的机器上手动触发库的构建并使用本地 Maven/Ivy 存储库。

如需更多信息,请查看Gradle User Guide,尤其是关于多项目构建的章节。

【讨论】:

我仍然不确定为什么没有默认行为(在大多数情况下与目录结构匹配),这会使很多用例变得更简单。 那么你是说Gradle确实不使用settings.gradle中的信息来确定项目依赖关系,而只是将各种build.gradle文件中定义的项目依赖关系从逻辑路径映射到物理路径路径? settings.gradle 中的信息告诉 Gradle 哪些子项目是这个构建的一部分,它们的逻辑和物理路径是什么,它们的构建脚本是如何命名的,等等。它不会也不能告诉 Gradle子项目之间的依赖关系是什么。 只是想知道为什么他们决定为 settings.gradle 建立一个单独的文件?为什么不把这些信息也放在 build.gradle 中呢?也许在设置...部分左右...这有技术原因吗? 我也认为这是一个很好的问题。渗透 gradle 的设计似乎毫无意义。这个文件的存在实际上是有原因的吗?这绝对不能回答这个问题。【参考方案2】:

以防万一人们(比如我自己或gladman)仍然遇到这个问题并且找不到解决方案。使用当前版本的 Gradle,您可以这样做:

将文件settings.gradle 移动到目录My-App 并将include 替换为includeFlat 'MyApp-AndroidLibrary'。这应该可以解决问题。

还可以比较 this question 并查看 Gradle 用户指南中的 this section 了解更多详细信息。

【讨论】:

以上是关于为啥 Gradle 需要 settings.gradle 文件?的主要内容,如果未能解决你的问题,请参考以下文章

当子进程仍然打开时,为啥 Java 进程会从 Gradle 挂起?

为啥打开android studio总是在build gradle

为啥我的 build.gradle android studio 中没有 allprojects?

为啥 Gradle 会运行两次测试?

我有一个错误,但依赖项包含在 gradle root 和 gradle 模块配置中,为啥?

android studio 为啥每次build gradle很慢