作者:_雁火漫天_ | 来源:互联网 | 2023-02-10 06:57
如何解决《将一个非常大的Gradle项目与大量子项目分开的指南,使GradleBuildFaster和IntelliJGradleRefresh更快》经验,为你挑选了1个好方法。
我有一个非常大的git项目,我有一个大的单个build.gradle定义子项目..在最初的几年......没问题.在最初几年之后,由于子项目的数量,它在Gradle命令行配置步骤中变得缓慢.
例如,当我运行gradle命令时,我看到暂停:
> Configuring > 0/77 projects >
...
每个项目添加似乎都会暂停.
另一个大问题是当我去导入项目或使用intelliJ刷新gradle deps时,"分析依赖关系"需要很长时间才能真正延迟开发,因为我们需要在每次同步依赖项时都有相当大的等待.
人们通常会在这个领域做些什么来通过这个?我不得不吃掉那种痛苦的延迟.
人们通常会将build.gradle文件拆分为不相关的块,以便您获得多项目构建的网络吗?或者应该有办法让那不是那么慢?
我已经分析了依赖关系,实际上非常简单.
按需,守护进程和并行部署以某种有限的方式发生.
但同样的问题是......
还有其他什么技巧?我的计划是将我的代码的主要部分分开并单独加载它们,以便gradle命令和intelliJ刷新是较小的UP-TO-DATE检查和配置设置.如果我们不必因为子项目限制而拆分build.gradle文件,那就太好了.
1> Ben Green..:
在我们对您的问题的评论进行讨论之后,很明显您不希望沿着将某些接口jar发布到存储库以删除某些子项目的路线.
鉴于此,这里有一些建议.我知道你已经尝试了其中的一些,但是这里有一些你上面没有提到的可能会对你有所帮助:
分析和干运行
首先,尝试使用以下命令:
./gradlew {task} --dry-run --profile
这将使用名称执行任务的干运行{task}
并在其下创建配置文件html文件$buildDir/reports/profile
.您可以使用它来查看哪些任务占用了大部分时间,而不是通过配置,依赖项解析和任务执行.如果您可以看到一项任务需要花费很长时间,请查看它并查看是否可以减少该任务中发生的事情.
按需配置
要减少配置时间,请尝试在文件中启用按需配置,gradle.properties
如下所示:
org.gradle.cOnfigureondemand=true
这意味着gradle将尝试仅配置运行任务所需的必要项目,而不是配置所有内容.
使用gradle守护程序
gradle守护程序是一个后台进程,当您的gradle任务完成时它不会退出,并且可以重复使用.这限制了每次构建时启动新gradle jvm进程的开销.要激活gradle守护程序,请将以下行添加到您的gradle.properties
文件中:
org.gradle.daemon=true
使用最新版本的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
文件中:
project('functional-tests') {
test {
onlyIf {
project.hasProperty("functionalTests")
}
}
}
这意味着只有在运行如下任务时才会运行功能测试:
./gradlew test -PfunctionalTests
禁用settings.gradle中的某些子项目
您也可以禁用某些子项目,如下settings.gradle
所示:
if (someBoolean) {
include 'functional-tests'
}