为啥 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?