只有build.gradle文件,如何下载依赖?

5

是否可能仅使用build.gradle文件下载gradle依赖项?

我的目标是以下内容:

我有一组单元测试,我想在Docker容器中执行它们(作为CI过程的一部分)。最初,我使用来自docker hub的openjdk:8-jdk映像作为我的测试基础映像。因此,docker compose文件包含以下内容:

version: '3.2'

services:

  unit:
    image: openjdk:8-jdk
    volumes:
      - ..:/usr/test
    working_dir: /usr/test
    command: sh -c "exec ./gradlew junitPlatformTest -Punit -p moduleA/"

整个项目都安装在容器内的/usr/test目录上。当容器启动时,它会针对moduleA执行junitPlatformTest任务。使用openjdk:8-jdk镜像的问题是每次运行unit服务时都会下载Gradle及其依赖项。
为了解决这个问题,我决定创建一个新的镜像,其中包含已下载Gradle和项目依赖项。以下是Dockerfile的代码:
FROM openjdk:8-jdk
COPY . /usr/test
WORKDIR /usr/test
RUN apt-get -y install wget unzip
RUN wget https://services.gradle.org/distributions/gradle-4.1-bin.zip
RUN mkdir /opt/gradle
RUN unzip -d /opt/gradle gradle-4.1-bin.zip
RUN /opt/gradle/gradle-4.1/bin/gradle dependencies

build.gradle文件位于与Dockerfile相同的文件夹中,因此命令COPY . /usr/test会将其复制到工作目录中。

然而,执行gradle dependencies命令不会下载库。在构建完镜像后,运行容器并进入其中(使用docker exec),似乎~/.gradle/caches/modules-2/files-2.1/目录只包含pom文件,而不是jar文件。

我不确定gradle dependencies是否是正确的命令。有什么建议吗?

编辑 - Gradle文件

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    jcenter()
}

ext.versions = new Properties()
file("./versions.properties").withInputStream {
    stream -> ext.versions.load(stream)
}

dependencies {
    testCompile("org.junit.jupiter:junit-jupiter-api:$versions.junitJupiterVersion")
    testCompile("org.junit.jupiter:junit-jupiter-engine:$versions.junitJupiterVersion")
    testCompile("org.junit.jupiter:junit-jupiter-params:$versions.junitJupiterVersion")
    testCompile("org.mockito:mockito-core:'$versions.mockitoCore")
    testCompile("org.junit.platform:junit-platform-launcher:1.0.0-RC3")

    compile("com.google.inject:guice:$versions.guice")
    ....
}

你能提供你的Gradle文件吗? - yamenk
请在您的问题中分享gradle文件。 - Tarun Lalwani
@yamenk,Tarun Lalwani 添加了 Gradle 文件。 - chaliasos
@Schaliasos,看看我的回答。 - Tarun Lalwani
2个回答

3
请将以下内容添加到您的gradle文件中:
 task download (type: Exec) {
     configurations.testCompile.files
     commandLine 'echo', 'Downloaded all dependencies'

  }

同时更改

RUN /opt/gradle/gradle-4.1/bin/gradle dependencies

为了

RUN /opt/gradle/gradle-4.1/bin/gradle

这将在您运行gradle命令时将所有依赖项缓存到~/.gradle。它将下载jar文件,而不仅仅是pom文件。如果您想进一步缓存,甚至可以为gradle文件夹使用命名卷。
version: '3.2'

services:

  unit:
    image: openjdk:8-jdk
    volumes:
      - ..:/usr/test
      - gradlecache:/root/.gradle/
    working_dir: /usr/test
    command: sh -c "exec ./gradlew junitPlatformTest -Punit -p moduleA/"
volumes:
  gradlecache: {}

-1

你的想法是正确的,但方法不对。首先,没有必要手动下载和安装Gradle,这正是Gradle Wrapper为您做的事情。其次,没有必要破解Gradle以强制下载依赖项 - 这毫无意义。只需从容器内部检出/克隆测试项目,并使用./gradlew clean test运行测试即可。不需要本地/usr/test目录,因为它使用相对位置,所以仅在您以确切方式布置文件时才起作用,这与CI相悖。

编辑: 如果您不想为每个构建下载Gradle或依赖项,则可以通过卷映射将$HOME/.m2目录映射到主机来启动容器,以便一旦下载依赖项就会留在Maven本地缓存中。为了避免下载Gradle,您可以构建自己的Docker镜像,并将Gradle放入其中。


2
如果我理解他的意思正确,他不想为每个新容器安装下载所有内容(包括包装器和依赖项)。 - Lukas Körfer
1
你不想复制到$HOME/.m2,因为这样会掩盖与错误仓库或本地缓存的jar有关的问题。其他用户可能无法以这种方式重复您的构建。它也会相对较慢(每次构建都需要重新检查校验和,并且将被使用Maven缓存的其他项目更新)。 - jkinkead
@jkinkead 没有人提到复制 $HOME/.m2,请再次阅读我的回复。 - Abhijit Sarkar
1
抱歉,您说要在其中进行映射,但这会出现与可重复性相同的问题。它没有复制所具有的缓慢启动问题。 - jkinkead
1
在 Dockerfile 中单独下载依赖项非常有用,因为它可以有效地重用层缓存。海报没有明确表达这一点,但我想这就是他们试图做的。如果您想要可重复生成的构建,则挂载主机目录并不理想。 - Vlad A. Ionescu

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