【问题标题】:How to make gradle download dependencies without actually building things如何在不实际构建东西的情况下制作 gradle 下载依赖项
【发布时间】:2021-08-24 21:38:25
【问题描述】:

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

有没有办法只下载依赖项以加快后续构建?

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

【问题讨论】:

  • 第一次构建后依赖在本地缓存,所以第二次构建会更快
  • 没错。但我想拥有本地缓存​​而不实际构建东西。
  • 不确定您想要完成什么。所花费的时间将是相同或另一种方式。如果您有多个构建机器,您可以考虑使用代理来管理依赖项(如 Artifactory)。否则,请参阅stackoverflow.com/questions/21814652/…
  • 另外请注意,如果你使用 gradle 4+,你应该使用 --parallel 标志,这将大大加快依赖的拉取。

标签: java gradle


【解决方案1】:

编辑:为 Gradle 6+ 更新。

一些注意事项:

  • 这种新方法将 jar 下载到一个文件夹中,然后删除该文件夹。因此,将 jars 放入 Gradle 缓存的结果是副作用。
  • 它目前使用为 main 源集配置的 jar,但可以通用化。
  • 尽管它既不高效也不优雅,但如果您确实需要 jars(和传递依赖项),它会很有用:只需注释掉 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

【讨论】:

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

我发现 ./gradlew dependencies(正如 this user 所建议的那样)对于 Docker 构建非常方便。

【讨论】:

    【解决方案3】:

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

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

    运行命令 ./gradlew downloadDependencies

    【讨论】:

      【解决方案4】:

      我的回答是支持 gradle 插件和内置任务。

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

      它是“gradle build”的小版本。

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

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

      一般来说,当我克隆一个新存储库时,我的秘诀是什么:

      -gradle 组装

      -做一些编码

      -gradle 运行(基本上测试直到完成)

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

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

      【讨论】:

        猜你喜欢
        • 2020-01-17
        • 1970-01-01
        • 2016-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-07
        • 1970-01-01
        • 2014-03-15
        相关资源
        最近更新 更多