Java 为什么Gradle需要settings.Gradle文件?

Java 为什么Gradle需要settings.Gradle文件?,java,android,eclipse,maven,gradle,Java,Android,Eclipse,Maven,Gradle,我将把我的Android项目从Ant转换为Gradle 我的Eclipse工作区非常简单: Workspace MyApp MyApp-AndroidLibrary 当我在MyApp中添加build.gradle文件时,我想引用我的Android库项目: apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile proje

我将把我的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文件,为什么不提取我在依赖项中定义的项目

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

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呢


对此有何评论?

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

  • ':MyApp AndroidLibrary'
    是一个逻辑项目路径,它根据
    设置.gradle
    中提供的信息映射到物理路径
  • 多项目生成可以具有任意目录结构,可在
    settings.gradle
    中进行配置。无需四处移动目录,除非您愿意
  • Eclipse工作区和Gradle构建是独立的边界。在同一工作区中可以有多个生成
  • 使用从源代码构建的库时,可以使它们成为同一构建的一部分,也可以为它们创建单独的构建。在后一种情况下,您需要确保在应用程序之前构建库,并通过Maven或Ivy存储库交换工件。这可以使用CI服务器和公司Maven/Ivy存储库实现自动化。或者,您可以在您的机器上手动触发库的构建,并使用本地Maven/Ivy存储库
有关更多信息,请查看,特别是关于多项目构建的章节。

以防人们(如我或gladman)仍然存在此问题,并且无法找到解决方案。使用当前版本的Gradle,您可以执行以下操作:

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


还要比较并查看Gradle用户指南中的更多详细信息。

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