如何让Gradle下载依赖项而不实际构建项目

27

在新环境中,gradle build需要很长时间,因为所有的依赖项都要被下载。

有没有一种方法只下载依赖项以加快后续的构建速度?

这样我们就可以预填一个CI构建环境了。


依赖项在第一次构建后会被本地缓存,因此第二次构建将更快。 - Jochen Bedersdorfer
1
没错。但我想要本地缓存,而不必实际构建东西。 - michas
不确定您想要实现什么。花费的时间无论如何都是一样的。 如果您有多个构建机器,可以考虑使用代理来管理依赖项(例如Artifactory)。否则,请参见https://dev59.com/jWEh5IYBdhLWcg3w9nlj - Jochen Bedersdorfer
1
请注意,如果您正在使用Gradle 4+,应该使用--parallel标志,这将大大加快依赖项的拉取速度。 - Justin Rhoades
为了拥有一个与 npm install 等价的“依赖项”Docker缓存层,请使用 @JochenBedersdorfer。 - Novaterata
4个回答

16

编辑:已更新至Gradle 6+。

一些注意事项:

  • 这种新方法会将JAR文件下载到一个文件夹中,然后删除该文件夹。因此,将JAR文件保存在Gradle缓存中的结果是一个副作用。
  • 它目前使用的是配置为main源集的JAR文件,但可以泛化。
  • 即使它既不高效也不优雅,但如果你确实想要获取JAR文件(和传递依赖项),那么它还是很有用的:只需注释掉删除runtime文件夹的部分。

当您需要获取JAR文件(和传递依赖项)时,此解决方案非常方便,因为您只需注释掉删除文件夹的部分即可。

考虑以下build.gradle文件(作为任意的具体示例):

apply plugin: 'java'

dependencies {
    implementation 'org.apache.commons:commons-io:1.3.2'
    implementation 'org.kie.modules:org-apache-commons-lang3:6.2.0.Beta2'
}

repositories { 
   jcenter()
}

task getDeps(type: Copy) {
    from sourceSets.main.runtimeClasspath
    into 'runtime/'

    doFirst {
        ant.delete(dir: 'runtime')
        ant.mkdir(dir: 'runtime')
    }

    doLast {
        ant.delete(dir: 'runtime')
    }
}

示例运行:

$ find /Users/measter/.gradle/caches -name "commons-io*1.3.2.jar"

$ gradle getDeps

$ find /Users/measter/.gradle/caches -name "commons-io*1.3.2.jar"
/Users/measter/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/1.3.2/[snip]/commons-io-1.3.2.jar

4
似乎只下载元信息(pom)而不是实际的jar文件(在Gradle 6中测试过)。 - Johannes Barop
我已经修改了方法并使用Gradle 6.2进行了测试。虽然不够优雅,但它确实可以使用指定的JAR文件填充Gradle缓存。 - Michael Easter
我能够在Gradle 5.6.4下使用这种方法。除了sourceSets.main.runtimeClasspath之外,我还添加了from sourceSets.test.runtimeClasspath,并将其放在build/目录下,以便clean可以删除它。这是我的getDeps任务。task getDeps(type: Copy) { from sourceSets.main.runtimeClasspath from sourceSets.test.runtimeClasspath into 'build/deps' doFirst { ant.delete(dir: 'build/deps') } } - Neon
这个解决方案会触发编译,不是很方便。 - Beloo

11
我发现./gradlew dependencies(正如此用户所建议的)在Docker构建中非常有用。

6

您可以创建一个自定义任务来解决所有配置(这样做,它也会下载依赖项而不构建项目)。

task downloadDependencies { 
   doLast { 
       configurations.findAll{it.canBeResolved}.each{it.resolve()}
   }
}

运行命令 ./gradlew downloadDependencies

0

我的回答会偏向于gradle插件和内置任务。

我会在命令行中使用“gradle assemble”。

这是“gradle build”的一个次要版本。

这样,您可以减少运行或构建任何东西之前的准备时间。

请查看以下链接以获取文档: https://docs.gradle.org/current/userguide/java_plugin.html#lifecycle_tasks

一般来说,当我克隆一个新的存储库时,我的步骤如下:

-gradle assemble

-进行一些编码

-gradle run(并基本测试直到完成)

-gradle build(制作可分发文件)

注意:此最后一步可能有额外的配置用于.jar文件作为输出(这取决于你)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接