为啥 Gradle 需要 settings.gradle 文件?

     2023-02-26     67

关键词:

【中文标题】为啥 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 了解更多详细信息。

【讨论】:

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

】当子进程仍然打开时,为啥Java进程会从Gradle挂起?【英文标题】:WhydoesaJavaprocesshangfromGradlewhensub-processisstillopen?当子进程仍然打开时,为什么Java进程会从Gradle挂起?【发布时间】:2014-03-2201:18:49【问题描述】:如果一个在java... 查看详情

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

】为啥我的build.gradleandroidstudio中没有allprojects?【英文标题】:whyisnoallprojectsinmybuild.gradleandroidstudio?为什么我的build.gradleandroidstudio中没有allprojects?【发布时间】:2022-01-0510:13:27【问题描述】:我正在开发一个android应用程序,... 查看详情

为啥 Gradle 会运行两次测试?

】为啥Gradle会运行两次测试?【英文标题】:WhydoesGradlerunteststwice?为什么Gradle会运行两次测试?【发布时间】:2017-04-2005:49:56【问题描述】:如果我以通常的方式运行测试,一切都很好。问题是当我在gradle的帮助下运行测试时,... 查看详情

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

...一个错误,但依赖项包含在gradleroot和gradle模块配置中,为啥?【英文标题】:Ihaveanerrorbutdependenciesincludeingradlerootandgradlemoduleconfig,why?我有一个错误,但依赖项包含在gradleroot和gradle模块配置中,为什么?【发布时间】:2021-02-2410:... 查看详情

java程序员为啥学习groovy

正如Groovy对Java很多特性进行的包装优化一样,基于Groovy的HttpBuilder也包裹了HttpClient,使网络编程变得更加的方便易用,下面稍微来用一个例子看一下。寻找各种依赖的jar包有时候会让我们失去耐心,不过值得庆幸的是我们有Maven... 查看详情

java程序员为啥学习groovy

正如Groovy对Java很多特性进行的包装优化一样,基于Groovy的HttpBuilder也包裹了HttpClient,使网络编程变得更加的方便易用,下面稍微来用一个例子看一下。寻找各种依赖的jar包有时候会让我们失去耐心,不过值得庆幸的是我们有Maven... 查看详情

切换到 Gradle:为啥我必须防止自定义视图被混淆?

】切换到Gradle:为啥我必须防止自定义视图被混淆?【英文标题】:SwitchingtoGradle:whydoIhavetokeepcustomviewsfrombeingobfuscated?切换到Gradle:为什么我必须防止自定义视图被混淆?【发布时间】:2015-02-1218:18:41【问题描述】:我正在将一... 查看详情

为啥flyway迁移需要JPA依赖才能运行

】为啥flyway迁移需要JPA依赖才能运行【英文标题】:whyisJPAdependencyneededforflywaymigrationstorun为什么flyway迁移需要JPA依赖才能运行【发布时间】:2017-09-1710:07:57【问题描述】:你好,我是SpringBootgradleProject的新手。我正在尝试使用Spri... 查看详情

为啥 kotlin gradle 插件无法使用 1.8 目标构建?

】为啥kotlingradle插件无法使用1.8目标构建?【英文标题】:Whykotlingradleplugincannotbuildwith1.8target?为什么kotlingradle插件无法使用1.8目标构建?【发布时间】:2018-07-1401:38:28【问题描述】:我有一个使用intellij为kotlin1.2.10配置的最简单... 查看详情

为啥即使源代码没有变化,Gradle 的“构建”任务也不是最新的?

】为啥即使源代码没有变化,Gradle的“构建”任务也不是最新的?【英文标题】:WhyGradle\'build\'taskisnotup-to-dateeventhereisnochangeinthesourcecode?为什么即使源代码没有变化,Gradle的“构建”任务也不是最新的?【发布时间】:2016-10-2810... 查看详情

为啥在 Gradle 中不能将属性声明为输出?

】为啥在Gradle中不能将属性声明为输出?【英文标题】:WhyinGradlecan\'tdeclarepropertyasoutput?为什么在Gradle中不能将属性声明为输出?【发布时间】:2014-08-2715:49:04【问题描述】:如果我的任务更改了某些属性并且在执行两次时增量... 查看详情

为啥这个旧的依赖会使我的 gradle 崩溃?

】为啥这个旧的依赖会使我的gradle崩溃?【英文标题】:Whydoesthisolddependencycrashesmygradle?为什么这个旧的依赖会使我的gradle崩溃?【发布时间】:2022-01-1122:51:34【问题描述】:很久以前,我安装了一个软件包,它可以为我提供andro... 查看详情

为啥我的 Gradle 构建会因退出代码 137 而死?

】为啥我的Gradle构建会因退出代码137而死?【英文标题】:WhyaremyGradlebuildsdyingwithexit-code137?为什么我的Gradle构建会因退出代码137而死?【发布时间】:2016-12-2210:06:02【问题描述】:我一直在尝试编译和测试一个大型项目以使用Gra... 查看详情

为啥一个 Android Studio 项目中有两个 build.gradle 文件?

】为啥一个AndroidStudio项目中有两个build.gradle文件?【英文标题】:Whyaretheretwobuild.gradlefilesinanAndroidStudioproject?为什么一个AndroidStudio项目中有两个build.gradle文件?【发布时间】:2014-06-0803:09:41【问题描述】:将Eclipse项目导入Android... 查看详情

为啥 Gradle 不使用插件 pom.xml 中声明的 Maven 存储库?

】为啥Gradle不使用插件pom.xml中声明的Maven存储库?【英文标题】:Whydoesn\'tGradleuseMavenrepositoriesdeclaredintheplug-in\'spom.xml?为什么Gradle不使用插件pom.xml中声明的Maven存储库?【发布时间】:2019-08-1007:18:17【问题描述】:考虑一下我制... 查看详情

为啥找不到android gradle maven发布工件bundleRelease

】为啥找不到androidgradlemaven发布工件bundleRelease【英文标题】:whyandroidgradlemavenpublishartifactbundleReleasenotfound为什么找不到androidgradlemaven发布工件bundleRelease【发布时间】:2018-07-2001:16:14【问题描述】:当我同步项目时,androidstudio警... 查看详情

androidstudio为啥每次buildgradle很慢

一个很重要的原因是默认使用内存太小了,你可以设置的大一点,不超过自身内存,如下:C:\Users\你的用户名\.gradle目录下新建一个文件名为gradle.properties的文件。内容为:org.gradle.daemon=trueorg.gradle.jvmargs=-Xmx1536M给的内存... 查看详情

为啥我在构建项目时出现 Flutter gradle 错误?

】为啥我在构建项目时出现Fluttergradle错误?【英文标题】:WhyihaveFluttergradleerroronbuildingproject?为什么我在构建项目时出现Fluttergradle错误?【发布时间】:2019-04-0205:33:48【问题描述】:当我构建我的颤振项目时,我遇到以下错误... 查看详情