Performance 将一个非常大的Gradle项目与许多子项目分开以使Gradle构建更快、IntelliJ Gradle刷新更快的指南
我有一个相当大的git项目,我有一个定义子项目的大型单build.gradle。。在最初的几年里。。。没问题。在最初几年之后,由于子项目的数量,Gradle命令行配置步骤变得有点慢 例如,当我运行gradle命令时,我会在以下位置看到暂停:Performance 将一个非常大的Gradle项目与许多子项目分开以使Gradle构建更快、IntelliJ Gradle刷新更快的指南,performance,intellij-idea,gradle,Performance,Intellij Idea,Gradle,我有一个相当大的git项目,我有一个定义子项目的大型单build.gradle。。在最初的几年里。。。没问题。在最初几年之后,由于子项目的数量,Gradle命令行配置步骤变得有点慢 例如,当我运行gradle命令时,我会在以下位置看到暂停: >配置>0/77项目> 每增加一个项目,暂停的时间就越长 另一个大问题是,当我导入项目或使用intelliJ刷新gradle deps时,“分析依赖项”会花费很长时间,这实际上会延迟开发,因为每次同步依赖项时,我们都需要相当长的等待时间 在这个领域,人们通常
>配置>0/77项目>
每增加一个项目,暂停的时间就越长
另一个大问题是,当我导入项目或使用intelliJ刷新gradle deps时,“分析依赖项”会花费很长时间,这实际上会延迟开发,因为每次同步依赖项时,我们都需要相当长的等待时间
在这个领域,人们通常做什么来通过考试?我不得不吃了延迟,这是痛苦的
人们是否通常将build.gradle文件分割成不相关的块,以便获得多项目构建的网络?还是应该有一种方法让它不那么慢
- 我已经分析了依赖关系,实际上都很简单
- Ondemand、守护进程和并行部署以某种有限的方式进行
还有什么别的把戏?我的计划是将代码的主要部分分为多个部分,并独立加载它们,这样gradle命令和intelliJ刷新会更小,以便于进行最新的检查和配置设置。如果我们不必因为子项目的限制而拆分build.gradle文件,那就太好了。在我们对您的问题的评论中进行讨论之后,很明显,您不想通过将一些接口JAR发布到存储库来删除一些子项目 有鉴于此,这里有一些建议。我知道您已经尝试了其中的一些,但这里有一些您在上面没有提到的可能会对您有所帮助: 仿形和试运行 首先,尝试使用以下命令:
./gradlew {task} --dry-run --profile
这将执行名为{task}
的任务的试运行,并在$buildDir/reports/profile
下创建一个配置文件html文件。您可以使用它来查看哪些任务在整合、依赖项解析和任务执行过程中占用了大部分时间。如果你能看到一项任务花费了特别长的时间,看看它,看看你是否能减少该任务中发生的事情
按需配置
要减少配置时间,请尝试在gradle.properties
文件中启用,如下所示:
org.gradle.configureondemand=true
这意味着gradle将尝试只配置运行任务所需的必要项目,而不是配置所有内容
使用gradle守护进程
是一个后台进程,当gradle任务完成时不会退出,并且可以重用。这限制了每次构建时启动新的gradle jvm进程的开销。要激活gradle守护程序,请将以下行添加到gradle.properties
文件中:
org.gradle.daemon=true
project('functional-tests') {
test {
onlyIf {
project.hasProperty("functionalTests")
}
}
使用Gradle和Java的最新版本
有些事情很简单,升级gradle版本可以提高速度。如果您没有升级一段时间,或者正在使用一个相当旧的版本,请考虑升级。升级初期可能会有一些痛苦,但从长远来看是值得的。这同样适用于升级java版本。显然,由于其他限制,这并不总是可能的,但是请尝试使用最新的java版本
避免使用动态依赖项
Gradle允许您为项目能够使用的依赖项指定范围,如下所示:
dependencies {
compile "commons-lang:commons-lang:2.+"
}
这意味着gradle将始终尝试查找与约束匹配的依赖项的最新版本。这种灵活性是以性能为代价的,因为gradle必须在线检查要使用的版本。出于这个原因,以及其他一些我在这里不讨论的原因,明确指定依赖项的版本是一个好主意
并行化构建
这允许并行构建不相关的子项目,从而加快构建过程。要启用此功能,请在gradle.properties
中设置以下内容:
org.gradle.parallel=true
忽略不相关的任务
假设您想进行构建,但不一定要再次运行所有测试。您可以运行以下任务,但测试任务将不会运行。这会显著增加构建时间:
./gradlew build -x test
编辑——经过进一步的研究,在发现之后,我有了进一步的建议
使用属性禁用部分生成
如链接问题所示,如果您有一个项目,并且只想在某些情况下运行功能测试,则可以将以下内容添加到根build.gradle
文件中:
org.gradle.daemon=true
project('functional-tests') {
test {
onlyIf {
project.hasProperty("functionalTests")
}
}
}
这意味着仅当您运行以下任务时,才会运行功能测试:
./gradlew test -PfunctionalTests
禁用settings.gradle中的某些子项目
您还可以在设置.gradle
中禁用某些子项目,如下所示:
if (someBoolean) {
include 'functional-tests'
}
有很多外部依赖关系吗?您的子项目是否相互依赖?如果是这样,您是否将它们作为项目依赖项或对生成的工件的依赖项引用?@BenGreen第三方依赖项的数量是合理的。是的,我们有内在的依赖。我们使用子项目是因为我们不想进入mavenPublish世界。那么,您是否要将这些项目JAR构建到外部存储库中?不。这都是gradle缓存。嗯,要避免这种情况可能相当棘手。我们打算建议为所有领域的东西建立一个单独的项目,这个项目不会有太大的变化,但是如果每个人都必须在本地构建一个最新版本,那么你就会遇到问题。将有一个想法。如何使用“启用和禁用”子项目